Merge "[freetype] Build freetype2 as a shared library."
diff --git a/.gitignore b/.gitignore
index b5db9d8..a47f568 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
 config.mk
 objs/vc2010/
+build
diff --git a/.mailmap b/.mailmap
index a3c5f94..c406e23 100644
--- a/.mailmap
+++ b/.mailmap
@@ -5,3 +5,5 @@
 Suzuki, Toshiya (鈴木俊哉) <mpsuzuki@hiroshima-u.ac.jp> <sssa@flavor1.ipc.hiroshima-u.ac.jp>
 Suzuki, Toshiya (鈴木俊哉) <mpsuzuki@hiroshima-u.ac.jp> sssa <sssa@IPA2004-mps.local>
 Suzuki, Toshiya (鈴木俊哉) <mpsuzuki@hiroshima-u.ac.jp> suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+Ben Wagner <bungeman@gmail.com> Bungeman <bungeman@gmail.com>
+Ewald Hew (Hew Yih Shiuan 丘毅宣) <ewaldhew@gmail.com>
diff --git a/BUILD.gn b/BUILD.gn
index a16e06b..af6c1e5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -30,6 +30,15 @@
   include_dirs = [
     "include",
   ]
+
+  cflags = []
+
+  if (is_clang) {
+    cflags += [
+      "-Wno-unused-function",
+      "-Wno-unused-variable",
+    ]
+  }
 }
 
 #TODO(mikejurka): Remove once we've migrated to the freetype2 target everywhere
@@ -54,12 +63,10 @@
     "src/base/ftbase.c",
     "src/base/ftbbox.c",
     "src/base/ftbitmap.c",
-    "src/base/ftfntfmt.c",
     "src/base/ftfstype.c",
     "src/base/ftgasp.c",
     "src/base/ftglyph.c",
     "src/base/ftinit.c",
-    "src/base/ftlcdfil.c",
     "src/base/ftmm.c",
     "src/base/ftstroke.c",
     "src/base/ftsystem.c",
@@ -92,6 +99,8 @@
     # Long directory name to avoid accidentally using wrong headers.
     "FT_CONFIG_MODULES_H=<freetype-fuchsia-config/ftmodule.h>",
     "FT_CONFIG_OPTIONS_H=<freetype-fuchsia-config/ftoption.h>",
+    # Reduce visibility of symbols.
+    "FT_EXPORT(x)=x",
   ]
 
   if (shared_lib) {
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6631fde..ad8ded0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,9 @@
 # CMakeLists.txt
 #
-# Copyright 2013-2015 by
+# Copyright 2013-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
-# Written by John Cary <cary@txcorp.com>
+# Written originally by John Cary <cary@txcorp.com>
 #
 # This file is part of the FreeType project, and may only be used, modified,
 # and distributed under the terms of the FreeType project license,
@@ -12,45 +12,84 @@
 # fully.
 #
 #
-# Say
+# The following will 1. create a build directory and 2. change into it and
+# call cmake to configure the build with default parameters as a static
+# library.
 #
-#   cmake CMakeLists.txt
-#
-# to create a Makefile that builds a static version of the library.
+#   cmake -E make_directory build
+#   cmake -E chdir build cmake ..
 #
 # For a dynamic library, use
 #
-#   cmake CMakeLists.txt -DBUILD_SHARED_LIBS:BOOL=true
+#   cmake -E chdir build cmake -D BUILD_SHARED_LIBS:BOOL=true ..
 #
 # For a framework on OS X, use
 #
-#   cmake CMakeLists.txt -DBUILD_FRAMEWORK:BOOL=true -G Xcode
-#
-# instead.
+#   cmake -E chdir build cmake -G Xcode -D BUILD_FRAMEWORK:BOOL=true ..
 #
 # For an iOS static library, use
 #
-#   cmake CMakeLists.txt -DIOS_PLATFORM=OS -G Xcode
+#   cmake -E chdir build cmake -G Xcode -D IOS_PLATFORM=OS ..
 #
 # or
 #
-#   cmake CMakeLists.txt -DIOS_PLATFORM=SIMULATOR -G Xcode
+#   cmake -E chdir build cmake -G Xcode -D IOS_PLATFORM=SIMULATOR ..
+#
+# Finally, build the project with:
+#
+#   cmake --build build
+#
+# Install it with
+#
+#   (sudo) cmake --build build --target install
+#
+# A binary distribution can be made with
+#
+#   cmake --build build --config Release --target package
 #
 # Please refer to the cmake manual for further options, in particular, how
 # to modify compilation and linking parameters.
 #
 # Some notes.
 #
-# . `cmake' will overwrite FreeType's original (top-level) `Makefile' file.
+# . `cmake' creates configuration files in
+#
+#     <build-directory>/include/freetype/config
+#
+#   which should be further modified if necessary.
 #
 # . You can use `cmake' directly on a freshly cloned FreeType git
 #   repository.
 #
-# . `CMakeLists.txt'  is provided as-is since it is not used by the
+# . `CMakeLists.txt' is provided as-is since it is normally not used by the
 #   developer team.
+#
+# . Set the `FT_WITH_ZLIB', `FT_WITH_BZIP2', `FT_WITH_PNG', and
+#   `FT_WITH_HARFBUZZ' CMake variables to `ON' to force using a dependency.
+#   Leave a variable undefined (which is the default) to use the dependency
+#   only if it is available.  Set `CMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE' to
+#   disable a dependency completely (CMake package name, so `BZip2' instead of
+#   `BZIP2'). Example:
+#
+#     cmake -DFT_WITH_ZLIB=ON -DCMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE [...]
+#
+# . Installation of FreeType can be controlled with the CMake variables
+#   `SKIP_INSTALL_HEADERS', `SKIP_INSTALL_LIBRARIES', and `SKIP_INSTALL_ALL'
+#   (this is compatible with the same CMake variables in zlib's CMake
+#   support).
 
+# FreeType explicitly marks the API to be exported and relies on the compiler
+# to hide all other symbols. CMake supports a C_VISBILITY_PRESET property
+# starting with 2.8.12.
+cmake_minimum_required(VERSION 2.8.12)
 
-cmake_minimum_required(VERSION 2.6)
+if (NOT CMAKE_VERSION VERSION_LESS 3.3)
+  # Allow symbol visibility settings also on static libraries. CMake < 3.3
+  # only sets the propery on a shared library build.
+  cmake_policy(SET CMP0063 NEW)
+endif ()
+
+include(CheckIncludeFile)
 
 # CMAKE_TOOLCHAIN_FILE must be set before `project' is called, which
 # configures the base build environment and references the toolchain file
@@ -78,7 +117,7 @@
     set(BUILD_SHARED_LIBS OFF)
 
     set(CMAKE_TOOLCHAIN_FILE
-      ${PROJECT_SOURCE_DIR}/builds/cmake/iOS.cmake)
+      ${CMAKE_SOURCE_DIR}/builds/cmake/iOS.cmake)
   endif ()
 else ()
   if (DEFINED IOS_PLATFORM)
@@ -86,7 +125,49 @@
   endif ()
 endif ()
 
-project(freetype)
+
+project(freetype C)
+
+set(VERSION_MAJOR "2")
+set(VERSION_MINOR "9")
+set(VERSION_PATCH "1")
+
+# SOVERSION scheme: CURRENT.AGE.REVISION
+#   If there was an incompatible interface change:
+#     Increment CURRENT. Set AGE and REVISION to 0
+#   If there was a compatible interface change:
+#     Increment AGE. Set REVISION to 0
+#   If the source code was changed, but there were no interface changes:
+#     Increment REVISION.
+set(LIBRARY_VERSION "6.16.0")
+set(LIBRARY_SOVERSION "6")
+
+# These options mean "require x and complain if not found". They'll get
+# optionally found anyway. Use `-DCMAKE_DISABLE_FIND_PACKAGE_x=TRUE` to disable
+# searching for a packge entirely (x is the CMake package name, so "BZip2"
+# instead of "BZIP2").
+option(FT_WITH_ZLIB "Use system zlib instead of internal library." OFF)
+option(FT_WITH_BZIP2 "Support bzip2 compressed fonts." OFF)
+option(FT_WITH_PNG "Support PNG compressed OpenType embedded bitmaps." OFF)
+option(FT_WITH_HARFBUZZ "Improve auto-hinting of OpenType fonts." OFF)
+
+
+# Disallow in-source builds
+if ("${PROJECT_BINARY_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}")
+  message(FATAL_ERROR
+    "In-source builds are not permitted!  Make a separate folder for"
+    " building, e.g.,\n"
+    "  cmake -E make_directory build\n"
+    "  cmake -E chdir build cmake ..\n"
+    "Before that, remove the files created by this failed run with\n"
+    "  cmake -E remove CMakeCache.txt\n"
+    "  cmake -E remove_directory CMakeFiles")
+endif ()
+
+
+# Add local cmake modules
+list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/builds/cmake)
+
 
 if (BUILD_FRAMEWORK)
   if (NOT "${CMAKE_GENERATOR}" STREQUAL "Xcode")
@@ -97,67 +178,114 @@
   set(BUILD_SHARED_LIBS ON)
 endif ()
 
-set(VERSION_MAJOR "2")
-set(VERSION_MINOR "6")
-set(VERSION_PATCH "0")
-set(PROJECT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
 
-# Compiler definitions for building the library
-add_definitions(-DFT2_BUILD_LIBRARY)
+# Find dependencies
+if (FT_WITH_HARFBUZZ)
+  find_package(HarfBuzz 1.3.0 REQUIRED)
+else ()
+  find_package(HarfBuzz 1.3.0)
+endif ()
 
-# Specify library include directories
-include_directories("${PROJECT_SOURCE_DIR}/include")
+if (FT_WITH_PNG)
+  find_package(PNG REQUIRED)
+else ()
+  find_package(PNG)
+endif ()
+
+if (FT_WITH_ZLIB)
+  find_package(ZLIB REQUIRED)
+else ()
+  find_package(ZLIB)
+endif ()
+
+if (FT_WITH_BZIP2)
+  find_package(BZip2 REQUIRED)
+else ()
+  find_package(BZip2)
+endif ()
 
 # Create the configuration file
-message(STATUS "Creating directory, ${PROJECT_BINARY_DIR}/include/freetype2.")
-file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/include/freetype2)
+if (UNIX)
+  check_include_file("unistd.h" HAVE_UNISTD_H)
+  check_include_file("fcntl.h" HAVE_FCNTL_H)
+  check_include_file("stdint.h" HAVE_STDINT_H)
 
-# For the auto-generated ftconfig.h file
-include_directories(BEFORE "${PROJECT_BINARY_DIR}/include/freetype2")
-message(STATUS "Creating ${PROJECT_BINARY_DIR}/include/freetype2/ftconfig.h.")
-execute_process(
-  COMMAND sed -e "s/FT_CONFIG_OPTIONS_H/<ftoption.h>/" -e "s/FT_CONFIG_STANDARD_LIBRARY_H/<ftstdlib.h>/" -e "s?/undef ?#undef ?"
-  INPUT_FILE ${PROJECT_SOURCE_DIR}/builds/unix/ftconfig.in
-  OUTPUT_FILE ${PROJECT_BINARY_DIR}/include/freetype2/ftconfig.h
-)
+  file(READ "${PROJECT_SOURCE_DIR}/builds/unix/ftconfig.in"
+    FTCONFIG_H)
+  if (HAVE_UNISTD_H)
+    string(REGEX REPLACE
+      "#undef +(HAVE_UNISTD_H)" "#define \\1 1"
+      FTCONFIG_H "${FTCONFIG_H}")
+  endif ()
+  if (HAVE_FCNTL_H)
+    string(REGEX REPLACE
+      "#undef +(HAVE_FCNTL_H)" "#define \\1 1"
+      FTCONFIG_H "${FTCONFIG_H}")
+  endif ()
+  if (HAVE_STDINT_H)
+    string(REGEX REPLACE
+      "#undef +(HAVE_STDINT_H)" "#define \\1 1"
+      FTCONFIG_H "${FTCONFIG_H}")
+  endif ()
+  string(REPLACE "/undef " "#undef "
+    FTCONFIG_H "${FTCONFIG_H}")
+  file(WRITE "${PROJECT_BINARY_DIR}/include/freetype/config/ftconfig.h"
+    "${FTCONFIG_H}")
+endif ()
 
-file(GLOB PUBLIC_HEADERS "include/*.h")
-file(GLOB PUBLIC_CONFIG_HEADERS "include/config/*.h")
-file(GLOB PRIVATE_HEADERS "include/internal/*.h")
+
+# Create the options file
+file(READ "${PROJECT_SOURCE_DIR}/include/freetype/config/ftoption.h"
+  FTOPTION_H)
+if (ZLIB_FOUND)
+  string(REGEX REPLACE
+    "/\\* +(#define +FT_CONFIG_OPTION_SYSTEM_ZLIB) +\\*/" "\\1"
+    FTOPTION_H "${FTOPTION_H}")
+endif ()
+if (BZIP2_FOUND)
+  string(REGEX REPLACE
+    "/\\* +(#define +FT_CONFIG_OPTION_USE_BZIP2) +\\*/" "\\1"
+    FTOPTION_H "${FTOPTION_H}")
+endif ()
+if (PNG_FOUND)
+  string(REGEX REPLACE
+    "/\\* +(#define +FT_CONFIG_OPTION_USE_PNG) +\\*/" "\\1"
+    FTOPTION_H "${FTOPTION_H}")
+endif ()
+if (HARFBUZZ_FOUND)
+  string(REGEX REPLACE
+    "/\\* +(#define +FT_CONFIG_OPTION_USE_HARFBUZZ) +\\*/" "\\1"
+    FTOPTION_H "${FTOPTION_H}")
+endif ()
+file(WRITE "${PROJECT_BINARY_DIR}/include/freetype/config/ftoption.h"
+  "${FTOPTION_H}")
+
+
+file(GLOB PUBLIC_HEADERS "include/ft2build.h" "include/freetype/*.h")
+file(GLOB PUBLIC_CONFIG_HEADERS "include/freetype/config/*.h")
+file(GLOB PRIVATE_HEADERS "include/freetype/internal/*.h")
+
 
 set(BASE_SRCS
   src/autofit/autofit.c
-  src/base/ftadvanc.c
+  src/base/ftbase.c
   src/base/ftbbox.c
   src/base/ftbdf.c
   src/base/ftbitmap.c
-  src/base/ftcalc.c
   src/base/ftcid.c
-  src/base/ftdbgmem.c
-  src/base/ftdebug.c
-  src/base/ftfntfmt.c
   src/base/ftfstype.c
   src/base/ftgasp.c
-  src/base/ftgloadr.c
   src/base/ftglyph.c
   src/base/ftgxval.c
   src/base/ftinit.c
-  src/base/ftlcdfil.c
   src/base/ftmm.c
-  src/base/ftobjs.c
   src/base/ftotval.c
-  src/base/ftoutln.c
   src/base/ftpatent.c
   src/base/ftpfr.c
-  src/base/ftrfork.c
-  src/base/ftsnames.c
-  src/base/ftstream.c
   src/base/ftstroke.c
   src/base/ftsynth.c
   src/base/ftsystem.c
-  src/base/fttrigon.c
   src/base/fttype1.c
-  src/base/ftutil.c
   src/base/ftwinfnt.c
   src/bdf/bdf.c
   src/bzip2/ftbzip2.c
@@ -170,7 +298,7 @@
   src/pfr/pfr.c
   src/psaux/psaux.c
   src/pshinter/pshinter.c
-  src/psnames/psmodule.c
+  src/psnames/psnames.c
   src/raster/raster.c
   src/sfnt/sfnt.c
   src/smooth/smooth.c
@@ -180,21 +308,26 @@
   src/winfonts/winfnt.c
 )
 
-include_directories("src/truetype")
-include_directories("src/sfnt")
-include_directories("src/autofit")
-include_directories("src/smooth")
-include_directories("src/raster")
-include_directories("src/psaux")
-include_directories("src/psnames")
+if (WIN32)
+  enable_language(RC)
+  list(APPEND BASE_SRCS builds/windows/ftdebug.c
+                        src/base/ftver.rc)
+elseif (WINCE)
+  list(APPEND BASE_SRCS builds/wince/ftdebug.c)
+else ()
+  list(APPEND BASE_SRCS src/base/ftdebug.c)
+endif ()
 
 if (BUILD_FRAMEWORK)
-  set(BASE_SRCS
-    ${BASE_SRCS}
-    builds/mac/freetype-Info.plist
-  )
+  list(APPEND BASE_SRCS builds/mac/freetype-Info.plist)
 endif ()
 
+
+if (NOT DISABLE_FORCE_DEBUG_POSTFIX)
+  set(CMAKE_DEBUG_POSTFIX d)
+endif()
+
+
 add_library(freetype
   ${PUBLIC_HEADERS}
   ${PUBLIC_CONFIG_HEADERS}
@@ -202,6 +335,36 @@
   ${BASE_SRCS}
 )
 
+set_target_properties(
+  freetype PROPERTIES
+    C_VISIBILITY_PRESET hidden)
+
+target_compile_definitions(
+  freetype PRIVATE FT2_BUILD_LIBRARY)
+
+if (WIN32)
+  target_compile_definitions(
+    freetype PRIVATE _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS)
+endif ()
+
+if (BUILD_SHARED_LIBS)
+  set_target_properties(freetype PROPERTIES
+    VERSION ${LIBRARY_VERSION}
+    SOVERSION ${LIBRARY_SOVERSION})
+endif ()
+
+target_include_directories(
+  freetype BEFORE  # Pick up ftconfig.h and ftoption.h generated above.
+    PRIVATE "${PROJECT_BINARY_DIR}/include")
+
+target_include_directories(
+  freetype
+    PRIVATE "${PROJECT_SOURCE_DIR}/include")
+
+target_include_directories(
+  freetype
+    PUBLIC $<INSTALL_INTERFACE:include/freetype2>)
+
 if (BUILD_FRAMEWORK)
   set_property(SOURCE ${PUBLIC_CONFIG_HEADERS}
     PROPERTY MACOSX_PACKAGE_LOCATION Headers/config
@@ -214,40 +377,121 @@
   )
 endif ()
 
-# Installations
-# Note the trailing slash in the argument to the `DIRECTORY' directive
-install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/
-  DESTINATION include/freetype2
-  PATTERN "internal" EXCLUDE
-)
-install(TARGETS freetype
-  RUNTIME DESTINATION bin
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib
-  FRAMEWORK DESTINATION Library/Frameworks
-)
+
+set(PKG_CONFIG_REQUIRED_PRIVATE "")
+
+if (ZLIB_FOUND)
+  target_link_libraries(freetype PRIVATE ${ZLIB_LIBRARIES})
+  target_include_directories(freetype PRIVATE ${ZLIB_INCLUDE_DIRS})
+  list(APPEND PKG_CONFIG_REQUIRED_PRIVATE zlib)
+endif ()
+if (BZIP2_FOUND)
+  target_link_libraries(freetype PRIVATE ${BZIP2_LIBRARIES})
+  target_include_directories(freetype PRIVATE ${BZIP2_INCLUDE_DIR}) # not BZIP2_INCLUDE_DIRS
+  list(APPEND PKG_CONFIG_REQUIRED_PRIVATE bzip2)
+endif ()
+if (PNG_FOUND)
+  target_link_libraries(freetype PRIVATE ${PNG_LIBRARIES})
+  target_compile_definitions(freetype PRIVATE ${PNG_DEFINITIONS})
+  target_include_directories(freetype PRIVATE ${PNG_INCLUDE_DIRS})
+  list(APPEND PKG_CONFIG_REQUIRED_PRIVATE libpng)
+endif ()
+if (HARFBUZZ_FOUND)
+  target_link_libraries(freetype PRIVATE ${HARFBUZZ_LIBRARIES})
+  target_include_directories(freetype PRIVATE ${HARFBUZZ_INCLUDE_DIRS})
+  list(APPEND PKG_CONFIG_REQUIRED_PRIVATE harfbuzz)
+endif ()
+
+
+# Installation
+include(GNUInstallDirs)
+
+if (NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)
+  install(
+    # Note the trailing slash in the argument to `DIRECTORY'!
+    DIRECTORY ${PROJECT_SOURCE_DIR}/include/
+      DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freetype2
+      COMPONENT headers
+      PATTERN "internal" EXCLUDE
+      PATTERN "ftconfig.h" EXCLUDE
+      PATTERN "ftoption.h" EXCLUDE)
+  install(
+    FILES ${PROJECT_BINARY_DIR}/include/freetype/config/ftconfig.h
+          ${PROJECT_BINARY_DIR}/include/freetype/config/ftoption.h
+      DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/freetype2/freetype/config
+      COMPONENT headers)
+endif ()
+
+if (NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)
+  # Generate the pkg-config file
+  if (UNIX)
+    file(READ ${PROJECT_SOURCE_DIR}/builds/unix/freetype2.in FREETYPE2_PC_IN)
+
+    string(REPLACE ";" ", " PKG_CONFIG_REQUIRED_PRIVATE "${PKG_CONFIG_REQUIRED_PRIVATE}")
+
+    string(REPLACE "%prefix%" ${CMAKE_INSTALL_PREFIX}
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%exec_prefix%" "\${prefix}"
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%libdir%" "\${prefix}/${CMAKE_INSTALL_LIBDIR}"
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%includedir%" "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}"
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%ft_version%" "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}"
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%REQUIRES_PRIVATE%" "${PKG_CONFIG_REQUIRED_PRIVATE}"
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+    string(REPLACE "%LIBS_PRIVATE%" ""  # All libs support pkg-config
+           FREETYPE2_PC_IN ${FREETYPE2_PC_IN})
+
+    file(WRITE ${PROJECT_BINARY_DIR}/freetype2.pc ${FREETYPE2_PC_IN})
+
+    install(
+      FILES ${PROJECT_BINARY_DIR}/freetype2.pc
+      DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
+      COMPONENT pkgconfig)
+  endif ()
+
+  install(
+    TARGETS freetype
+      EXPORT freetype-targets
+      LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+      FRAMEWORK DESTINATION Library/Frameworks
+      COMPONENT libraries)
+  install(
+    EXPORT freetype-targets
+      DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/freetype
+      FILE freetype-config.cmake
+      COMPONENT headers)
+endif ()
+
 
 # Packaging
-# CPack version numbers for release tarball name.
+set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "The FreeType font rendering library.")
+set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/docs/LICENSE.TXT")
+
 set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
 set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
-set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}})
-if (NOT DEFINED CPACK_PACKAGE_DESCRIPTION_SUMMARY)
-  set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${CMAKE_PROJECT_NAME}")
-endif ()
-if (NOT DEFINED CPACK_SOURCE_PACKAGE_FILE_NAME)
-  set(CPACK_SOURCE_PACKAGE_FILE_NAME
-    "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}-r${PROJECT_REV}"
-    CACHE INTERNAL "tarball basename"
-  )
-endif ()
-set(CPACK_SOURCE_GENERATOR TGZ)
-set(CPACK_SOURCE_IGNORE_FILES
-  "/CVS/;/.svn/;.swp$;.#;/#;/build/;/serial/;/ser/;/parallel/;/par/;~;/preconfig.out;/autom4te.cache/;/.config")
-set(CPACK_GENERATOR TGZ)
+set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
+set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
+
+if (WIN32)
+  set(CPACK_GENERATOR ZIP)
+else()
+  set(CPACK_GENERATOR TGZ)
+endif()
+
+set(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME "Libraries")
+set(CPACK_COMPONENT_HEADERS_DISPLAY_NAME "C/C++ Headers")
+set(CPACK_COMPONENT_LIBRARIES_DESCRIPTION
+  "Library used to build programs which use FreeType")
+set(CPACK_COMPONENT_HEADERS_DESCRIPTION
+  "C/C++ header files for use with FreeType")
+set(CPACK_COMPONENT_HEADERS_DEPENDS libraries)
+set(CPACK_COMPONENT_LIBRARIES_GROUP "Development")
+set(CPACK_COMPONENT_HEADERS_GROUP "Development")
+
 include(CPack)
-
-# add make dist target
-add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
-
-# eof
diff --git a/ChangeLog b/ChangeLog
index fea19b9..806b835 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,16 +1,16 @@
-2015-06-07  Werner Lemberg  <wl@gnu.org>
+2018-05-01  Werner Lemberg  <wl@gnu.org>
 
-	* Version 2.6 released.
-	=======================
+	* Version 2.9.1 released.
+	=========================
 
 
-	Tag sources with `VER-2-6'.
+	Tag sources with `VER-2-9-1'.
 
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.6.
+	* docs/VERSION.TXT: Add entry for version 2.9.1.
+	* docs/CHANGES: Updated.
 
 	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
+	src/base/ftver.rc, builds/windows/vc2005/index.html,
 	builds/windows/vc2008/freetype.vcproj,
 	builds/windows/vc2008/index.html,
 	builds/windows/vc2010/freetype.vcxproj,
@@ -24,485 +24,271 @@
 	builds/wince/vc2005-ce/freetype.vcproj,
 	builds/wince/vc2005-ce/index.html,
 	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.5/2.6/, s/255/26/.
+	builds/wince/vc2008-ce/index.html: s/2.9/2.9.1/, s/29/291/.
 
-	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 6.
-	(FREETYPE_PATCH): Set to 0.
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
 
-	* builds/unix/configure.raw (version_info): Set to 18:0:12.
-	* CMakeLists.txt (VERSION_MINOR): Set to 0.
-	(VERSION_PATCH): Set to 6.
+	* builds/unix/configure.raw (version_info): Set to 22:1:16.
+	* CMakeLists.txt (VERSION_PATCH): Set to 1.
 
-	* src/autofit/afmodule.c [!FT_MAKE_OPTION_SINGLE_OBJECT]: Add
-	declarations for dumping functions.
+	* include/freetype/ftgasp.h: Use FT_BEGIN_HEADER and FT_END_HEADER.
 
-	* src/truetype/ttinterp.c (TT_New_Context): Pacify compiler.
+2018-04-26  Werner Lemberg  <wl@gnu.org>
 
-	* builds/toplevel.mk: Use `freetype.mk's code to compute the version
-	string.
-	Don't include a zero patch level in version string.
-	* builds/freetype.mk: Remove code for computing the version string.
+	Another fix for handling invalid format 2 cmaps.
 
-2015-06-06  Ashish Azad  <ashish.azad@samsung.com>
+	Sigh.
 
-	Fix Savannah bug #45260.
+	Reported as
 
-	* src/pfr/pfrdrivr.c (pfr_get_kerning): Fix typo.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=8003
 
-2015-06-03  Werner Lemberg  <wl@gnu.org>
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Adjust condition to avoid
+	an endless loop.
 
-	[truetype] Fix memory leak.
+2018-04-24  Ben Wagner  <bungeman@google.com>
 
-	Problem reported by Grissiom <chaos.proton@gmail.com>; in
+	[base] Avoid undefined behaviour in lcd filtering code (#53727).
 
-	  http://lists.nongnu.org/archive/html/freetype/2015-05/msg00013.html
+	* src/base/ftlcdfil.c (ft_lcd_filter_fir, _ft_lcd_filter_legacy):
+	Ensure `height > 0'.
 
-	there is an example code to trigger the bug.
+2018-04-22  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttobjs.c (tt_size_init_bytecode): Free old `size'
-	data before allocating again.  Bug most probably introduced four
-	years ago in version 2.4.3.
+	* src/base/ftoutln.c (FT_Outline_Decompose): Improve error tracing.
 
-2015-06-02  Werner Lemberg  <wl@gnu.org>
+2018-04-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	[raster] Add more tracing.
+	[base] Fix bitmap emboldening.
 
-	* src/raster/ftraster.c (FT_TRACE7) [_STANDALONE_]: Define.
-	(Vertical_Sweep_Span, Vertical_Sweep_Drop, Horizontal_Sweep_Span,
-	Horizontal_Sweep_Drop, Render_Glyph): Add tracing calls.
+	Bug introduced after release 2.8.
 
-2015-06-01  Werner Lemberg  <wl@gnu.org>
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): We use
+	`FT_QALLOC_MULT', which doesn't zero out the buffer.  Adjust the
+	bitmap copying code to take care of this fact.
 
-	[truetype] While tracing opcodes, show code position and stack.
+2018-04-22  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttinterp.c: Change all existing TRACE7 calls to
-	TRACE6.
-	(opcode_name): Add string lengths.
-	(TT_RunIns): Implement display of code position and stack.
+	Another fix for handling invalid format 2 cmaps.
 
-2015-05-31  Werner Lemberg  <wl@gnu.org>
+	The previous commit was incomplete.
 
-	[truetype] In GX, make private point numbers work correctly.
+	Reported as
 
-	This is completely missing in Apple's documentation: If a `gvar'
-	tuple uses private point numbers (this is, deltas are specified for
-	some points only), the uncovered points must be interpolated for
-	this tuple similar to the IUP bytecode instruction.  Examples that
-	need this functionality are glyphs `Oslash' and `Q' in Skia.ttf.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7928
 
-	* src/truetype/ttgxvar.c (tt_delta_shift, tt_delta_interpolate,
-	tt_handle_deltas): New functions.
-	(TT_Vary_Get_Glyph_Deltas): Renamed to...
-	(TT_Vary_Apply_Glyph_Deltas): ... this; it directly processes the
-	points and does no longer return an array of deltas.
-	Add tracing information.
-	Call `tt_handle_deltas' to interpolate missing deltas.
-	Also fix a minor memory leak in case of error.
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Adjust condition to avoid
+	an endless loop.
 
-	* src/truetype/ttgxvar.h: Updated.
+2018-04-19  Werner Lemberg  <wl@gnu.org
 
-	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
-	load_truetype_glyph): Updated.
+	[autofit] Add support for Georgian Mtavruli characters.
 
-2015-05-31  Werner Lemberg  <wl@gnu.org>
+	This will be part of the forthcoming Unicode 11.0.
 
-	[truetype] In GX, make intermediate tuplets work at extrema.
-
-	* src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix range condition.
-
-2015-05-31  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Add tracing information to GX code.
-
-	* src/truetype/ttgxvar.c (ft_var_load_avar, ft_var_load_gvar,
-	ft_var_apply_tuple, TT_Get_MM_Var, TT_Set_MM_Blend,
-	TT_Set_Var_Design, tt_face_vary_cvt): Do it.
-
-2015-05-28  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/apinames.c (names_dump): Fix invalid reference.
-
-	Problem reported by Guzman Mosqueda, Jose R
-	<jose.r.guzman.mosqueda@intel.com>.
-
-2015-05-24  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix commit from 2015-05-22.
-
-	* src/truetype/ttgload.c, src/truetype/ttinterp.c: Guard new code
-	with `TT_CONFIG_OPTION_SUBPIXEL_HINTING'.
-
-	Problem reported by Nikolaus Waxweiler <madigens@gmail.com>.
-
-2015-05-23  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix return values of GETINFO bytecode instruction.
-
-	* src/truetype/ttinterp.h (TT_ExecContextRec): New fields
-	`vertical_lcd' and `gray_cleartype'.
-
-	* src/truetype/ttgload.c (tt_loader_init): Initialize new fields.
-	Change `symmetrical smoothing' to TRUE, since FreeType produces
-	exactly this.
-
-	* src/truetype/ttinterp.c (Ins_GETINFO): Fix selector/return bit
-	values for symmetrical smoothing, namely 11/18.
-	Handle bits for vertical LCD subpixels (8/15) and Gray ClearType
-	(12/19).
-
-2015-05-23  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Minor.
-
-	* src/truetype/ttinterp.h (TT_ExecContext):
-	 s/subpixel/subpixel_hinting.
-
-	* src/truetype/ttgload.c, src/truetype/ttgload.h: Updated.
-
-2015-05-22  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Support selector index 3 of the INSTCTRL instruction.
-
-	This flag activates `native ClearType hinting', disabling backwards
-	compatibility mode as described in Greg Hitchcocks whitepaper.  In
-	other words, it enables unrestricted functionality of all TrueType
-	instructions in ClearType.
-
-	* src/truetype/ttgload.c (tt_get_metrics): Call `sph_set_tweaks'
-	unconditionally.
-	(tt_loader_init): Unset `ignore_x_mode' flag if bit 2 of
-	`GS.instruct_control' is active.
-
-	* src/truetype/ttinterp.c (Ins_INSTCTRL): Handle selector index 3.
-	(Ins_GETINFO): Updated.
-
-	* docs/CHANGES: Document it.
-
-2015-05-20  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Minor.
-
-	* src/truetype/ttinterp.h (SetSuperRound): Fix type of `GridPeriod'
-	argument.
-
-2015-05-17  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix loading of composite glyphs.
-
-	* src/truetype/ttgload.c (TT_Load_Composite_Glyph): If the
-	ARGS_ARE_XY_VALUES flag is not set, handle argument values as
-	unsigned.  I trust `ttx' (which has exactly such code) that it does
-	the right thing here...
-
-	The reason that noone has ever noticed this bug is probably the fact
-	that point-aligned subglyphs are rare, as are subglyphs with a
-	number of points in the range [128;255], which is quite large (or
-	even in the range [32768;65535], which is extremely unlikely).
-
-2015-05-12  Chris Liddell  <chris.liddell@artifex.com>
-
-	[cff] Make the `*curveto' operators more tolerant.
-
-	* src/cff/cf2intrp.c (cf2_interpT2CharString): The opcodes
-	`vvcurveto', `hhcurveto', `vhcurveto', and `hvcurveto' all iterate,
-	pulling values off the stack until the stack is exhausted.
-	Implicitly the stack must be a multiple (or for subtly different
-	behaviour) a multiple plus a specific number of extra values deep.
-	If that's not the case, enforce it (as the old code did).
-
-2015-05-12  Chris Liddell  <chris.liddell@artifex.com>
-
-	[cff] fix incremental interface with new cff code.
-
-	* src/cff/cf2ft.c (cf2_getSeacComponent): When using the incremental
-	interface to retrieve glyph data for a SEAC, it be left to the
-	incremental interface callback to apply the encoding to raw
-	character index (as it was in the previous code).
-
-2015-04-29  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	[autofit] Speed up IUP.
-
-	* src/autofit/afhints.c (af_iup_interp): Separate trivial snapping to
-	the same position from true interpolation, use `scale' to reduce
-	divisions.
-
-2015-04-28  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Use `name' table for PS name if we have a SFNT-CFF.
-
-	This follows the OpenType 1.7 specification.  See
-
-	  http://tug.org/pipermail/tex-live/2015-April/036634.html
-
-	for a discussion.
-
-	* src/cff/cffdrivr.c (cff_get_ps_name): Use the `sfnt' service if we
-	have an SFNT.
-
-2015-04-27  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	[truetype] Speed up IUP.
-
-	* src/truetype/ttinterp.c (_iup_worker_interpolate): Separate trivial
-	snapping to the same position from true interpolation.
-
-2015-04-21  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] By default, enable warping code but switch off warping.
-
-	Suggested by Behdad.
-
-	* include/config/ftoption.h: Define AF_CONFIG_OPTION_USE_WARPER.
-
-	* src/autofit/afmodule.c (af_autofitter_init): Initialize `warping'
-	with `false'.
-
-2015-04-21  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CHANGES: Updated.
-
-2015-04-21  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce `warping' property.
-
-	This code replaces the debugging hook from the previous commit with
-	a better, more generic solution.
-
-	* include/ftautoh.h: Document it.
-
-	* src/autofit/afmodule.h (AF_ModuleRec)
-	[AF_CONFIG_OPTION_USE_WARPER]: Add `warping' field.
-
-	* src/autofit/afmodule.c (_af_debug_disable_warper): Remove.
-	(af_property_set, af_property_get, af_autofitter_init)
-	[AF_CONFIG_OPTION_USE_WARPER]: Handle `warping' option.
-
-	* src/autofit/afhints.h (AF_HINTS_DO_WARP): Remove use of the no
-	longer existing `_af_debug_disable_warper'.
-
-	* src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
-	(af_latin_hints_init), src/autofit/aflatin2.c (af_latin2_hints_init)
-	[AF_CONFIG_OPTION_USE_WARPER]: Add `AF_SCALER_FLAG_NO_WARPER' to the
-	scaler flags if warping is off.
-
-	* src/autofit/aftypes.h: Updated.
-
-2015-04-16  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add debugging hook to disable warper.
-
-	* src/autofit/afmodule.c (_af_debug_disable_warper)
-	[FT_DEBUG_AUTOFIT]: New global variable.
-
-	* src/autofit/aftypes.h: Updated.
-	(AF_SCALER_FLAG_NO_WARPER): New macro (not actively used yet).
-
-	* src/autofit/afhints.h (AF_HINTS_DO_WARP): New macro.
-
-	* src/autofi/aflatin.c (af_latin_hints_apply)
-	[AF_CONFIG_OPTION_USE_WARPER]: Use `AF_HINTS_DO_WARP' to control use
-	of warper.
-
-	* src/autofit/afcjk.c (af_cjk_hints_init, af_cjk_hints_apply)
-	[AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'.
-
-	* src/autofit/aflatin2.c (af_latin2_hints_apply)
-	[AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'.
-
-2015-04-10  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Update advance width handling to OpenType 1.7.
-
-	Problem reported by Behdad.
-
-	* src/cff/cffdrivr.c (cff_get_advances): Handle SFNT case
-	separately.
-
-	* src/cff/cffgload.c (cff_slot_load): Use advance width and side
-	bearing values from `hmtx' table if present.
-
-2015-04-03  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Use do-while loop.
-
-2015-04-02  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	* src/autofit/aflatin.c (af_latin_hint_edges): Reduce logic.
-
-2015-04-01  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	[autofit] Finish the thought.
-
-	* src/autofit/afhints.c (af_direction_compute): make sure the long arm
-	is never negative so that its `FT_ABS' is not necessary.
-
-2015-04-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Call dumper functions for tracing.
-
-	* src/autofit/afcjk.c (af_cjk_hints_apply): Remove dead code.
-	* src/autofit/afhints.c (af_glyph_hints_dump_points): Minor
-	improvement.
-	* src/autofit/afmodule.c (af_autofitter_load_glyph): Implement it.
-
-2015-04-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Make debugging stuff work again.
-
-	The interface to ftgrid was broken in the series of commits starting
-	with
-
-	  [autofit] Allocate AF_Loader on the stack instead of AF_Module.
-
-	from 2015-01-14.
-
-	* src/autofit/afmodule.c (_af_debug_hints_rec) [FT_DEBUG_AUTOFIT]:
-	Use a global AF_GlyphHintsRec object for debugging.
-	(af_autofitter_done, af_autofitter_load_glyph): Updated.
-
-	* src/autofit/afloader.c (af_loader_init, af_loader_done): Updated.
-
-2015-04-01  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/afhints.c (af_glyph_hints_done): Fix minor thinko.
-
-2015-03-29  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Fix Savannah bug #44629.
-
-	* src/cff/cf2font.h (CF2_MAX_SUBR), src/cff/cffgload.h
-	(CFF_MAX_SUBRS_CALLS): Set to 16.
-
-2015-03-29  Werner Lemberg  <wl@gnu.org>
-
-	[type1, truetype] Make the MM API more flexible w.r.t. `num_coords'.
-
-	This commit allows `num_coords' to be larger or smaller than the
-	number of available axes while selecting a design instance, either
-	ignoring excess data or using defaults if data is missing.
-
-	* src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design):
-	Implement it.
-
-	* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design,
-	T1_Set_Var_Design): Ditto.
-
-2015-03-29  Werner Lemberg  <wl@gnu.org>
-
-	[type1] Minor.
-
-	* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Use
-	FT_THROW.
-	(T1_Set_Var_Design): Use T1_MAX_MM_AXIS and FT_THROW.
-
-2015-03-27  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Trace charstring nesting levels.
-
-	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdCALLGSUBR,
-	cf2_cmdCALLSUBR, cf2_cmdRETURN>: Implement it.
-
-	* src/cff/cffgload.c (cff_decoder_parse_charstrings)
-	<cff_op_callsubr, cff_op_callgsubr, cff_op_return>: Ditto.
-
-2015-03-21  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	[base] Optimize `FT_Angle_Diff'.
-
-	Under normal circumstances we are usually close to the desired range
-	of angle values, so that the remainder is not really necessary.
-
-	* src/base/fttrigon.c (FT_Angle_Diff): Use loops instead of remainder.
-
-	* src/autofit/aftypes.h (AF_ANGLE_DIFF): Ditto in the unused macro.
-
-2015-03-21  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Improve `gvar' handling.
-
-	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Correctly handle
-	single-element runs.  Cf. glyph `Q' in Skia.ttf with weights larger
-	than the default.
-
-2015-03-20  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	* src/base/fttrigon.c (FT_Vector_Rotate): Minor refactoring.
-
-2015-03-17  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	Fix Savannah bug #44412 (part 2).
-
-	* src/base/fttrigon.c (FT_Sin, FT_Cos, FT_Tan): Call `FT_Vector_Unit'.
-
-2015-03-11  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add support for Arabic script.
-
-	Thanks to Titus Nemeth <tn@tntypography.eu> for guidance!
-
-	* src/autofit/afblue.dat: Add blue zone data for Arabic.
-
+	* src/autofit/afblue.dat: Add blue zone data for Mtavruli.
 	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-	* src/autofit/afscript.h: Add Arabic standard characters.
+	* src/autofit/afscript.h: Add Mtavruli standard character.
 
-	* src/autofit/afranges.c: Add Arabic data.
+2018-04-18  Werner Lemberg  <wl@gnu.org>
 
-	* src/autofit/afstyles.h: Add Arabic data.
+	Fix handling of invalid format 2 cmaps.
 
-	* docs/CHANGES: Document it.
+	The problem was introduced after the last release.
 
-2015-03-11  Werner Lemberg  <wl@gnu.org>
+	Reported as
 
-	Rename `svxf86nm.h' to `svfntfmt.h'; update related symbols.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7828
 
-	* include/internal/ftserv.h (FT_SERVICE_XFREE86_NAME_H): Renamed
-	to...
-	(FT_SERVICE_FONT_FORMAT_H): This.
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Avoid endless loop.
 
-	* include/internal/services/svfntfmt.h (FT_XF86_FORMAT_*): Renamed
-	to ...
-	(FT_FONT_FORMAT_*): This.
+2018-04-17  Werner Lemberg  <wl@gnu.org>
 
-	src/base/ftfntfmt.c, src/bdf/bdfdrivr.c, src/cff/cffdrivr.c,
-	src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c,
-	src/truetype/ttdriver.c, src/type1/t1driver.c,
-	src/type42/t42drivr.c, src/winfonts/winfnt.c: Updated.
+	[truetype] Integer overflow issues.
 
-2015-03-11  Werner Lemberg  <wl@gnu.org>
+	Reported as
 
-	[base] Rename `FT_XFREE86_H' to `FT_FONT_FORMATS_H'.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7739
 
-	* include/config/ftheader.h: Implement it.
-	* src/base/ftfntfmt.c, docs/CHANGES: Updated.
+	* src/truetype/ttinterp.c (Ins_CEILING): Use FT_PIX_CEIL_LONG.
 
-2015-03-11  Werner Lemberg  <wl@gnu.org>
+2018-04-16  Werner Lemberg  <wl@gnu.org>
 
-	[base] Rename `FT_Get_X11_Font_Format' to `FT_Get_Font_Format'.
+	[truetype] Integer overflow issues.
 
-	* include/ftfntfmt.h, src/base/ftfntfmt.c: Implement it.
+	Reported as
 
-	* docs/CHANGES: Updated.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7718
 
-2015-03-11  Werner Lemberg  <wl@gnu.org>
+	* src/truetype/ttinterp.c (Ins_MIRP): Use ADD_LONG.
 
-	Fix automatic copyright updating.
+2018-04-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	* src/tools/update-copyright: Make scanning of `no-copyright'
-	actually work.
+	[build] Use `info' function of make 3.81.
 
-	* src/tools/no-copyright: Don't include README in general.
+	* configure, docs/INSTALL, docs/INSTALL.CROSS, docs/INSTALL.GNU,
+	docs/INSTALL.UNIX, docs/MAKEPP: Bump make version requirements.
 
-2015-03-11  Werner Lemberg  <wl@gnu.org>
+	* builds/detect.mk (std_setup): Replace `echo' with `info'.
+	(dos_setup): Removed.
+	* builds/unix/install.mk, builds/modules.mk, builds/dos/detect.mk,
+	builds/windows/detect.mk, builds/os2/detect.mk: Updated.
+	* builds/newline: No longer needed.
 
-	Rename `ftxf86.[ch]' to `ftfntfmt.[ch]'.
+2018-04-15  Werner Lemberg  <wl@gnu.org>
 
-	CMakeLists.txt, builds/amiga/makefile, builds/amiga/makefile.os4,
+	[truetype]: Limit `SLOOP' bytecode argument to 16 bits.
+
+	This fixes
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7707
+
+	* src/truetype/ttinterp.c (Ins_SLOOP): Do it.
+
+2018-04-14  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow issues.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7652
+
+	* src/truetype/ttinterp.c (Ins_MDAP): Use SUB_LONG.
+
+2018-04-14  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Update to Unicode 11.0.0.
+
+	But no support new scripts (volunteers welcomed).
+
+	* src/autofit/afranges.c (af_arab_nonbase_uniranges,
+	af_beng_nonbase_uniranges, af_cakm_nonbase_uniranges,
+	af_deva_nonbase_uniranges, af_geor_uniranges,
+	af_gujr_nonbase_uniranges, af_mlym_nonbase_uniranges,
+	af_nkoo_nonbase_uniranges, af_telu_nonbase_uniranges,
+	af_hani_uniranges): Add new data.
+
+2018-04-10  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	* CMakeLists.txt, builds/cmake/FindHarfBuzz.cmake: Extensive
+	modernization measures.
+
+	This brings up the minimum required CMake version to 2.8.12.
+
+	The installation paths follow the GNU defaults now, e.g. installing on a
+	64 bit host will place binaries into the lib64/ folder on e.g. Fedora.
+
+	Symbols are hidden by default (e.g. `-fvisibility=hidden' on GCC).
+
+	CMake will no longer look for a C++ compiler.
+
+	Library and .so version now match the Autotools build.
+
+	Comments in the build file and informational messages now use platform
+	agnostic example commands.
+
+	ftoption.h and ftconfig.h are written directly without a redundant `-new'
+	copy.
+
+	External dependencies are expressed as option()s and will turn up as such
+	in cmake-gui.
+
+	Internal: Properties such as dependencies and include directories are now
+	privately set on the freetype library instead of globally.
+
+	The CPack definitions have been cleaned up, the `make dist' has been
+	removed. Source packages generated with CPack don't contain Autotools
+	files and aren't used by the maintainters anyway.
+
+	On Windows, src/base/ftver.rc is compiled to decorate the library with
+	version and copyright information.
+
+	A pkg-config file is now generated and installed.
+
+2018-04-09  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow issues.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7453
+
+	* src/truetype/ttinterp.c (Round_Super, Round_Super_45): Use
+	ADD_LONG and SUB_LONG.
+
+2018-04-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[windows, wince] Clean up legacy project files.
+
+	* builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/freetype.dsp: Remove per-file compile flags.
+
+2018-04-04  Werner Lemberg  <wl@gnu.org>
+
+	[cff, type1] Sanitize `BlueFuzz' and `BlueShift'.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=7371
+
+	* src/cff/cffload.c (cff_load_private_dict): Sanitize
+	`priv->blue_shift' and `priv->blue_fuzz' to avoid overflows later
+	on.
+
+	* src/type1/t1load.c (T1_Open_Face): Ditto.
+
+2018-04-04  Ben Wagner  <bungeman@google.com>
+
+	* src/truetype/ttobjs.c (trick_names): Add 3 tricky fonts (#53554),
+	`DFHei-Md-HK-BF', `DFKaiShu-Md-HK-BF' and `DFMing-Bd-HK-BF'.
+	(tt_check_trickyness_sfnt_ids): Add checksums for 3 tricky fonts
+	in above.
+
+2018-04-01  Werner Lemberg  <wl@gnu.org>
+
+	* builds/toplevel.mk (work): Use $(SEP).
+
+	This fixes the `make refdoc' using Cygwin: $(CAT) is `type' on this
+	platform, and this program only understands backslashes in paths.
+
+	Reported by Nikhil Ramakrishnan <ramakrishnan.nikhil@gmail.com>.
+
+2018-03-30  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix memory leak (only if tracing is on).
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var) [FT_DEBUG_LEVEL_TRACE}: Fix
+	it.
+
+2018-03-23  Ben Wagner  <bungeman@google.com>
+
+	[sfnt] Correctly handle missing bitmaps in sbix format (#53404).
+
+	* src/sfnt/ttfsbit.c (tt_face_load_sbix_image): Fix return value.
+
+2018-03-23  Ben Wagner  <bungeman@google.com>
+
+	[truetype] Fix advance of empty glyphs in bitmap fonts (#53393).
+
+	* src/truetype/ttgload.c (TT_Load_Glyph): Apply scaling to metrics
+	for empty bitmaps.
+
+2018-03-22  Werner Lemberg  <wl@gnu.org>
+
+	Remove `ftlcdfil.c' and `ftfntfmt.c' from build files (#53415).
+
+	builds/amiga/makefile, builds/amiga/makefile.os4,
 	builds/amiga/smakefile, builds/mac/FreeType.m68k_cfm.make.txt,
 	builds/mac/FreeType.m68k_far.make.txt,
 	builds/mac/FreeType.ppc_carbon.make.txt,
-	builds/mac/FreeType.ppc_classic.make.txt, builds/symbian/bld.inf,
+	builds/mac/FreeType.ppc_classic.make.txt,
 	builds/symbian/freetype.mmp, builds/wince/vc2005-ce/freetype.vcproj,
 	builds/wince/vc2008-ce/freetype.vcproj,
 	builds/windows/vc2005/freetype.vcproj,
@@ -512,6275 +298,2045 @@
 	builds/windows/visualc/freetype.dsp,
 	builds/windows/visualc/freetype.vcproj,
 	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj, docs/INSTALL.ANY,
-	include/config/ftheader.h, include/ftfntfmt.h, modules.cfg,
-	src/base/ftfntfmt.c, vms_make.com: Updated.
+	builds/windows/visualce/freetype.vcproj, vms_make.com: Do it.
 
-2015-03-10  Alexei Podtelezhnikov <apodtele@gmail.com>
+2018-03-13  Werner Lemberg  <wl@gnu.org>
 
-	Fix Savannah bug #44412 (part 1).
+	* src/sfnt/ttcmap.c (tt_cmap2_validate): Fix potential numeric
+	overflow.
 
-	* src/base/ftstroke.c (ft_stroker_inside): Handle near U-turns.
+2018-03-13  Werner Lemberg  <wl@gnu.org>
 
-2015-03-10  Werner Lemberg  <wl@gnu.org>
+	Fix cmap format 2 handling (#53320).
 
-	[base] Rename `FT_Bitmap_New' to `FT_Bitmap_Init'.
+	The patch introduced for #52646 was not correct.
 
-	* include/ftbitmap.h, src/base/ftbitmap.c: Implement it.
-	Update all callers.
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Adjust condition.
+
+2018-03-10  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	* CMakeLists.txt (BASE_SRCS): Update to changes from 2018-03-05.
+
+2018-03-09  Chun-wei Fan  <fanc999@yahoo.com.tw>
+
+	* CMakeLists.txt [win32]: Allow MSVC DLL builds (#53287).
+
+	Do not limit DLL builds to MinGW, since we already have
+	`__declspec(dllexport)' directives in `ftconfig.h'.
+	Also suppress more warnings for POSIX functions.
+
+2018-03-08  Hugh McMaster  <hugh.mcmaster@outlook.com>
+
+	Make installation of `freetype-config' optional (#53093).
+
+	* builds/unix/configure.raw: Add option `--enable-freetype-config'
+	and set `INSTALL_FT2_CONFIG'.
+	* builds/unix/unix-def.in (INSTALL_FT2_CONFIG): Define.
+	* builds/unix/install.mk (install): Handle it.
+
+2018-03-05  Werner Lemberg  <wl@gnu.org>
+
+	Make `ftlcdfil.c' part of the `base' module.
+
+	`ftobjs.c' needs `ft_lcd_padding'.
+
+	Problem reported by duhuanpeng <548708880@qq.com>.
+
+	* modules.cfg (BASE_EXTENSIONS): Don't include `ftlcdfil.c'.
+
+	* src/base/ftbase.c: Include `ftlcdfil.c'.
+	* src/base/rules.mk (BASE_SRC): Add `ftlcdfil.c'.
+	* src/base/Jamfile (_sources): Adjusted.
+
+	* docs/INSTALL.ANY: Updated.
+
+2018-03-05  Werner Lemberg  <wl@gnu.org>
+
+	Make `ftfntfmt.c' part of the `base' module.
+
+	`ftobjs.c' needs `FT_Get_Font_Format'.
+
+	Problem reported by duhuanpeng <548708880@qq.com>.
+
+	* modules.cfg (BASE_EXTENSIONS): Don't include `ftfntfmt.c'.
+
+	* src/base/ftbase.c: Include `ftfntfmt.c'.
+	* src/base/rules.mk (BASE_SRC): Add `ftfntfmt.c'.
+	* src/base/Jamfile (_sources): Adjusted.
+
+	* docs/INSTALL.ANY: Updated.
+
+2018-03-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Fix tracing arguments.
+
+2018-02-23  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/configure.raw: Need HarfBuzz 1.3.0 or newer.
+
+	Problem reported by Alan Coopersmith <alan.coopersmith@oracle.com>.
+
+2018-02-17  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Prefer `CBDT'/`CBLC' over `glyf' table (#53154).
+
+2018-02-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow issues.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6027
+
+	* src/truetype/ttinterp.c (Ins_MSIRP, Ins_MIAP, Ins_MIRP): Use
+	SUB_LONG; avoid FT_ABS.
+
+2018-02-04  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[unix] Use -fvisibility=hidden.
+
+	It is now widely recommended that ELF shared libraries hide symbols
+	except those with explicit __attribute__((visibility("default"))).
+	This is supported by all major compilers and should rather be an
+	option in libtool.
+
+	* builds/unix/configure.raw: Add -fvisibility=hidden to CFLAGS.
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+	include/freetype/config/ftconfig.h (FT_EXPORT): Use visibility
+	attribute.
+
+2018-01-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Better protection against invalid VF data.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5739
+
+	Bug introduced in commit 08cd62deedefe217f2ea50e392923ce8b5bc7ac7.
+
+	* src/truetype/ttgxvar.c (TT_Set_Var_Design): Always initialize
+	`normalizedcoords'.
+
+2018-01-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (Ins_GETVARIATION): Avoid NULL reference.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5736
+
+2018-01-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_set_mm_blend): Minor.
+
+2018-01-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Better trace VF instances.
+
+	* src/truetype/ttgxvar.c (ft_var_to_normalized): Don't emit number
+	of coordinates.
+	(TT_Get_MM_Var): Trace instance indices names.
+	(TT_Set_Var_Design): Updated.
+
+2018-01-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Beautify tracing of VF axis records.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Show axis records in a
+	table-like manner.
+
+2018-01-26  Ben Wagner  <bungeman@google.com>
+
+	[truetype] Fix multiple calls of `FT_Get_MM_Var' (#52955).
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Set
+	`face->blend->num_axis' in case we have to initialize the
+	`face->blend'.
+
+2018-01-23  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[apinames] Anonymous version map for GNU linker.
+
+	* src/tools/apinames.c (PROGRAM_VERSION): Set to 0.3.
+	(OutputFormat): Add `OUTPUT_GNU_VERMAP'.
+	(names_dump): Handle it.
+	(usage): Updated.
+	(main): Handle new command line flag `-wL'.
+
+2018-01-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[unix] Call libtool to clean up.
+
+	* builds/unix/install.mk (clean_project_unix, distclean_project_unix):
+	Use libtool.
+	* builds/freetype.mk: Minor.
+
+2018-01-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftver.rc: Fix mingw-w64 compilation.
+
+2018-01-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[build] Enable VERSIONINFO resource for Cygwin/MinGW.
+
+	* builds/unix/configure.raw: Check for resource compiler.
+	* builds/unix/unix-cc.in: Conditionally set up resource compiler.
+	* builds/freetype.mk: Add conditional rule for `ftver.rc'.
+	* src/base/ftver.rc: Copyright notice and year update.
+
+2018-01-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[build] Move VERSIONINFO resource.
+
+	* builds/windows/vc2010/freetype.vcxproj: Updated.
+	* builds/windows/ftver.rc: Move file from here...
+	* src/base/ftver.rc: ... to here.
+
+2018-01-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[build] Expand dllexport/dllimport to Cygwin/MinGW.
+
+	* include/freetype/config/ftconfig.h: Respect DLL_EXPORT,
+	s/_MSC_VER/_WIN32/.
+	* builds/unix/ftconfig.in: Replicate here.
+	* builds/vms/ftconfig.h: Replicate here.
+
+2018-01-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[build] Improve and document MSVC build.
+
+	* include/freetype/config/ftconfig.h: Guard dllexport/dllimport
+	attributes with _DLL and FT2_DLLIMPORT.
+	* builds/windows/vc2010/index.html: Update documentation.
+
+2018-01-10  Steve Robinson  <ssrobins@gmail.com>
+
+	* CMakeLists.txt [win32]: Suppress warnings for POSIX functions.
+
+2018-01-10  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Correctly handle Flex features (#52846).
+
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdVMOVETO,
+	cf2_cmdHMOVETO>: Do not move if doing Flex.
+
+2018-01-09  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* builds/windows/vc2010/freetype.sln: Synchronize with the project.
+
+2018-01-08  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.9 released.
+	=======================
+
+
+	Tag sources with `VER-2-9'.
+
+	* docs/VERSION.TXT: Add entry for version 2.9.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/windows/ftver.rc,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.8.1/2.9/, s/281/29/.
+
+	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 9.
+	(FREETYPE_PATCH): Set to 0.
+
+	* builds/unix/configure.raw (version_info): Set to 22:0:16.
+	* CMakeLists.txt (VERSION_PATCH): Set to 0.
+
+2018-01-07  Werner Lemberg  <wl@gnu.org>
+
+	Add check for librt, needed for `ftbench' (#52824).
+
+	* builds/unix/configure.raw (LIB_CLOCK_GETTIME): Define; this will
+	hold `-lrt' if necessary.
+
+	* builds/unix/unix-cc.in (LIB_CLOCK_GETTIME): New variable.
+
+2018-01-07  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Fix Type 1 glyphs with too many stem hints.
+
+	According to the CFF specification, charstrings can have up to 96 stem
+	hints. Due to hint replacement routines in Type 1 charstrings, some
+	glyphs are rejected by the Adobe engine, which implements the above
+	limit. This fix turns off hinting for such glyphs.
+
+	* src/psaux/pshints.c (cf2_hintmap_build): Reset the error from calling
+	`cf2_hintmask_setAll' on a problematic Type 1 charstring and turn off
+	hinting.
+
+2018-01-06  Werner Lemberg  <wl@gnu.org>
+
+	Add `FT_Done_MM_Var'.
+
+	This is necessary in case the application's memory routines differ
+	from FreeType.  A typical example is a Python application on Windows
+	that calls FreeType compiled as a DLL via the `ctypes' interface.
+
+	* include/freetype/ftmm.h, src/base/ftmm.c (FT_Done_MM_Var): Declare
+	and define.
 
 	* docs/CHANGES: Updated.
 
-2015-03-06  Werner Lemberg  <wl@gnu.org>
+2018-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Round offsets of glyph components only if hinting is on.
+
+	* src/truetype/ttgload.c (TT_Process_Composite_Component): Implement
+	it.
+
+2018-01-03  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (ft_var_to_design): Remove dead code.
+
+	This is a better fix than the previous commit, which is now
+	reverted.
+
+2018-01-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Move internal LCD-related declarations.
+
+	* include/freetype/ftlcdfil.h (ft_lcd_padding, ft_lcd_filter_fir):
+	Move from here...
+	* include/freetype/internal/ftobjs.h: ... to here.
+
+2018-01-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* include/freetype/config/ftconfig.h (FT_EXPORT, FT_EXPORT_DEF)
+	[_MSC_VER]: Limit Visual C++ attributes.
+
+2018-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Make blend/design coordinate round-tripping work.
+
+	Behdad reported that setting blend coordinates, then getting design
+	coordinates did incorrectly return the default instance's
+	coordinates.
+
+	* src/truetype/ttgxvar.c (tt_set_mm_blend): Fix it.
+
+2017-12-31  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Fix endless loop.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4838
+
+2017-12-31  Werner Lemberg  <wl@gnu.org>
+
+	Synchronize other Windows project files.
+
+	* builds/windows/*: Add missing files.
+
+2017-12-31  Werner Lemberg  <wl@gnu.org>
+
+	Update Visual C 2010 project files.
+
+	Problem reported by Hin-Tak.
+
+	* builds/windows/vc2010/freetype.vcxproj: Add files `ftbdf.c' and
+	`ftcid.c'.
+	Sort entries.
+	* builds/windows/vc2010/freetype.vcxproj.filter: Ditto.
+	Fix members of `FT_MODULE' group.
+
+2017-12-30  Werner Lemberg  <wl@gnu.org>
+
+	* builds/vms/ftconfig.h: Synchronize with unix `ftconfig.in' file.
+
+2017-12-28  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/ftconfig.in: Synchronize with main `ftconfig.h' file.
+
+	Reported by Nikolaus.
+
+2017-12-27  Werner Lemberg  <wl@gnu.org>
+
+	Fix compiler warnings.
+
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Make `pitch' and
+	`new_pitch' unsigned.
+
+	* src/base/ftpsprop.c: Include FT_INTERNAL_POSTSCRIPT_PROPS_H.
+
+2017-12-27  Werner Lemberg  <wl@gnu.org>
+
+	Fixes for `make multi'.
+
+	* include/freetype/internal/ftpsprop.h: Use `FT_BASE_CALLBACK'.
+	(ps_property_get): Harmonize declaration with corresponding
+	function typedef.
+
+	* include/freety[e/internal/fttrace.h: Add `trace_psprops'.
+
+	* src/base/ftpsprop.c: Include necessary header files.
+	(FT_COMPONENT): Define.
+	(ps_property_set): Tag with `FT_BASE_CALLBACK_DEF'.
+	(ps_property_get): Tag with `FT_BASE_CALLBACK_DEF'.
+	Harmonize declaration with corresponding function typedef.
+
+2017-12-27  Werner Lemberg  <wl@gnu.org>
+
+	Provide support for intra-module callback functions.
+
+	This is needed especially for `make multi' with C++.
+
+	* include/freetype/config/ftconfig.h (FT_BASE_CALLBACK,
+	FT_BASE_CALLBACK_DEF): New macros.
+
+2017-12-25  Ewald Hew  <ewaldhew@gmail.com>
+
+	Move PostScript drivers' property handlers to `base'.
+
+	This reduces the amount of duplicated code across PostScript
+	drivers.
+
+	* src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c
+	({cff,cid,t1}_property_{get,set}): Moved to...
+	* include/freetype/internal/ftpsprop.h: ...this new file.
+	(ps_property_{get,set}): New functions to replace moved ones.
+
+	* src/base/ftpsprop.c: New file that implements above functions.
+
+	* include/freetype/internal/internal.h
+	(FT_INTERNAL_POSTSCRIPT_PROPS_H): New macro.
+
+	* src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c:
+	Updated.
+
+	* src/base/Jamfile, src/base/rules.mk (BASE_SRC), src/base/ftbase.c:
+	Updated.
+
+2017-12-20  Werner Lemberg  <wl@gnu.org>
+
+	Speed up FT_Set_Var_{Design,Blend}_Coordinates if curr == new.
+
+	We exit early if the current design or blend coordinates are
+	identical to the new ones.
+
+	* src/truetype/ttgxvar.c (tt_set_mm_blend, TT_Set_Var_Design):
+	Implement it, returning internal error code -1 if there will be no
+	variation change.
+
+	* src/type1/t1load.c (t1_set_mm_blend): Ditto.
+
+	* src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+	FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates): Updated.
+
+2017-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix charmap type 2 iterator (#52646).
+
+	The subsetted demo font of the report that exhibits the bug has a
+	very unusual type 2 cmap for Unicode(!): It contains only two
+	sub-headers, one for one-byte characters (covering the range 0x20 to
+	0xFA), and a second one for higher byte 0x01 (just for character
+	code U+0131).
+
+	Before this commit, the iterator wasn't able to correctly handle a
+	sub-header for higher byte 0x01.
+
+	* src/sfnt/ttcmap.c (tt_cmap2_char_next): Fix character increment
+	for outer loop.
+
+2017-12-18  Matthias Clasen  <matthias.clasen@gmail.com>
+
+	[truetype] Fix clamping, minor tracing code beautification.
+
+	* src/truetype/ttgxvar.c (ft_var_to_normalized): Trace number of
+	design coordinates.
+	Use clamped value.
+
+2017-12-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/*/*: Only use `ft_' and `FT_' variants of stdc library stuff.
+
+2017-12-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_face_vary_cvt): Add size guard (#52688).
+
+2017-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix previous commit.
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Correctly handle
+	unhinted phantom points, which must be properly scaled.
+
+2017-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Don't apply HVAR and VVAR deltas twice (#52683).
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Always adjust
+	`pp1' to `pp4', except if we have an HVAR and/or VVAR table.
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Handle
+	alternative code branch identically w.r.t. presence of an HVAR
+	and/or VVAR table.
+
+2017-12-17  Jonathan Kew  <jfkthame@gmail.com>
+
+	[truetype] Correctly handle variation font phantom points (#52683).
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix phantom
+	point indices.
+
+2017-12-17  Jonathan Kew  <jfkthame@gmail.com>
+
+	Fix incorrect advance width scaling (#52683).
+
+	* src/base/ftadvance.c (FT_Get_Advances): Always respect the
+	FT_LOAD_NO_SCALE flag if present.
+
+2017-12-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* builds/windows/vc2010/freetype.vcxproj: AfterBuild copy.
+	* objs/.gitignore: Ignore almost everything.
+
+2017-12-11  Werner Lemberg  <wl@gnu.org>
+
+	Fix compiler warning (#52640).
+
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Remove unused
+	variable.
+
+2017-12-08  Azzuro  <azzuro@team-mediaportal.com>
+
+	* builds/windows/vc2010/freetype.vcxproj: Adjust output directory.
+
+	This allows builds with different configurations in parallel.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	Fix `make setup dos', second try (#52622).
+
+	* builds/detect.mk (dos_setup): Don't use literal `>' character at
+	all.  Mixing the different escaping rules from make, dos, and
+	windows is too fragile.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Fix code section parsing.
+
+	Stuff like
+
+	  {
+	    <bla>
+	  }
+
+	confused the parser, which incorrectly treated `<bla>' as a markup
+	tag.
+
+	* src/tools/docmaker/content.py (ContentProcessor::process_content):
+	Apply `re_markup_tags' only outside of code sections.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	New `ftdriver.h' file, covering all driver modules.
+
+	This reduces redundancy and increases synergy; it also reduces the
+	number of header files.
+
+	* include/freetype/config/ftheader.h (FT_DRIVER_H): New macro.
+	(FT_AUTOHINTER_H, FT_CFF_DRIVER_H, FT_TRUETYPE_DRIVER_H,
+	FT_PCF_DRIVER_H, FT_TYPE1_DRIVER_H): Make them aliases to
+	FT_DRIVER_H.
+
+	* include/freetype/ftautoh.h, include/freetype/ftcffdrv.h,
+	include/freetype/ftpcfdrv.h, include/freetype/ftt1drv.h,
+	include/freetype/ftttdrv.h: Replaced with...
+	* include/freetype/ftdriver.h: ...this new file.
+	(FT_CFF_HINTING_ADOBE, FT_T1_HINTING_ADOBE): Renamed to...
+	(FT_HINTING_ADOBE): ... this new macro.
+	(FT_CFF_HINTING_FREETYPE, FT_T1_HINTING_FREETYPE): Renamed to...
+	(FT_HINTING_FREETYPE): ... this new macro.
+
+	* src/*/*: Updated accordingly.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	Move `ftdriver.h' to `ftdrv.h'.
+
+	* include/freetype/internal/ftdriver.h: Renamed to...
+	* include/freetype/internal/ftdrv.h: ... this name.
+
+	* include/freetype/internal/internal.h (FT_INTERNAL_DRIVER_H):
+	Updated.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	Fix access to uninitalized memory (#52613).
+
+	Also reported as
+
+	  https://bugs.chromium.org/p/chromium/issues/detail?id=791317
+
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): If increasing the
+	bitmap size needs a larger bitmap buffer, assure that the new memory
+	areas are initialized also.
+
+2017-12-08  Werner Lemberg  <wl@gnu.org>
+
+	Fix `make setup dos' (#52622).
+
+	* builds/detect.mk (dos_setup): Properly escape literal `>'
+	character.
+
+2017-12-07  Werner Lemberg  <wl@gnu.org>
+
+	Fix C++ compilation.
+
+	* src/psaux/psauxmod.h: Use FT_CALLBACK_TABLE macro where necessary.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Fix warning.
+
+2017-12-07  Werner Lemberg  <wl@gnu.org>
+
+	Fix `make multi'.
+
+	* include/freetype/internal/fttrace.h: Remove unused tracing macros.
+	s/pshalgo2/pshalgo/.
+	Add `trace_cffdecode'.
+	* src/pshinter/pshalgo.c (FT_COMPONENT): Updated.
+
+	* src/cff/cffload.c: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+	* src/cff/cffobjs.c: Include FT_SERVICE_METRICS_VARIATIONS_H and
+	FT_SERVICE_CFF_TABLE_LOAD_H.
+
+	* src/cid/cidriver.c: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+
+	* src/psaux/cffdecode.c: Include FT_FREETYPE_H and
+	FT_INTERNAL_DEBUG_H.
+	(FT_COMPONENT): Define.
+	* src/psaux/cffdecode.h: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+	* src/psaux/psauxmod.h: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+	Declare `cff_builder_funcs' and `ps_builder_funcs'.
+	* src/psaux/psft.c: Include `psobjs.h' and `cffdecode.h'.
+	* src/psaux/psobjs.c : Include `psauxmod.h'.
+
+2017-12-07  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/config/ftheader.h: Some clean-up.
+
+	This commit removes documentation of deprecated macros and does some
+	minor streamlining.
+
+2017-12-06  Werner Lemberg  <wl@gnu.org>
+
+	* builds/symbian/bld.inf: Updated.
+
+2017-12-06  Werner Lemberg  <wl@gnu.org>
+
+	New header file `ftparams.h' that collects all parameter tags.
+
+	* include/freetype/config/ftheader.h (FT_PARAMETER_TAGS_H): New
+	macro.
+	(FT_TRUETYPE_UNPATENTED_H, FT_UNPATENTED_HINTING_H): Define it to
+	`ftparams.h'.
+
+	* include/freetype/ftautoh.h, include/freetype/ftcffdrv.h,
+	include/freetype/ftincrem.h, include/freetype/ftlcdfil.h,
+	include/freetype/ftsnames.h, include/freetype/ftt1drv.h: Include
+	FT_PARAMETER_TAGS_H.
+	Move FT_PARAM_TAG_XXX definitions to...
+	* include/freetype/ftparams.h: ...this new file.
+
+	* include/freetype/ttunpat.h: Remove.  No longer needed.
+
+2017-12-05  Werner Lemberg  <wl@gnu.org>
+
+	Improve tracing messages by using singular and plural forms.
+
+	* src/*/*.c: Implement it.
+
+2017-12-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Allow shared points in `cvar' table (#52532).
+
+	* src/truetype/ttgxvar.c (tt_face_vary_cvt): Implement it by copying
+	and adjusting the corresponding code from
+	`TT_Vary_Apply_Glyph_Deltas'.
+
+2017-11-28  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improving tracing of composite glyphs.
+
+	* src/truetype/ttgload.c (TT_Load_Composite_Glyph)
+	[FT_DEBUG_LEVEL_TRACE]: Show composite glyph information.
+
+2017-11-27  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Allow (again) `/Encoding' with >256 elements (#52464).
+
+	In version 2.6.1, this has been disallowed to better reject
+	malformed fonts; however, this restriction was too strong.  This
+	time, we only take the first 256 elements into account, since
+	encoding arrays are always accessed with a 8bit integer, according
+	to the PostScript Language Reference.
+
+	* src/type1/t1load.c (parse_encoding): Implement it.
+
+2017-11-27  Jan Alexander Steffens (heftig)  <jan.steffens@gmail.com>
+
+	Fix last commit (#52522).
+
+	* builds/freetype.mk: Set `FT_OPTION_H' and `FTOPTION_FLAG'
+	properly if we have `ftoption.h' in `BUILD_DIR'.
+
+2017-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[unix] Install a massaged `ftoption.h' file (#51780).
+
+	* builds/unix/configure.raw (ftoption_set, ftoption_unset): New
+	auxiliary functions to construct...
+	(FTOPTION_H_SED): ... this new variable.
+	Apply it as a sed argument while copying `ftoption.h' to the
+	`builds/unix' directory (using `AC_CONFIG_FILES').
+	Simplify code of test that checks cpp's computation of bit length
+	(the test previously created an empty `ftoption.h' file and deleted
+	it immediately afterwards); without this change, it can happen on my
+	GNU/Linux box that `configure's execution of `config.status' doesn't
+	create `ftoption.h' (no idea why this happens).
+
+	* builds/unix/install.mk (install): Install
+	`builds/unix/ftoption.h'.
+
+	* builds/unix/unix-def.in (DISTCLEAN): Updated.
+
+	* builds/unix/.gitignore: Updated.
+
+2017-11-23  Tor Andersson  <tor.andersson@artifex.com>
+
+	Silence unused function warnings (#52465).
+
+	Some static function declarations cause unused function warnings if
+	certain config options are turned off via `ftoption.h'.
+
+	* src/base/ftbase.h, src/base/ftrfork.c, src/sfnt/ttbdf.h,
+	src/truetype/ttgxvar.h: Add #ifdef guards around these sections.
+
+2017-11-22  Ewald Hew  <ewaldhew@gmail.com>
+
+	* src/psaux/psft.c (cf2_setGlyphWidth): Check format before setting.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4377
+
+2017-11-22  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Fix CFF advance widths. (#52466)
+
+	Glyph advance widths were being written to the new `PS_Decoder' but not
+	saved to the underlying format specific decoder. This caused pure CFF
+	fonts to have bad advance width.
+
+	* include/freetype/internal/psaux.h (PS_Decoder): Change `glyph_width'
+	field to pointer.
+	Remove unused fields.
+	* src/psaux/psobjs.c (ps_decoder_init): Change `glyph_width' from copy
+	to reference.
+	Remove unused.
+	* src/psaux/psft.c (cf2_setGlyphWidth): Update code.
+
+2017-11-15  Vlad Tsyrklevich  <vtsyrklevich@google.com>
+
+	* include/freetype/ftrender.h: Fix `FT_Renderer_RenderFunc' type.
+
+2017-11-14  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	Use Adobe hinting engine for `light' hinting of both CFF and Type 1.
+
+	Since Ewald Hew factored the Adobe hinting engine out of the CFF
+	driver code, we can now use it on Type 1 (and CID) font formats, as
+	both have the same hinting philosophy.
+
+	This change activates the Adobe hinter when in LIGHT mode, and
+	therefore always unless explicitly asking for the auto-hinter.  This
+	makes LIGHT behavior consistent with CFF fonts.  As of this commit,
+	the hinting engine table looks as follows.
+
+	             LIGHT  NORMAL
+	  -------------------------
+	   TrueType  Auto   v40
+	   CFF       Adobe  Adobe
+	   Type 1    Adobe  Adobe
+
+2017-11-10  Yuri Levchenko  <yuri_levchenko@boolat.com>
+
+	* CMakeLists.txt: Add `DISABLE_FORCE_DEBUG_PREFIX' option.
+
+2017-11-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Relocate condition.
+
+2017-11-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_set_cell): Fix uninitialized variables.
+
+2017-11-03  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Fix PostScript interpreter rewinding in Type 1 mode. (#52251)
+
+	The interpreter in Type 1 mode rewinds the charstring after collecting
+	all hints for building the initial hintmap (commit d52dd7f). However,
+	some charstrings use `endchar' in a final subroutine call, rewinding to
+	the start of that subroutine, and only a small section of the actual
+	glyph is drawn.
+
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdENDCHAR>:
+	Ensure we are on the top level charstring before rewinding.
+
+2017-11-03  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[truetype] Add more tricky fonts.
+
+	See the report by Yang Yinsen.
+	https://lists.gnu.org/archive/html/freetype-devel/2017-11/msg00000.html
+
+	* src/truetype/ttobjs.c (trick_names): Add `DFGothic-EB',
+	`DFGyoSho-Lt', `DFHSGothic-W5', `DFHSMincho-W3' and `DFHSMincho-W7'.
+	(tt_check_trickyness_sfnt_ids): Add checksums for DFGothic-EB,
+	DFGyoSho-Lt, DFHSGothic-W5, DFHSMincho-W3 and DFHSMincho-W7.  Also
+	add checksums for DLCLiShu and DLCHayBold which their family names
+	were already listed but their checksums were previously unknown.
+
+2017-11-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Fix complex rendering at high ppem.
+
+	We used to split large glyphs into horizontal bands and continue
+	bisecting them still horizontally if that was not enough.  This is
+	guaranteed to fail when a single scanline cannot fit into the
+	rendering memory pool.  Now we bisect the bands vertically so that
+	the smallest unit is a column of the band height, which is guranteed
+	to fit into memory.
+
+	* src/smooth/ftgrays.c (gray_convert_glyph): Implement it.
+
+2017-10-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Improve complex rendering at high ppem.
+
+	At large sizes almost but not exactly horizontal segments can quickly
+	drain the rendering pool. This patch at least avoids filling the pool
+	with trivial cells. Beyond this, we can only increase the pool size.
+
+	Reported, analyzed, and tested by Colin Fahey.
+
+	* src/smooth/ftgrays.c (gray_set_cell): Do not record trivial cells.
+
+2017-10-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Improve tracing in FT_Load_Glyph, FT_*_Size.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Tag tracing messages with
+	function name, glyph index, and load flags.
+	(FT_Select_Metrics, FT_Request_Metrics): Remove all tracing.
+	(FT_Select_Size, FT_Request_Size): Improve tracing.
+
+2017-10-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Improve tracing in FT_Render_Glyph.
+
+	* src/base/ftobjs.c (FT_Render_Glyph_Internal): Add total coverage
+	calculations and downgrade Netpbm dump to bitmap:7.
+
+2017-10-15  Ewald Hew  <ewaldhew@gmail.com>
+
+	[cff] Fix segfault on missing `psaux' (#52218)
+
+	* src/cff/cffload.c (cff_done_blend): Add a check for possible nullptr.
+
+	* modules.cfg: Update dependency list.
+
+2017-10-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base, cff] Fix MSVC warnings.
+
+	* src/base/ftobjs.c (FT_New_Library): C4702: unreachable code.
+	(ft_glyphslot_preset_bitmap): C4244: possible loss of data.
+	* src/cff/cffload.c (cff_blend_doBlend): C4244: possible loss of data.
+	Turn `sum' into unsigned.
+
+2017-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Netpbm image tracing.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Trace bitmap size.
+	(FT_Render_Glyph_Internal): Trace bitmap in Netpbm format.
+
+	* src/smooth/ftgrays.c (gray_sweep): Sweep remnants of span tracing.
+
+2017-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* builds/windows/ftdebug.c (FT_Message): Print to stderr.
+	* builds/wince/ftdebug.c (FT_Message): Ditto.
+
+2017-10-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[afshaper] Delay creating `hb_set' objects until needed.
+
+	In runs on Noto Naskh Arabic, this results in 89 sets created
+	instead of 340 before.  Makes auto-hinter setup with HarfBuzz
+	enabled 20% to 30% faster.
+
+	* src/autofit/afshaper.c (af_shaper_get_coverage): Implement it.
+
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
+
+	[type1, cid] Add hinting engine switch.
+
+	Implement property service in `type1' and `cid' drivers to allow
+	switching between FreeType or Adobe hinting engine when both are
+	available.
+
+	* src/cid/cidriver.c (cid_property_{set,get}, cid_services),
+	src/type1/t1driver.c (t1_property_{set,get}, t1_services): Add
+	Properties service.
+
+	* src/cid/cidobjs.c (cid_driver_init), src/type1/t1objs.c
+	(T1_Driver_Init): Add default property values.
+
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
+
+	Add T1_CONFIG_OPTION_OLD_ENGINE configuration option.
+
+	This controls whether the old Type 1 engine gets compiled into FreeType.
+	It is disabled by default.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(T1_CONFIG_OPTION_OLD_ENGINE): New macro.
+
+	* include/freetype/internal/psaux.h (PS_Decoder): Remove unused field.
+	* include/freetype/internal/psaux.h, src/cid/cidgload.c
+	(cid_load_glyph), src/psaux/psauxmod.c, src/psaux/psobjs.c
+	(ps_builder_add_point), src/psaux/t1decode.c
+	(t1_lookup_glyph_by_stdcharcode, t1_decoder_parse_glyph,
+	t1operator_seac, t1_decoder_parse_charstrings), src/psaux/t1decode.h,
+	src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Surround
+	relevant code with macro.
+	Minor code changes.
+
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
+
+	Extract width parsing from Type 1 parser.
+
+	Duplicate the fast advance width calculations from the old parser.
+	This is to facilitate adding options for compiling out the old parser.
+
+	* src/psaux/t1decode.{c,h} (t1_decoder_parse_metrics): New function.
+	* include/freetype/internal/psaux.h (T1_Decoder_Funcs): New entry
+	`parse_metrics'.
+	* src/psaux/psauxmod.c: Set the new entry.
+
+	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String),
+	src/cid/cidgload.c (cid_load_glyph): Separate
+	conditional for selecting engine.
+
+2017-10-09  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftoutln.c (FT_Outline_Translate): Fix integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/chromium/issues/detail?id=772775
+
+2017-10-08  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3579
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Adjust behaviour of PS font names for variation fonts.
+
+	* src/sfnt/sfdriver.c (sfnt_get_var_ps_name): Use a named instance's
+	PS name only if no variation is applied.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Adjust behaviour of named instances.
+
+	This commit completely separates the interaction between named
+	instances and variation functions.  In particular, resetting the
+	variation returns to the current named instance (if set) and not to
+	the base font.
+
+	As a side effect, variation functions no longer change the named
+	instance index.
+
+	* src/cff/cffobjs.c (cff_face_init): Use MM service's `set_instance'
+	function.
+	Also apply `MVAR' table to named instances.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Add cast.
+	(tt_set_mm_blend): No longer check whether requested variation
+	coincides with a named instance.
+	(TT_Set_Var_Design): Use current named instance for default
+	coordinates.
+	* src/truetype/ttobjs.c (tt_face_init): Use `TT_Set_Named_Instance'.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	Make `FT_Set_Named_Instance' work.
+
+	* src/cff/cffdrivr.c (cff_set_instance): New function.
+	(cff_service_multi_masters): Register it.
+
+	* src/truetype/ttgxvar.c (TT_Set_Named_Instance): New function.
+	* src/truetype/ttgxvar.h: Updated.
+	* src/truetype/ttdriver.c (tt_service_gx_multi_masters): Register
+	it.
+
+	* src/type1/t1load.c (T1_Reset_MM_Blend): New function.
+	* src/type1/t1load.h: Updated.
+	* src/type1/t1driver.c (t1_service_multi_masters): Register it.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	Make `FT_FACE_FLAG_VARIATION' work.
+
+	* include/freetype/internal/tttypes.h (TT_Face): Remove
+	`is_default_instance'; this can be replaced with a combination of
+	`FT_IS_VARIATION' and `FT_IS_INSTANCE'.
+
+	* src/cff/cffdrivr.c (cff_get_advances): Updated.
+
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name), src/sfnt/sfobjs.c
+	(sfnt_init_face): Updated.
+
+	* src/truetype/ttdriver.c (tt_get_advances), src/truetype/ttgload.c
+	(TT_Process_Simple_Glyph, load_truetype_glyph, IS_DEFAULT_INSTANCE),
+	src/truetype/ttgxvar.c (tt_set_mm_blend): Updated.
+	* src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design):
+	Handle `FT_FACE_FLAG_VARIATION'.
+
+	* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Handle
+	`FT_FACE_FLAG_VARIATION'.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	New function `FT_Set_Named_Instance'.
+
+	No effect yet.
+
+	* src/base/ftmm.c (FT_Set_Named_Instance): New function.
+
+	* include/freetype/ftmm.h: Updated.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	Add macros for checking whether a font variation is active.
+
+	* include/freetype/freetype.h (FT_FACE_FLAG_VARIATION,
+	FT_IS_VARIATION): New macros.
+	No effect yet.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	Add framework for setting named instance in MM service.
+
+	* include/freetype/internal/services/svmm.h (FT_Set_Instance_Func):
+	New function typedef.
+	(MultiMasters): Add `set_instance' member.
+	(FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
+
+	* src/cff/cffdrivr.c (cff_service_multi_masters),
+	src/truetype/ttdriver (tt_service_gx_multi_masters),
+	src/type1/t1driver.c (t1_service_multi_masters): Updated.
+
+2017-10-07  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Minor code shuffling.
+
+	* src/type1/t1load.c (T1_Set_MM_Blend): Make it a wrapper of...
+	(t1_set_mm_blend): ...this new function.
+	(T1_Set_MM_Design): Use `t1_set_mm_blend'.
+
+2017-10-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Fix integer
+	overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3539
+
+2017-10-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix compiler warnings.
+
+	* src/cff/cffdrivr.c (cff_ps_get_font_extra): Avoid code that relies
+	on numeric overflow.
+	Add cast.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Fix variable
+	types, add cast.
+
+2017-10-04  John Tytgat  <John.Tytgat@esko.com>
+
+	[cff] Add support for `FSType'.
+
+	* include/freetype/internal/cfftypes.h (CFF_FontRec): Add
+	`font_extra' entry.
+
+	* src/cff/cffdrivr.c (cff_ps_get_font_extra): New function to
+	retrieve FSType info from the embedded PostScript data.
+	(cff_service_ps_info): Register function.
+
+	* src/cff/cffload.c (cff_font_done): Free `font_extra'.
+
+2017-09-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Signedness fixes in bitmap presetting.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3514.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Exlicitly signed height.
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Ditto.
+	* src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Explicitly unsigned
+	subtraction.
+
+2017-09-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Bitmap metrics presetting [2/2].
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Preset the bitmap metrics when
+	appropriate but `FT_Render_Glyph' is not called.
+	* include/freetype/freetype.h (FT_GlyphSlotRec): Document the change.
+
+2017-09-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth, raster] Miscellaneous cleanups.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Clean up the exit.
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Reduce
+	translations and clean up the exit.
+	(ft_smooth_render_lcd, ft_smooth_render_lcd): Remove unused `error'.
+
+2017-09-28  Ben Wagner  <bungeman@google.com>
+
+	[truetype] Really, really fix #52082.
+
+	* src/truetype/ttinterp.c (Ins_MDRP): Correct conditional.
+
+2017-09-28  Werner Lemberg  <wl@gnu.org>
+
+	* src/psaux/psintrp.c (cf2_doStems): Fix integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3510
+
+2017-09-28  Ewald Hew  <ewaldhew@gmail.com>
+
+	* src/cid/cidgload.c (cid_slot_load_glyph): Fix memory leak.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3489
+
+2017-09-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Bitmap metrics presetting [1/2].
+
+	This mainly just extracts the code for presetting the bitmap metrics
+	from the monochrome, grayscale, and LCD renderers into a separate
+	function.
+
+	* src/base/ftobjs.c (ft_glyphslot_preset_bitmap): New function that
+	calculates prospective bitmap metrics for the given rendering mode.
+	* include/freetype/internal/ftobjs.h (ft_glyphslot_preset_bitmap):
+	Declare it.
+
+	* src/base/ftlcdfil.c (ft_lcd_padding): New helper function that adds
+	padding to CBox taking into account pecularities of LCD rendering.
+	* include/freetype/ftlcdfil.h (ft_lcd_padding): Declare it.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Reworked to use
+	`ft_glyphslot_preset_bitmap'.
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Ditto.
+	(ft_smooth_render_lcd, ft_smooth_render_lcd): The pixel_mode setting
+	is moved to `ft_glyphslot_preset_bitmap'.
+
+2017-09-28  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Fix compiler warning.
+
+	* src/psaux/pshints.c (cf2_hintmap_dump): Add switch for tracing
+	code.
+
+2017-09-27  Werner Lemberg  <wl@gnu.org>
 
 	* src/sfnt/ttload.c (tt_face_load_font_dir): Fix compiler warning.
 
-	Found by Alexei.
+2017-09-25  Werner Lemberg  <wl@gnu.org>
 
-2015-03-05  Alexei Podtelezhnikov <apodtele@gmail.com>
+	[psaux] Fix compiler warnings.
 
-	* src/base/ftstroke.c: Simplify.
+	* src/psaux/psft.c (cf2_initLocalRegionBuffer): Remove redundant
+	test.
 
-2015-03-04  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/psintrp.c (cf2_interpT2CharString)
+	<cf2_escCALLOTHERSUBR>: Add casts.
 
-	[truetype] Some fixes and code refactoring in `ttgxvar.c'.
+	* src/psaux/psobjs.c (ps_decoder_init): Add cast.
 
-	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix return value
-	of `point_cnt' if two bytes are read.
-	Use a more vertical coding style.
-	(ft_var_readpackeddeltas): Use FT_UInt for `delta_cnt' parameter.
-	Use a more vertical coding style.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-03-03  Werner Lemberg  <wl@gnu.org>
+	[psaux] Minor fixes.
 
-	[autofit] Fix Savannah bug #44241.
+	* include/freetype/internal/psaux.h, src/psaux/psobjs.{c,h}:
+	Rearrange `ps_builder_init' arguments to conventional order.
 
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Reject glyphs
-	with less than 3 points.
+	* src/psaux/psft.c (cf2_decoder_parse_charstrings): Add a check and
+	notice for `SubFont' in Type 1 mode.
 
-2015-03-02  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	Simplify `TYPEOF' macro.
+	[psaux] Move `psdecode' into `psobjs'.
 
-	No need for two arguments.
+	As the former only contains a single procedure, move it into
+	`psobjs' for simplicity.  Also change the parameter order to the
+	conventional one.
 
-	* include/config/ftconfig.h, builds/unix/ftconfig.in,
-	builds/vms/ftconfig.h (TYPEOF): Updated.
+	* src/psaux/psdecode.c (ps_decoder_init): Moved to...
+	* src/psaux/psobjs.c: ...Here.
+	* src/psaux/psdecode.h, src/psaux/psobjs.h: Ditto.
 
-	* include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR),
-	src/autofit/afwarp.h (AF_WARPER_FLOOR): Updated.
+	* include/freetype/internal/psaux.h (PSAux_ServiceRec): Update
+	`ps_decoder_init' function signature.
 
-2015-03-01  Werner Lemberg  <wl@gnu.org>
+	* src/cff/cffgload.c, src/cid/cidgload.c, src/type1/t1gload.c:
+	Update calls.
 
-	Various compiler warning fixes for `make multi'.
+	* src/psaux/psaux.c, src/psaux/psauxmod.c: Update includes.
 
-	* src/autofit/afcjk.c (af_cjk_hints_compute_blue_edges),
-	src/autofit/aflatin.c (af_latin_hint_compute_blue_edges,
-	af_latin_hint_edges), src/autofit/aflatin2.c
-	(af_latin2_hints_compute_blue_edges, af_latin2_hint_edges): Declare
-	as `static'.
+	* src/psaux/Jamfile (_sources), src/psaux/rules.mk (PSAUX_DRV_SRC):
+	Update file references.
 
-	* src/cache/ftccmap.c (FTC_CMAP_QUERY_HASH, FTC_CMAP_NODE_HASH):
-	Removed.  Unused.
-	* src/cache/ftcimage.c: Include FT_INTERNAL_OBJECTS_H.
-	* src/cache/ftcmanag.c (FTC_LRU_GET_MANAGER): Removed.  Unused.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/cff/cf2intrp.c: Include `cf2intrp.h'.
-	* src/cff/cffdrivr.c (PAIR_TAG): Removed.  Unused.
+	[psaux] Fix Type 1 hinting.
 
-	* src/gzip/ftgzip.c (NO_DUMMY_DECL): Removed.  Unused.
+	Type 1 hinting breaks sometimes when mid-charstring hints should
+	have been in the initial hintmap.  This fix adds a preprocessing
+	pass that reads all hints and builds the correct initial hintmap
+	first, before proceeding to build the glyph outline.
 
-	* src/psaux/afmparse.c (afm_parser_read_int): Declare as `static'.
+	* src/psaux/psintrp.c (cf2_interpT2CharString): New
+	`initial_map_ready' boolean flag.
+	Ignore outline commands and hint changes on first pass.
+	<cf2_cmdENDCHAR>: Add section to build hintmap and rewind.
 
-	* src/pshinter/pshalgo.c (STRONGER, PSH_ZONE_MIN, PSH_ZONE_MAX):
-	Removed.  Unused.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/raster/ftraster.c (Render_Glyph): Declare as `static'.
+	[psaux] Add tracing for hints.
 
-	* src/sfnt/ttpost.c (load_format_20): Fix signedness warning.
+	* src/psaux/pshints.c (cf2_hintmap_dump): New function.
+	(cf2_hintmap_insertHint): Trace incoming and inserted hints.
+	(cf2_hintmap_build): Dump hintmap before and after hint adjustment.
 
-	* src/truetype/ttdriver.c (PAIR_TAG): Removed.  Unused.
-	* src/truetype/ttsubpix.c (is_member_of_family_class,
-	is_member_of_style_class): Declare as `static'.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Declare
-	as `static'.
-	* src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): Declare as
-	`static'.
-	(T1_FIELD_COUNT): Removed.  Unused.
-	* src/type1/t1parse.h (T1_Done_Table): Removed.  Unused.
+	[psaux] Minor fixes.
 
-	* src/type42/t42parse.c (T1_Done_Table): Removed.  Unused.
+	* src/psaux/psintrp.c (cf2_interpT2CharString): Fix check for pop
+	results.
+	s/font->decoder/decoder/ where necessary.
+	<cf2_cmdHSTEM, cf2_cmdVSTEM, cf2_escHSTEM3, cf2_escVSTEM3>: Use
+	offset parameter in `cf2_doStems' instead of doing correction for
+	left-sidebearing.
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	[psaux] Signedness fixes.
+	[cid] Use the new engine.
 
-	* include/internal/psaux.h, src/psaux/afmparse.c,
-	src/psaux/afmparse.h, src/psaux/psconv.c, src/psaux/psobjs.c,
-	src/psaux/t1cmap.c, src/psaux/t1decode.c: Apply.
+	* src/cid/cidgload.c: Update includes.
+	(cid_load_glyph, cid_slot_load_glyph): Implement changes to glyph
+	loading code as with `type1' module.
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	[otvalid] Signedness fixes.
+	[cid] Add Adobe engine configuration.
 
-	* src/otvalid/otvcommn.c, src/otvalid/otvgdef.c,
-	src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, src/otvalid/otvmath.c:
-	Apply.
+	This is similar to what was done in the `type1' module.
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	* src/cid/cidriver.c (t1cid_driver_class): Update declaration.
+	* src/cid/cidobjs.c: Include FT_TYPE1_DRIVER_H.
+	(cid_driver_init): Update code.
 
-	* src/bzip2/ftbzip2.c (ft_bzip2_alloc): Signedness fix.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	[psaux] Change subfont synthesis for CID fonts.
 
-	[lzw] Signedness fixes.
+	Change `t1_make_subfont' to take in the Private dict record as an
+	argument.  This is because Type 1 and CID font records in FreeType
+	have this in different places.
 
-	* src/lzw/ftzopen.c, src/lzw/ftzopen.h: Apply.
+	* src/psaux/psobjs.c (t1_make_subfont): Change `T1_Face' to
+	`FT_Face' so that CID is also accepted.
+	Take `PS_Private' as an argument and let caller figure out where the
+	Private dict actually is.
+	Update references.
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	* include/freetype/internal/psaux.h, src/psaux/psobjs.h: Update
+	declaration.
 
-	[gxvalid] Signedness fixes.
+	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Update
+	call.
 
-	* src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c,
-	src/gxvalid/gxvcommn.h, src/gxvalid/gxvjust.c,
-	src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c,
-	src/gxvalid/gxvmort1.c, src/gxvalid/gxvmort2.c,
-	src/gxvalid/gxvmorx.c, src/gxvalid/gxvmorx1.c,
-	src/gxvalid/gxvmorx2.c, src/gxvalid/gxvopbd.c,
-	src/gxvalid/gxvprop.c, src/gxvalid/gxvtrak.c: Apply.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	[type1] Switch to Adobe engine.
 
-	[cache] Signedness fixes.
+	* src/type1/t1objs.c (T1_Driver_Init): Set default to Adobe engine.
 
-	* src/cache/ftcbasic.c, src/cache/ftccmap.c, src/cache/ftcimage.c,
-	src/cache/ftcmanag.c, src/cache/ftcsbits.c: Apply.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (seac).
 
-	Change dimension fields in `FTC_ImageTypeRec' to unsigned type.
+	This concludes the changes needed to add Type 1 support.
 
-	This doesn't break ABI.
+	* src/psaux/psintrp.c: Update includes.
+	(cf2_interpT2CharString) <cf2_escSEAC>: Implement this similarly to
+	implied seac for CFF.
 
-	* include/ftcache.h (FTC_ImageTypeRec): Use unsigned types for
-	`width' and `height'.
+	* src/psaux/t1decode.c (t1_lookup_glyph_by_stdcharcode_ps): New
+	function to look up the glyph index.
 
-	* docs/CHANGES: Document it.
+	* src/psaux/psft.c (cf2_getT1SeacComponent,
+	cf2_freeT1SeacComponent): New functions to get the charstrings for
+	seac components.
 
-2015-02-25  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/t1decode.h, src/psaux/psft.h: Update declarations.
 
-	[cache] Don't use `labs'.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	This is the only place in FreeType where this function was used.
+	[psaux] Extend Adobe interpreter (flex in callothersubr).
 
-	* include/config/ftstdlib.h (ft_labs): Remove.
+	* src/psaux/psintrp.c (cf2_interpT2CharString)
+	<cf2_escCALLOTHERSUBR>: Fix Flex feature handling (OtherSubrs 0, 1,
+	2).
+	<cf2_cmdRMOVETO>: Do not actually move the `glyphPath' while doing
+	flex.  This is to avoid closing the current contour.
 
-	* src/cache/ftcimage.c (ftc_inode_weight): Replace `ft_labs' with
-	`FT_ABS'.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-23  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (callothersubr).
 
-	[cache] Replace `FT_PtrDist' with `FT_Offset'.
+	* src/psaux/psintrp.c (cf2_interpT2CharString)
+	<cf2_escCALLOTHERSUBR>: Copy code from
+	`t1_decoder_parse_charstrings' (in `t1decode.c').
+	OtherSubr 3 (change hints) should reset the hintmask, so that the
+	new hints are applied.
+	Fix function calls and stack access.
 
-	* src/cache/ftccache.h (FTC_NodeRec): `FT_Offset' (a.k.a. `size_t')
-	is a better choice for `hash' to hold a pointer than `FT_PtrDist'
-	(a.k.a. `ptrdiff_t'), especially since the latter is signed,
-	causing zillions of signedness warnings.  [Note that `hash' was of
-	type `FT_UInt32' before the change to `FT_PtrDist'.]
-	Update all users.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/cache/ftcbasic.c, src/cache/ftccache.c, src/cache/ftccmap.c,
-	src/cache/ftcglyph.c, src/cache/ftcglyph.h: Updated.
+	[psaux] Extend Adobe interpreter (pop).
 
-2015-02-23  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/psintrp.c (cf2_interpT2CharString): Change how unhandled
+	OtherSubr results are stored.  Implement the PostScript stack using
+	an array.
+	<cf2_escPOP>: Ensure that the stack is not cleared after getting
+	`OtherSubr' results.
+	Fix stack access.
 
-	[smooth, raster] Re-enable standalone compilation.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/raster/ftraster.c (FT_RENDER_POOL_SIZE, FT_MAX)
-	[_STANDALONE_]: Define macros.
+	[psaux] Extend Adobe interpreter (callsubr).
 
-	* src/smooth/ftgrays.c (FT_RENDER_POOL_SIZE, FT_MAX, FT_ABS,
-	FT_HYPOT) [_STANDALONE_]: Define macros.
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdCALLSUBR>:
+	Type 1 mode.
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/psft.c (cf2_initLocalRegionBuffer): Add Type 1 mode.
 
-	[smooth] Signedness fixes.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/smooth/ftgrays.c, src/smooth/ftsmooth.c: Apply.
+	[psaux] Extend Adobe interpreter (div, four-byte numbers).
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_escDIV>: Add
+	Type 1 mode.  Type 1 requires large integers to be followed by
+	`div'; cf. `Adobe Type 1 Font Format', section 6.2.
+	<op == 255>: Push Type 1 four-byte numbers as `Int' always.  This is
+	to ensure `div' and `callsubr' get values they can use.
 
-	* src/raster/ftraster.c: Use the file's typedefs everywhere.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (hints).
 
-	* src/sfnt/ttpost.c (load_format_20): Fix error tracing message.
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
+	cf2_cmdVSTEM>: Add correction for left sidebearing in Type 1 mode.
+	Allow adding hints mid-charstring.
+	<cf2_escVSTEM3, cf2_escHSTEM3>: Translate into equivalent commands
+	for three normal stem hints.  This requires some recalculation of
+	stem positions.
+	Correction for left sidebearing.
 
-	Bug introduced 6 commits earlier.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (hsbw, sbw).
 
-	[pshinter] Fix thinko.
+	* src/psaux/psintrp.c (cf2_doStems): `hsbw' or `sbw' must be the
+	first operation in a Type 1 charstring.
+	(cf2_interpT2CharString): Remove unused variables.
+	<cf2_cmdHMOVETO, cf2_cmdVMOVETO, cf2_cmdRMOVETO>: `hsbw' or `sbw'
+	must be the first operation in a Type 1 charstring.
+	<cf2_cmdHSBW, cf2_escSBW>: Fix data access and add correction for
+	left sidebearing.
 
-	* src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Correctly
-	check `count'.
-	Bug introduced two commits earlier.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (setcurrentpoint).
 
-	[raster] Signedness fixes.
+	* src/psaux/psintrp.c (cf2_interpT2CharString)
+	<cf2_escSETCURRENTPT>: Fix stack access.
 
-	* src/raster/ftraster.c, src/raster/ftrend1.c: Apply.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	[psaux] Extend Adobe interpreter (closepath).
 
-	[pshinter] Signedness fixes.
+	* src/psaux/psintrp.c (cf2_interpT2CharString) <c2f_cmdCLOSEPATH>:
+	Use the right builder function.  We can use the `haveWidth' boolean
+	already present, instead of implementing `parse_state'.
 
-	* src/pshinter/pshalgo.c, src/pshinter/pshglob.c,
-	src/pshinter/pshrec.c: Apply.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	[psaux] Add Type 1 operations to Adobe CFF interpreter.
 
-	[pshinter] Use macros for (unsigned) flags, not enumerations.
+	The following Type 1 specific ops have been added (copied from
+	`t1decode'):
 
-	* src/pshinter/pshalgo.h (PSH_Hint_Flags): Replace with macros.
-	Updated.
-	* src/pshinter/pshrec.h (PS_Hint_Flags): Replace with macros.
+	  closepath
+	  vstem3
+	  hstem3
+	  seac
+	  sbw
+	  callothersubr
+	  pop
+	  setcurrentpoint
+	  hsbw
 
-2015-02-22  Werner Lemberg  <wl@gnu.org>
+	The following require a Type 1 mode, because of differences in
+	specification:
 
-	* src/pshinter/pshrec.c: Simplify.
-	(ps_hints_open, ps_hints_stem): Remove switch statement.
-
-2015-02-22  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Signedness fixes.
-
-	* src/sfnt/pngshim.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap.c,
-	src/sfnt/ttkern.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
-	src/sfnt/ttsbit.c: Apply.
-	* src/sfnt/sfdriver.c: Apply.
-	(sfnt_get_ps_name): Simplify.
-
-2015-02-22  Werner Lemberg  <wl@gnu.org>
-
-	[bdf] Signedness fixes.
-
-	* src/bdf/bdf.h, src/bdf/bdfdrivr.c, src/bdf/bdfdrivr.h,
-	src/bdf/bdflib.c: Apply.
-
-2015-02-22  Werner Lemberg  <wl@gnu.org>
-
-	* src/bdf/bdflib.c (_bdf_atous): New function.
-	(_bdf_parse_glyphs, _bdf_parse_start): Use it.
-
-2015-02-22  Werner Lemberg  <wl@gnu.org>
-
-	[pcf] Signedness fixes.
-
-	* src/pcf/pcf.h, src/pcf/pcfdrivr.c: Apply.
-	* src/pcf/pcfread.c: Apply.
-	(pcf_get_encodings): Ignore invalid negative encoding offsets.
-
-2015-02-21  Werner Lemberg  <wl@gnu.org>
-
-	* src/winfonts/winfnt.c: Signedness fixes.
-
-2015-02-21  Werner Lemberg  <wl@gnu.org>
-
-	[type42] Signedness fixes.
-
-	* src/type42/t42parse.c, src/type42/t42parse.h,
-	src/type42/t42types.h: Apply.
-
-2015-02-21  Werner Lemberg  <wl@gnu.org>
-
-	[pfr] Signedness fixes.
-
-	* src/pfr/pfrdrivr.c, src/pfr/pfrgload.c, src/pfr/pfrload.c,
-	src/pfr/pfrload.h, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c,
-	src/pfr/pfrtypes.h: Apply.
-
-2015-02-21  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Minor signedness fixes related to last commit.
-
-	* src/cff/cf2ft.c, src/cff/cf2intrp.c, src/cff/cffgload.c: Apply.
-
-2015-02-20  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Thinkos in bias handling.
-
-	Only the final result is always positive.
-
-	Bug introduced three commits earlier.
-
-	* src/cff/cffgload.c, src/cff/cffgload.h: Apply.
-
-2015-02-20  Werner Lemberg  <wl@gnu.org>
-
-	[cid] Fix signedness issues and emit some better error codes.
-
-	* src/cid/cidgload.c, src/cid/cidload.h, src/cid/cidobjs.c,
-	src/cid/cidparse.h: Apply.
-	* src/cid/cidload.c: Apply.
-	(parse_fd_array): Reject negative values for number of dictionaries.
-	* src/cid/cidparse.c: Apply.
-	(cid_parser_new): Reject negative values for hex data length.
-
-2015-02-20  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Signedness fixes for new engine.
-
-	* src/cff/cf2arrst.c, src/cff/cf2fixed.h, src/cff/cf2ft.c,
-	src/cff/cf2ft.h, src/cff/cf2hints.c, src/cff/cf2intrp.c: Apply.
-
-2015-02-20  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Signedness fixes for basic infrastructure and old engine.
-
-	* include/internal/pshints.h, src/cff/cffdrivr.c,
-	src/cff/cffgload.c, src/cff/cffgload.h, src/cff/cffload.c,
-	src/cff/cffobjs.c, src/cff/cffparse.c, src/pshinter/pshrec.c: Apply.
-
-2015-02-19  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Ignore `countSizePairs'.
-
-	This is hard-coded to value 2 in `fvar' version 1.0 (and no newer
-	version exists), but some fonts set it incorrectly.
-
-	Problem reported by Adam Twardoch <adam@fontlab.com>.
-
-2015-02-19  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Emit better error code for invalid private dict size.
-
-	* src/cff/cffparse.c (cff_parse_private_dict): Reject negative
-	values for size and offset.
-
-2015-02-19  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix signedness issues.
-
-	* src/autofit/afangles.c, src/autofit/afcjk.c,
-	src/autofit/afglobal.c, src/autofit/afhints.c,
-	src/autofit/aflatin.c, src/autofit/aflatin2.c, src/autofit/afwarp.c,
-	src/autofit/hbshim.c: Apply.
-
-2015-02-19  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Use macros for (unsigned) flags, not enumerations.
-
-	This harmonizes with other code in FreeType (and reduces the number
-	of necessary casts to avoid compiler warnings).
-
-	* src/autofit/afblue.hin: Make flag macros unsigned.
-	* src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/afcjk.h: Replace flag enumeration with macros.
-	* src/autofit/afcjk.c: Updated.
-
-	* src/autofit/afhints.h (AF_Flags, AF_Edge_Flags): Replace with
-	macros.
-	* src/autofit/afhints.c: Updated.
-
-	* src/autofit/aflatin.h: Replace flag enumerations with macros.
-	* src/autofit/aflatin.c, src/autofit/aflatin2.c: Updated.
-
-	* src/autofit/aftypes.h (AF_ScalerFlags): Replace with macros.
-
-2015-02-18  Werner Lemberg  <wl@gnu.org>
-
-	[type1] Fix signedness issues.
-
-	* include/internal/psaux.h, include/internal/t1types.h,
-	src/psaux/psobjs.c, src/psaux/psobjs.h, src/psaux/t1decode.c,
-	src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1parse.c: Apply.
-
-2015-02-18  Werner Lemberg  <wl@gnu.org>
-
-	[psaux, type1] Fix minor AFM issues.
-
-	* include/internal/t1types.h (AFM_KernPairRec): Make indices
-	unsigned.
-	Update users.
-	(AFM_FontInfoRec): Make element counters unsigned.
-	Update users.
-	* src/psaux/afmparse.h (AFM_ValueRec): Add union member for unsigned
-	int.
-
-	* src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs):
-	Reject negative values for number of kerning elements.
-
-	* src/type1/t1afm.c, src/tools/test_afm.c: Updated.
-
-2015-02-18  Werner Lemberg  <wl@gnu.org>
-
-	Don't use `FT_PtrDist' for lengths.
-
-	Use FT_UInt instead.
-
-	* include/internal/psaux.h (PS_Table_FuncsRec, PS_TableRec,
-	T1_DecoderRec): Do it.
-
-	* include/internal/t1types.h (T1_FontRec): Ditto.
-
-	* src/cid/cidload.c (cid_parse_dict): Updated.
-	* src/pfr/pfrload.c (pfr_extra_item_load_font_id): Ditto.
-	* src/psaux/psobjs.c (ps_table_add), src/psaux/psobjs.h: Ditto.
-	* src/type1/t1load.c (parse_blend_axis_types, parse_encoding,
-	parse_chharstrings, parse_dict): Ditto.
-	* src/type42/t42parse.c (t42_parse_encoding, t42_parse_charstrings,
-	t42_parse_dict): Ditto.
-
-2015-02-18  Werner Lemberg  <wl@gnu.org>
-
-	* src/type1/t1driver.c (t1_ps_get_font_value): Clean up.
-	This handles negative values better, avoiding many casts.
-
-2015-02-17  Werner Lemberg  <wl@gnu.org>
-
-	[base] Fix Savannah bug #44284.
-
-	* src/base/ftcalc.c (FT_MulFix): Typos.
-
-2015-02-17  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Finish compiler warning fixes for signedness issues.
-
-	* src/truetype/ttgxvar.c, src/truetype/ttsubpix.c,
-	src/truetype/ttsubpix.h: Apply.
-
-2015-02-17  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttsubpix.c: Adding missing `static' keywords.
-
-2015-02-17  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More signedness fixes.
-
-	* include/internal/tttypes.h, src/truetype/ttinterp.h,
-	src/truetype/ttobjs.h, src/truetype/ttinterp.c,
-	src/truetype/ttobjs.c: Apply.
-
-2015-02-17  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Various signedness fixes.
-
-	* include/internal/ftgloadr.h, src/truetype/ttpload.c: Apply.
-
-	* src/truetype/ttgload.c: Apply.
-	(TT_Get_VMetrics): Protect against invalid ascenders and descenders
-	while constructing advance height.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	[base] Finish compiler warning fixes for signedness issues.
-
-	* src/base/ftglyph.c, src/base/ftlcdfil.c, src/base/ftstroke.c:
-	Apply.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	* include/tttables.h (TT_OS2): `fsType' must be FT_UShort.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	More minor signedness warning fixes.
-
-	* src/base/ftbbox.c, src/base/ftbitmap.c, src/base/fttrigon.c,
-	src/base/ftutil.c: Apply.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	Next round of minor compiler warning fixes.
-
-	* include/internal/ftrfork.h (FT_RFork_Ref): Change `offset' member
-	type to `FT_Long'.
-	(CONST_FT_RFORK_RULE_ARRAY_BEGIN): Add `static' keyword.
-
-	* include/internal/ftstream.h (FT_Stream_Pos): Return `FT_ULong'.
-
-	* src/base/ftoutln.c, src/base/ftrfork.c, src/base/ftstream.c:
-	Signedess fixes.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	Various minor signedness fixes.
-
-	* include/ftadvanc.h, include/internal/ftobjs.h,
-	src/base/ftgloadr.c, src/base/ftobjs.c: Apply.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	New `TYPEOF' macro.
-
-	This helps suppress signedness warnings, avoiding issues with
-	implicit conversion changes.
-
-	* include/config/ftconfig.h, builds/unix/ftconfig.in,
-	builds/vms/ftconfig.h (TYPEOF): Define.
-
-	* include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR),
-	src/autofit/afwarp.h (AF_WARPER_FLOOR): Use it.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftsystem.c: Use casts in standard C function wrappers.
-	(ft_alloc, ft_realloc, ft_ansi_stream_io, FT_Stream_Open): Do it.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #44261.
-
-	* builds/unix/detect.mk (setup) [unix]: Set `CONFIG_SHELL' in the
-	environment also while calling the configure script.
-
-2015-02-16  Werner Lemberg  <wl@gnu.org>
-
-	* include/internal/ftmemory.h: Add some `FT_Offset' casts.
-	(FT_MEM_SET, FT_MEM_COPY, FT_MEM_MOVE, FT_ARRAY_ZERO, FT_ARRAY_COPY,
-	FT_MEM_MOVE): Do it.
-
-2015-02-15  Werner Lemberg  <wl@gnu.org>
-
-	[base] Clean up signedness issues in `ftdbgmem.c'.
-
-	Also fix other minor issues.
-
-	* src/base/ftdbgmem.c (FT_MemTableRec): Replace all FT_ULong types
-	with FT_Long for consistency.
-	(ft_mem_primes): Change type to `FT_Int'.
-	(ft_mem_closest_prime, ft_mem_table_set): Updated.
-
-	(ft_mem_debug_panic, ft_mem_debug_alloc, ft_mem_debug_free,
-	ft_mem_debug_realloc): Use `static' keyword and fix signedness
-	warnings where necessary.
-
-	(ft_mem_table_resize, ft_mem_table_new, ft_mem_table_destroy,
-	ft_mem_table_get_nodep, ft_mem_debug_init, FT_DumpMemory): Fix types
-	and add or remove casts to avoid signedness warnings.
-
-2015-02-15  Werner Lemberg  <wl@gnu.org>
-
-	[base] Clean up signedness in arithmetic functions.
-
-	This makes the code more readable and reduces compiler warnings.
-
-	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round, FT_MulFix,
-	FT_DivFix): Convert input parameters to unsigned, do the
-	computation, then convert the result back to signed.
-	(ft_corner_orientation): Fix casts.
-
-2015-02-07  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #44184.
-
-	* src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir): No
-	longer reject `htmx' and `vmtx' tables with invalid length but
-	sanitize them.
-
-2015-02-06  Jon Anderson  <jon@websupergoo.com>
-
-	[truetype] Fix regression in the incremental glyph loader.
-
-	* src/truetype/ttgload.c (load_truetype_glyph): For incremental
-	fonts, the glyph index may be greater than the number of glyphs
-	indicated, so guard the check with a preprocessor conditional.
-
-2015-02-06  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix potential memory leak.
-
-	While this doesn't show up with FreeType, exactly the same code
-	leaks with ttfautohint's modified auto-hinter code (which gets used
-	in a slightly different way).
-
-	It certainly doesn't harm since it is similar to already existing
-	checks in the code for embedded arrays.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Set `max_contours'
-	and `max_points' for all cases.
-
-2015-01-31  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add support for Thai script.
-
-	Thanks to Ben Mitchell <ben@rosettatype.com> for guidance with blue
-	zone characters!
-
-	* src/autofit/afblue.dat: Add blue zone data for Thai.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/afscript.h: Add Thai standard characters.
-
-	* src/autofit/afranges.c: Add Thai data.
-
-	* src/autofit/afstyles.h: Add Thai data.
-
-2015-01-23  Behdad Esfahbod  <behdad@behdad.org>
-
-	[raster] Handle `FT_RASTER_FLAG_AA' correctly.
-
-	This fixes a breakage caused by the commit `[raster] Remove
-	5-level gray AA mode from monochrome rasterizer.'.
-
-	Problem reported by Markus Trippelsdorf <markus@trippelsdorf.de>.
-
-	* src/raster/ftraster.c (ft_black_render): Handle
-	`FT_RASTER_FLAG_AA'.
-
-	* src/raster/ftrend1.c (ft_raster1_render): Remove gray AA mode
-	remnants.
-
-2015-01-18  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftobjs.c (FT_New_Library): Fix compiler warning.
-
-2015-01-18  Chris Liddell  <chris.liddell@artifex.com>
-
-	[raster] Fix Savannah bug #44022.
-
-	Add fallback for glyphs with degenerate bounding boxes.
-
-	If a glyph has only one very narrow feature, the bbox can end up
-	with either the width or height of the bbox being 0, in which case
-	no raster memory is allocated and no attempt is made to render the
-	glyph.  This is less than ideal when the drop-out compensation in
-	the rendering code would actually result in the glyph being
-	rendered.
-
-	This problem can be observed with the `I' glyph (gid 47) in the
-	Autodesk RomanS TrueType font.
-
-	* src/raster/ftrend1.c (ft_raster1_render): Add a fallback if either
-	dimension is zero to explicitly round up/down (instead of simply
-	round).
-
-2015-01-17  Werner Lemberg  <wl@gnu.org>
-
-	Add some tools to handle yearly copyright notice updates.
-
-	We are now following the GNU guidelines: A new release automatically
-	means that the copyright year of all affected files gets updated; it
-	is no longer used to track years of modification changes.
-
-	* src/tools/update-copyright-year: New Perl script.
-	* src/tools/update-copyright: New shell script that calls
-	`update-copyright-year' on all files.
-	* src/tools/no-copyright: Exceptions that should not be handled by
-	`update-copyright'
-
-2015-01-14  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CHANGES: Updated, using a description from Behdad.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	* src/autofit/afmodule.c (af_autofitter_done): Fix compiler warning.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Add embedded array of segments and edges.
-
-	Avoids multiple mallocs per typical glyphs.
-
-	With this and recent changes to avoid mallocs, the thread-safe
-	stack-based loader is now as fast as the previous model that had one
-	cached singleton.
-
-	* src/autofit/afhints.h (AF_SEGMENTS_EMBEDDED, AF_EDGES_EMBEDDED):
-	New macros.
-	(AF_AxisHintsRec): Add two arrays for segments and edges.
-
-	* src/autofit/afhints.c (af_axis_hints_new_segment): Only allocate
-	data if number of segments exceeds given threshold value.
-	(af_axis_hints_new_edge):  Only allocate data if number of edges
-	exceeds given threshold value.
-	(af_glyph_hints_done): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Add embedded arrays for points and contours.
-
-	This avoids at least two malloc calls for typical glyphs.
-
-	* src/autofit/afhints.h (AF_POINTS_EMBEDDED, AF_CONTOURS_EMBEDDED):
-	New macros.
-	(AF_GlyphHintsRec): Add two arrays for contours and points.
-
-	* src/autofit/afhints.c (af_glyph_hints_init, af_glyph_hints_done):
-	Updated.
-	(af_glyph_hints_reload): Only allocate data if number of contours or
-	points exceeds given threshold values.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Allocate hints object on the stack.
-
-	This avoids one malloc per load.
-
-	* src/autofit/afloader.h (AF_LoaderRec): Change type of `hints' to
-	`AF_GlyphHints'.
-	Update prototype.
-
-	* src/autofit/afloader.c (af_loader_init): Use `AF_GlyphHints'
-	parameter instead of `FT_Memory'.
-	(af_loader_done): Directly reset `load_hints'.
-	(af_loader_load_g): Updated.
-
-	* src/autofit/afmodule.c (af_autofitter_load_glyph): Use local
-	`hints' object.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Reuse slot glyph loader.
-
-	No need to create a new glyph loader; we can reuse the one from
-	`slot->internal->loader'.  It's hard to tell why it was written that
-	way originally, but new code looks sound and correct to me, and
-	avoids lots of allocations.
-
-	* src/autofit/afloader.c (af_loader_init): Change return type to
-	`void'.
-	Don't call `FT_GlyphLoader_New'.
-	(af_loader_reset): Don't call `FT_GlyphLoader_Rewind'.
-	(af_loader_load_g): Update code to use `internal->loader', which
-	doesn't need copying of data.
-
-	* src/autofit/afloader.h (AF_LoaderRec): Remove `gloader' member.
-	Update prototype.
-
-	* src/autofit/afmodule.c (af_autofitter_load_glyph): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Remove (unused) support for composite glyphs.
-
-	We never have to deal with composite glyphs in the autohinter, as
-	those will be loaded into FORMAT_OUTLINE by the recursed
-	`FT_Load_Glyph' function.
-
-	In the rare cases that FT_LOAD_NO_RECURSE is set, it will imply
-	FT_LOAD_NO_SCALE as per `FT_Load_Glyph', which then implies
-	FT_LOAD_NO_HINTING:
-
-	  /* resolve load flags dependencies */
-
-	  if ( load_flags & FT_LOAD_NO_RECURSE )
-	    load_flags |= FT_LOAD_NO_SCALE         |
-	                  FT_LOAD_IGNORE_TRANSFORM;
-
-	  if ( load_flags & FT_LOAD_NO_SCALE )
-	  {
-	    load_flags |= FT_LOAD_NO_HINTING |
-	                  FT_LOAD_NO_BITMAP;
-
-	    load_flags &= ~FT_LOAD_RENDER;
-	  }
-
-	and as such the auto-hinter is never called.  Thus, the recursion in
-	`af_loader_load_g' never actually happens.  So remove the depth
-	counter as well.
-
-	* src/autofit/afloader.c (af_loader_load_g): Remove `depth'
-	parameter.
-	<FT_GLYPH_FORMAT_COMPOSITE>: Remove associated code.
-	(af_loader_load_glyph): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[raster] Fix uninitialized memory access.
-
-	Apparently `ras.cProfile' might be uninitialized.  This will be the
-	case if `ras.top == ras.cProfile->offset', as can be seen in
-	`End_Profile'.  The overshoot code introduced in a change `Fix B/W
-	rasterization of subglyphs with different drop-out modes.' (from
-	2009-06-18) violated this, accessing `ras.cProfile->flags'
-	unconditionally just before calling `End_Profile' (which then
-	detected that `cProfile' is uninitialized and didn't touch it).
-
-	This was harmless, and was not detected by valgrind before because
-	the objects were allocated on the `raster_pool', which was always
-	initialized.  With recent change to allocate raster buffers on the
-	stack, valgrind now reported this invalid access.
-
-	* src/raster/ftraster.c (Convert_Glyph): Don't access an
-	uninitialized `cProfile'.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[smooth] Fix uninitialized memory access.
-
-	Looks like `ras.span_y' could always be used without initialization.
-	This was never detected by valgrind before because the library-wide
-	`raster_pool' was used for the worker object and `raster_pool' was
-	originally zero'ed.  But subsequent reuses of it were using `span_y'
-	uninitialized.  With the recent change to not use `render_pool' and
-	allocate worker and buffer on the stack, valgrind now detects this
-	uninitialized access.
-
-	* src/smooth/ftgrays.c (gray_raster_render): Initialize
-	`ras.span_y'.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[base] Don't initialize unused `driver->glyph_loader'.
-
-	* src/base/ftobjs.c (Destroy_Driver): Don't call
-	`FT_GlyphLoader_Done'.
-	(FT_Add_Module): Don't call `FT_GlyphLoader_New'.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[base] Don't allocate `library->raster_pool' anymore.
-
-	It's unused after the following commits:
-
-	  [raster] Allocate render pool for mono rasterizer on the stack.
-	  [raster] Remove 5-level gray AA mode from monochrome rasterizer.
-
-	The value of FT_RENDER_POOL_SIZE still serves the purpose it used to
-	serve, which is, to adjust the pool size.  But the pool is now
-	allocated on the stack on demand.
-
-	* src/base/ftobjs.c (FT_New_Library, FT_Done_Library): Implement.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[base] Do not reorder library->renderers upon use.
-
-	Instead of keeping `library->renderers' in a MRU order, just leave
-	it as-is.  The MRU machinery wasn't thread-safe.
-
-	With this patch, rasterizing glyphs from different faces from
-	different threads doesn't fail choosing rasterizer
-	(FT_Err_Cannot_Render_Glyph).
-
-	Easiest to see that crash was to add a `printf' (or otherwise let
-	thread yield in FT_Throw with debugging enabled).
-
-	* src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c
-	(FT_Outline_Render): Don't call `FT_Set_Renderer'.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[raster] Allocate render pool for mono rasterizer on the stack.
-
-	Instead of using the `render_pool' member of `FT_Library' that is
-	provided down to the rasterizer, completely ignore that and allocate
-	needed objects on the stack instead.
-
-	With this patch, rasterizing glyphs from different faces from
-	different threads doesn't crash in the monochrome rasterizer.
-
-	* src/raster/ftraster.c (black_TRaster): Remove `buffer',
-	`buffer_size', and `worker' members.
-
-	(ft_black_render): Create `buffer' locally.
-	(ft_black_reset): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[raster] Remove 5-level gray AA mode from monochrome rasterizer.
-
-	It was off by default and couldn't be turned on at runtime.  And the
-	smooth rasterizer superceded it over ten years ago.  No point in
-	keeping.  Comments suggested that it was there for compatibility
-	with FreeType 1.
-
-	550 lines down.
-
-	* src/raster/ftraster.c (FT_RASTER_OPTION_ANTI_ALIASING,
-	RASTER_GRAY_LINES): Remove macros and all associated code.
-
-	(black_TWorker): Remove `gray_min_x' and `gray_max_x'.
-	(black_TRaster): Remove `grays' and `gray_width'.
-
-	(Vertical_Sweep_Init, Vertical_Sweep_Span, Vertical_Sweep_Drop,
-	ft_black_render): Updated.
-
-	* src/raster/ftrend1.c (ft_raster1_render): Simplify code.
-	(ft_raster5_renderer_class): Removed.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[smooth] Allocate render pool for smooth rasterizer on the stack.
-
-	Instead of using the `render_pool' member of `FT_Library' that is
-	provided down to the rasterizer, completely ignore that and allocate
-	needed objects on the stack instead.
-
-	With this patch, rasterizing glyphs from different faces from
-	different threads doesn't crash in the smooth rasterizer.
-
-	Bugs:
-
-	  https://bugzilla.redhat.com/show_bug.cgi?id=678397
-	  https://bugzilla.redhat.com/show_bug.cgi?id=1004315
-	  https://bugzilla.redhat.com/show_bug.cgi?id=1165471
-	  https://bugs.freedesktop.org/show_bug.cgi?id=69034
-
-	* src/smooth/ftgrays.c (gray_TRaster): Remove `buffer',
-	`buffer_size', `band_size', and `worker' members.
-
-	(gray_raster_render): Create `buffer', `buffer_size', and
-	`band_size' locally.
-	(gray_raster_reset): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[truetype] Allocate TT_ExecContext in TT_Size instead of TT_Driver.
-
-	Previously the code had stipulation for using a per-TT_Size exec
-	context if `size->debug' was true.  But there was no way that
-	`size->debug' could *ever* be true.  As such, the code was always
-	using the singleton `TT_ExecContext' that was stored in `TT_Driver'.
-	This was, clearly, not threadsafe.
-
-	With this patch, loading glyphs from different faces from different
-	threads doesn't crash in the bytecode loader code.
-
-	* src/truetype/ttobjs.h (TT_SizeRec): Remove `debug' member.
-	(TT_DriverRec): Remove `context' member.
-
-	* src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Remove
-	`TT_ExecContext' code related to a global `TT_Driver' object.
-
-	(tt_driver_done): Don't remove `TT_ExecContext' object here but ...
-	(tt_size_done_bytecode): ... here.
-
-	(tt_driver_init): Don't create `TT_ExecContext' object here but ...
-	(tt_size_init_bytecode): ... here, only on demand.
-
-	* src/truetype/ttinterp.c (TT_Run_Context): Remove defunct debug
-	code.
-	(TT_New_Context): Remove `TT_ExecContext' code related to a global
-	`TT_Driver' object.
-
-	* src/truetype/ttinterp.h: Updated.
-
-	* src/truetype/ttgload.c (TT_Hint_Glyph, tt_loader_init): Updated.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	[autofit] Allocate AF_Loader on the stack instead of AF_Module.
-
-	Stop sharing a global `AF_Loader'.  Allocate one on the stack during
-	glyph load.
-
-	Right now this results in about 25% slowdown, to be fixed in a
-	following commit.
-
-	With this patch loading glyphs from different faces from different
-	threads doesn't immediately crash in the autohinting loader code.
-
-	Bugs:
-
-	  https://bugzilla.redhat.com/show_bug.cgi?id=1164941
-
-	* src/autofit/afloader.c (af_loader_init): Pass
-	`AF_Loader' and `FT_Memory' instead of `AF_Module' as arguments.
-	(af_loader_reset, af_loader_load_glyph): Also pass `loader' as
-	argument.
-	(af_loader_done): Use `AF_Loader' instead of `AF_Module' as
-	argument.
-
-	* src/autofit/afmodule.c (af_autofitter_init): Don't call
-	`af_loader_init'.
-	(af_autofitter_done): Don't call `af_loader_done'.
-	(af_autofitter_load_glyph): Use a local `AF_Loader' object.
-
-	* src/autofit/afloader.h: Include `afmodule.h'.
-	Update prototypes.
-	Move typedef for `AF_Module' to...
-
-	* src/autofit/afmodule.h: ... this place.
-	No longer include `afloader.h'.
-
-2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
-
-	* src/type42/t42objs.h (T42_DriverRec): Remove unused member.
-
-2015-01-12  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #43976.
-
-	Assure that FreeType's internal include directories are found before
-	`CPPFLAGS' (which might be set by the user in the environment), and
-	`CPPFLAGS' before `CFLAGS'.
-
-	* builds/freetype.mk (FT_CFLAGS): Don't add `INCLUDE_FLAGS'.
-	(FT_COMPILE): Make this a special variable for compiling only the
-	files handled in `freetype.mk'.
-	(.c.$O): Removed, unused.
-
-	* src/*/rules.mk (*_COMPILE): Fix order of include directories.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Prettyfing.
-
-	* src/truetype/ttinterp.c (project, dualproj, fast_project,
-	fast_dualproj): Rename to...
-	(PROJECT, DUALPROJ, FAST_PROJECT, FAST_DUALPROJ): ... this.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttinterp.c (Ins_JROT, Ins_JROF): Simplify.
-
-	Based on a patch from Behdad.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttinterp.c (Ins_SxVTL): Simplify function call.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttinterp.c (Normalize): Remove unused argument.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	* src/truetype/ttinterp.c (FT_UNUSED_EXEC): Remove macro by
-	expansion.
-
-2015-01-11  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	* src/truetype/ttinterp.c (INS_ARG): Remove macro by expansion,
-	adjusting funtion calls where necessary.
-	(FT_UNUSED_ARG): Removed, no longer needed.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	Based on a patch from Behdad.
-
-	* src/truetype/ttinterp.c (DO_*): Expand macros into corresponding
-	`Ins_*' functions.
-	(TT_RunIns): Replace `DO_*' macros with `Ins_*' function calls.
-	(ARRAY_BOUND_ERROR): Remove second definition, which is no longer
-	needed.
-	(Ins_SVTCA, Ins_SPVTCA, Ins_SFVTCA): Replaced with...
-	(Ins_SxyTCA): New function.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Remove TT_CONFIG_OPTION_INTERPRETER_SWITCH.
-
-	Behdad suggested this code simplification, and nobody objected...
-
-	* include/config/ftoption.h, devel/ftoption.h
-	(TT_CONFIG_OPTION_INTERPRETER_SWITCH): Remove.
-
-	* src/truetype/ttinterp.c [TT_CONFIG_OPTION_INTERPRETER_SWITCH]:
-	Remove related code.
-	(ARRAY_BOUND_ERROR): Use do-while loop.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	* src/truetype/ttinterp.c, src/truetype/ttinterp.h (EXEC_ARG_,
-	EXEC_ARG): Remove by replacing with expansion.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	Based on a patch from Behdad.
-
-	* src/truetype/ttinterp.c (SKIP_Code, GET_ShortIns, NORMalize,
-	SET_SuperRound, ROUND_None, INS_Goto_CodeRange, CUR_Func_move,
-	CUR_Func_move_orig, CUR_Func_round, CUR_Func_cur_ppem,
-	CUR_Func_read_cvt, CUR_Func_write_cvt, CUR_Func_move_cvt,
-	CURRENT_Ratio, INS_SxVTL, COMPUTE_Funcs, COMPUTE_Round,
-	COMPUTE_Point_Displacement, MOVE_Zp2_Point): Remove by replacing
-	with expansion.
-
-	(Cur_Func_project, CUR_Func_dualproj, CUR_fast_project,
-	CUR_fast_dualproj): Replace with macros `project', `dualproj',
-	`fast_project', `fast_dualproj'.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] More macro expansions.
-
-	* src/truetype/ttinterp.c (EXEC_OP_, EXEC_OP): Remove by replacing
-	with expansion.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Remove code for static TrueType interpreter.
-
-	This is a follow-up patch.
-
-	* src/truetype/ttinterp.c, src/truetype/ttinterp.h
-	[TT_CONFIG_OPTION_STATIC_INTERPRETER,
-	TT_CONFIG_OPTION_STATIC_RASTER]: Remove macros and related code.
-
-2015-01-10  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttinterp.c (CUR): Remove by replacing with expansion.
-
-	This starts a series of patches that simplifies the code of the
-	bytecode interpreter.
-
-2014-12-30  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.5 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-5'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.5.
-
-	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
-	builds/windows/vc2008/freetype.vcproj,
-	builds/windows/vc2008/index.html,
-	builds/windows/vc2010/freetype.vcxproj,
-	builds/windows/vc2010/index.html,
-	builds/windows/visualc/freetype.dsp,
-	builds/windows/visualc/freetype.vcproj,
-	builds/windows/visualc/index.html,
-	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj,
-	builds/windows/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.4/2.5.5/, s/254/255/.
-
-	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
-
-	* builds/unix/configure.raw (version_info): Set to 17:4:11.
-	* CMakeLists.txt (VERSION_PATCH): Set to 5.
-	* docs/CHANGES: Updated.
-
-	* builds/toplevel.mk (dist): Fix typos.
-
-2014-12-24  Alexei Podtelezhnikov <apodtele@gmail.com>
-
-	[base] Formatting and nanooptimizations.
-
-	* src/base/ftcalc.c,
-	* src/base/fttrigon.c: Revise sign restoration.
-
-2014-12-13  Werner Lemberg  <wl@gnu.org>
-
-	* src/pcf/pcfread.c (pcf_read_TOC): Improve fix from 2014-12-08.
-
-2014-12-11  Werner Lemberg  <wl@gnu.org>
-
-	* builds/toplevel.mk (dist): Use older POSIX standard for `tar'.
-
-	Apparently, BSD tar isn't capable yet of handling POSIX-1.2001
-	(contrary to GNU tar), so force the POSIX-1.1988 format.
-
-	Problem reported by Stephen Fisher <sfisher@SDF.ORG>.
-
-2014-12-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/type42/t42parse.c (t42_parse_sfnts): Reject invalid TTF size.
-
-2014-12-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftobjs.c (FT_Get_Glyph_Name): Fix off-by-one check.
-
-	Problem reported by Dennis Felsing <dennis@felsin9.de>.
-
-2014-12-11  Werner Lemberg  <wl@gnu.org>
-
-	* src/type42/t42parse.c (t42_parse_sfnts): Check `string_size'.
-
-	Problem reported by Dennis Felsing <dennis@felsin9.de>.
-
-2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[gxvalid] Fix a naming convention conflicting with ftvalid.
-
-	See previous changeset for otvalid.
-
-	* src/gxvalid/{gxvcommn.h, gxvmort.h, gxvmorx.h}: Replace
-	`valid' by `gxvalid'.
-	* src/gxvalid/{gxvbsln.c, gxvcommn.c, gxvfeat.c, gxvjust.c,
-	gxvkern.c, gxvlcar.c, gxvmort.c, gxvmort0.c, gxvmort1.c,
-	gxvmort2.c, gxvmort4.c, gxvmort5.c, gxvmorx.c, gxvmorx0.c,
-	gxvmorx1.c, gxvmorx2.c, gxvmorx4.c, gxvmorx5.c, gxvopbd.c,
-	gxvprop.c, gxvtrak.c}: Replace `valid' by `gxvalid' if
-	it is typed as GXV_Validator.
-
-2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[otvalid] Fix a naming convention conflicting with ftvalid.
-
-	Some prototypes in ftvalid.h use `valid' for the variables
-	typed as FT_Validator.  Their implementations in src/base/
-	ftobjs.c and utilizations in src/sfnt/ttcmap.c do similar.
-
-	Some macros in otvcommn.h assume the exist of the variable
-	`valid' typed as OTV_Validator in the caller.
-
-	Mixing these two conventions cause invalid pointer conversion
-	and unexpected SEGV in longjmp.  To prevent it, all variables
-	typed as OTV_Validator are renamed to `otvalid'.
-
-	* src/otvalid/otvcommn.h: Replace `valid' by `otvalid'.
-	* src/otvalid/{otvcommn.c, otvbase.c, otvgdef.c, otvgpos.c,
-	otvgsub.c, otvjstf.c, otvmath.c}: Replace `valid' by `otvalid'
-	if it is typed as OTV_Validator.
-
-2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[ftvalid] Introduce FT_THROW() in FT_INVALID_XXX macros.
-
-	Original patch is designed by Werner Lemberg.  Extra part
-	for otvalid and gxvalid are added by suzuki toshiya, see
-	discussion:
-	http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00002.html
-	http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00007.html
-
-	* include/internal/ftvalid.h: Introduce FT_THROW() in FT_INVALID_().
-	* src/gxvalid/gxvcommn.h: Ditto.
-	* src/otvalid/otvcommn.h: Ditto.
-
-2014-12-08  Werner Lemberg  <wl@gnu.org>
-
-	[pcf] Fix Savannah bug #43774.
-
-	Work around `features' of X11's `pcfWriteFont' and `pcfReadFont'
-	functions.  Since the PCF format doesn't have an official
-	specification, we have to exactly follow these functions' behaviour.
-
-	The problem was unveiled with a patch from 2014-11-06, fixing issue
-	#43547.
-
-	* src/pcf/pcfread.c (pcf_read_TOC): Don't check table size for last
-	element.  Instead, assign real size.
-
-2014-12-07  Werner Lemberg  <wl@gnu.org>
-
-	Work around a bug in Borland's C++ compiler.
-
-	See
-
-	  http://qc.embarcadero.com/wc/qcmain.aspx?d=118998
-
-	for Borland's bug tracker entry.
-
-	Reported by Yuliana Zigangirova <zigangirova@inbox.ru>,
-	http://lists.gnu.org/archive/html/freetype-devel/2014-04/msg00001.html.
-
-	* include/internal/ftvalid.h (FT_ValidatorRec), src/smooth/ftgrays.c
-	(gray_TWorker_): Move `ft_jmp_buf' field to be the first element.
-
-2014-12-07  Werner Lemberg  <wl@gnu.org>
-
-	*/*: Decorate hex constants with `U' and `L' where appropriate.
-
-2014-12-07  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Prevent memory leak for buggy fonts.
-
-	* src/truetype/ttobjs.c (tt_size_done): Unconditionally call
-	`tt_size_done_bytecode'.
-
-2014-12-06  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.4 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-4'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.4.
-
-	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
-	builds/windows/vc2008/freetype.vcproj,
-	builds/windows/vc2008/index.html,
-	builds/windows/vc2010/freetype.vcxproj,
-	builds/windows/vc2010/index.html,
-	builds/windows/visualc/freetype.dsp,
-	builds/windows/visualc/freetype.vcproj,
-	builds/windows/visualc/index.html,
-	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj,
-	builds/windows/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.3/2.5.4/, s/253/254/.
-
-	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
-
-	* builds/unix/configure.raw (version_info): Set to 17:3:11.
-	* CMakeLists.txt (VERSION_PATCH): Set to 4.
-	* docs/CHANGES: Updated.
-
-2014-12-04  Werner Lemberg  <wl@gnu.org>
-
-	docs/CHANGES: Updated, formatted.
-
-2014-12-04  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Modify an FT_ASSERT.
-
-	* src/cff/cf2hints.c (cf2_hintmap_map): After the fix for Savannah
-	bug #43661, the test font `...aspartam.otf' still triggers an
-	FT_ASSERT.  Since hintmap still works with count==0, ...
-	(cf2_glyphpath_lineTo, cf2_glyphpath_curveTo): ... add that term to
-	suppress the assert.
-
-2014-12-04  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix Savannah bug #43661.
-
-	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
-	cf2_cmdVSTEM, cf2_cmdHINTMASK>: Don't append to stem arrays after
-	hintmask is constructed.
-
-	* src/cff/cf2hints.c (cf2_hintmap_build): Add defensive code to
-	avoid reading past end of hintmask.
-
-2014-12-03  Werner Lemberg  <wl@gnu.org>
-
-	docs/CHANGES: Updated.
-
-2014-12-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Better fix for conversion specifiers in debug messages.
-
-	Using `%ld' for pointer differences causes warnings on 32bit
-	platforms.  The correct type would be (the relatively new) `%td',
-	however, this is missing on some important platforms.
-
-	This patch improves the change from 2014-11-28.
-
-	* src/autofit/afhints.c (AF_INDEX_NUM): Use `int' typecast.  Our
-	pointer differences are always sufficiently small.
-	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
-	af_glyph_hints_dump_edge): Revert to `%d' and use `AF_INDEX_NUM'.
-
-2014-12-03  Werner Lemberg  <wl@gnu.org>
-
-	FT_Sfnt_Tag: s/ft_sfnt_xxx/FT_SFNT_XXX/ for orthogonality.
-
-	All public FreeType enumeration and flag values are uppercase...
-
-	* include/tttables.h (FT_Sfnt_Tag): Implement it.  For backwards
-	compatilibity, retain the old values as macros.
-
-	* src/base/ftfstype.c (FT_Get_FSType_Flags), src/sfnt/sfdriver.c
-	(get_sfnt_table): Updated.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	* include/*: Improve structure of documentation.
-
-	. Add and update many `<Order>' tags.
-	. Apply various documentation fixes.
-	. Remove details to deprecated (or never implemented) data.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Always handle `<Order>' section elements.
-
-	Previously, those elements were handled only for sections present in
-	a `<Sections>' chapter element.
-
-	* src/tools/docmaker/content.py (ContentProcessor::finish):
-	Implement it.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Properly handle empty rows in Synopsis.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit
-	`&nbsp;' for empty fields.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Thinko.
-
-	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
-	Emit `/empty/' string for first element also.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Honour empty lines in `<Order>' section element.
-
-	This greatly improves the readability of the `Synopsis' links.
-
-	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
-	Insert string `/empty/' between items.
-
-	* src/tools/docmaker/formatter.py (Formatter::section_dump): Make it
-	robust against nonexistent keys.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit
-	empty <td> elements for `/empty/'.
-
-2014-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Ensure Python 3 compatibility.
-
-	* src/tools/docmaker/content.py (ContentProcessor::set_section,
-	ContentProcessor::finish): Replace `has_key' function with `in'
-	keyword.
-
-	* src/tools/docmaker/formatter.py (Formatter::__init__): Replace
-	sorting function with a key generator.
-	(Formatter::add_identifier): Replace `has_key' function with `in'
-	keyword.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::html_source_quote):
-	Replace `has_key' function with `in' keyword.
-	(HtmlFormatter::index_exit, HtmlFormatter::section_enter): Use
-	integer division.
-	s/<>/>/.
-
-	* src/tools/docmaker/utils.py: Import `itertools'.
-	(index_sort): Replaced by...
-	(index_key): ... this new key generator (doing exactly the same).
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Don't output a block multiple times.
-
-	This bug was hidden by not processing all lines of `<Order>' blocks.
-
-	* src/tools/docmaker/formatter.py (Formatter::section_dump): Filter
-	out field names.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Use field values as HTML link targets where possible.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_block_url):
-	Accept second, optional argument to specify a name.
-	(HtmlFormatter::html_source_quote): Link to field ID if possible.
-	(HtmlFormatter::print_html_field_list): Emit `id' attribute.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Allow empty lines in `<Order>' blocks.
-
-	Before this patch, the suggested order of entries stopped at the
-	first empty line.
-
-	Obviously, nobody noticed that this problem caused a much reduced
-	set of links in the `Synopsis' sections; in particular, the
-	`<Order>' blocks contain a lot of entries that wouldn't be listed
-	otherwise...
-
-	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
-	New function to iterate over all items.
-	(DocSection::process): Use it.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/sources.py (column) [Format 2]: Fix regexp.
-
-	After the single asterisk there must be no other immediately following
-	asterisk.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Improve CSS for vertical spacing.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Improve HTML code for table of contents.
-
-	* src/tools/docmaker/tohtml.py: Introduce a new table class `toc',
-	together with proper CSS.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Provide higher-level markup and simplify HTML.
-
-	* src/tools/docmaker/tohtml.py: Instead of using extraneous `<div>'
-	elements, use CSS descendants (of class `section') to format the
-	data.
-
-	Also remove reduntant <p> and <br> elements, replacing them with
-	proper CSS.
-
-	Globally reduce page width to 75%.
-
-	(block_header): Rename <div> class to `section'.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Add `top' links after blocks.
-
-	* src/tools/docmaker/tohtml.py (block_footer_middle): Implement it.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Improve CSS for fields.
-
-	Make fields align horizontally relative to full line width.
-
-2014-11-29  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Fix index and TOC templates.
-
-	This thinko was introduced 2014-11-27.
-
-2014-11-28  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Format field lists with CSS.
-
-	This also simplifies the inserted HTML code.
-
-	* src/tools/docmaker/tohtml.py
-	(HtmlFormatter::print_html_field_list): Do it.
-
-2014-11-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix compiler warning to the comparison between signed and
-	unsigned variable.
-
-	* src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix the comparison
-	between `ypos + ysize' and FT_INT_{MAX,MIN}.
-
-2014-11-28  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Replace empty `<td>' with CSS.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Do
-	it.
-
-2014-11-28  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Replace some `<table>' tags with `<h4>' and `<div>'.
-
-	* src/tools/docmaker/tohtml.py (marker_*): Use `<h4>'.
-	(source_*): Use `<div>'.
-	(HtmlFormatter::block_enter): s/<h4>/<h3>/.
-
-2014-11-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix compiler warning to conversion specifiers in debug messages.
-
-	* src/autofit/afhints.c (af_glyph_hints_dump_points): Add length
-	modifier to dump long integers.
-	(af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Ditto.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Use more CSS for index.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Replace `name' attribute of `<a>' with `id'.
-
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::block_enter): Do it.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Remove remaining `width' attributes.
-
-	For `Index' and `TOC' links, we now simply use the `text-align' CSS
-	property of `<td>' to enforce flush-left and flush-right,
-	eliminating the hack with an empty, full-width `<td>' element
-	inbetween.
-
-	The change also enforces the same (smaller) size for all index and
-	TOC links.
-
-2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/cff/cf2font.c: Include `ftcalc.h' to use FT_MSB(),
-	cf2font.c could not find it under `make multi' build.
-
-2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove
-	unrequired negative value check for `width' and `height'.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: More HTML table refactoring.
-
-	Replace some `<table>' tags with `<div>' to simplify structure.
-
-	Move `bgcolor' attribute to CSS.
-
-	Replace most `width' attributes with CSS.  The remaining instances
-	(providing a similar effect as LaTeX's `\hfill' command) are removed
-	in a later patch.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Replace <font> with CSS.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Center <table> with CSS.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Replace `<center>' with `<div>'.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/tohtml.py: Remove redundant `<center>' tags.
-
-	This starts a series of commits into the direction of generating
-	valid HTML 5 code, especially using much more CSS.
-
-2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Prevent too negative values (< FT_INT_MIN) in bitmap metrics,
-	suggested by Alexei.
-
-	* src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Prevent too
-	negative values in `xpos' and `ypos + ysize'.
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Prevent
-	too negative values in `x_left' and `y_top'.  Either negative
-	values in `width' and `height' are checked.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Produce better HTML code.
-
-	* src/tools/docmaker/tohtml.py: Always use double quotes for
-	attribute values.
-	(source_footer): Close `td' and `tr' groups.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	Use better way to disable creation of .pyc files for `make refdoc'.
-
-	Python 2.6 was released in 2008...
-
-	* builds/freetype.mk (refdoc): Use python's `-B' option.
-
-	* builds/detect.mk (std_setup, dos_setup): Mention required python
-	version for `refdoc' target.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/tools/docmaker/sources.py (re_bold, re_italic): Use
-	non-grouping parentheses.
-	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word):
-	Updated.
-
-2014-11-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftobjs.c (FT_Get_Glyph_Name): Fix compiler warning.
-
-	Introdruced in previous change.  Reported by Alexei.
-
-2014-11-26  Werner Lemberg  <wl@gnu.org>
-
-	* src/*: Add checks for parameters of API functions where missing.
-
-	`API functions' are functions tagged with `FT_EXPORT_DEF'.
-
-	Besides trivial fixes, the following changes are included, too.
-
-	* src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Set
-	error code if no service is available.
-
-	* src/base/ftinit.c (FT_Done_FreeType): Change return value for
-	invalid `library' parameter to `Invalid_Library_Handle'.
-
-	* src/base/ftobjs.c (FT_New_Size): Change return value for invalid
-	`asize' parameter to `Invalid_Argument'.
-
-	* src/base/ftoutln.c (FT_Outline_Copy): Change return value for
-	invalid `source' and `target' parameters to `Invalid_Outline'.
-	(FT_Outline_Done_Internal): Change return value for invalid
-	`outline' parameter to `Invalid_Outline'.
-
-2014-11-26  Werner Lemberg  <wl@gnu.org>
-
-	* src/cache/ftcbasic.c: Use single calls to `FT_TRACE'.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/base/ftobj.c (Mac_Read_POST_Resource): Additional
-	overflow check in the summation of POST fragment lengths,
-	suggested by Mateusz Jurczyk <mjurczyk@google.com>.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/base/ftobjs.c (Mac_Read_POST_Resource): Insert comments
-	and fold too long tracing messages.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix Savannah bug #43540.
-
-	* src/base/ftmac.c (parse_fond): Prevent a buffer overrun
-	caused by a font including too many (> 63) strings to store
-	names[] table.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/base/ftobjs.c (Mac_Read_POST_Resource): Use unsigned long
-	variables to read the lengths in POST fragments.  Suggested by
-	Mateusz Jurczyk <mjurczyk@google.com>.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix Savannah bug #43539.
-
-	* src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow
-	by a broken POST table in resource-fork.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix Savannah bug #43538.
-
-	* src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow
-	by a broken POST table in resource-fork.
-
-2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	* src/base/ftobjs.c (Mac_Read_POST_Resource): Avoid memory leak
-	by a broken POST table in resource-fork.  Return after freeing
-	the buffered POST table when it is found to be broken.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	*/*: s/Invalid_Argument/Invalid_Size_Handle/ where appropriate.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	*/*: s/Invalid_Argument/Invalid_Stream_Handle/ where appropriate.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	*/*: s/Invalid_Argument/Invalid_Library_Handle/ where appropriate.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	*/*: s/Invalid_Argument/Invalid_Outline/ where appropriate.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	*/*: s/Invalid_Argument/Invalid_Face_Handle/ where appropriate.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[Savannah bug #43682] Adjust some renderer callbacks.
-
-	* src/raster/ftraster.c (ft_black_set_mode): Change return type to
-	`int' to stay in sync with `FT_Renderer_SetModeFunc' prototype.
-
-	* src/smooth/ftgrays.c (gray_raster_set_mode): New dummy function
-	for orthogonality.
-	(ft_grays_raster): Use it.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	[Savannah bug #43682] Properly handle missing return errors.
-
-	The functions in this patch *do* return non-trivial errors that must
-	be taken care of.
-
-	* src/autofit/afloader.c (af_loader_load_g), src/base/ftobjs.c
-	(FT_Render_Glyph_Internal), src/base/ftoutln.c (FT_Outline_Render),
-	src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_endchar>,
-	src/psaux/psobjs.c (ps_parser_load_field_table), src/psaux/t1decode
-	(t1_decoder_parse_charstrings) <op_endchar>, src/truetype/ttgload.c
-	(load_truetype_glyph <subglyph loop>, tt_loader_init,
-	TT_Load_Glyph), src/truetype/ttgxvar.c (TT_Set_MM_Blend),
-	src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Do it.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	[Savannah bug #43682] Add/remove `void' casts to some functions.
-
-	We use a cast to indicate that we intentionally ignore a function's
-	return value.  However, this doesn't apply to API functions where
-	errors can only happen for trivially invalid input.
-
-	* src/base/ftstroke.c (FT_Glyph_Stroke, FT_Glyph_StrokeBorder),
-	src/base/ftsynth.c (FT_GlyphSlot_Embolden), src/cff/cffgload.c
-	(cff_slot_load), src/pfr/pfrdrivr.c (pfr_get_kerning),
-	src/type1/t1load.c (parse_encoding), src/type42/t42parse.c
-	(t42_parse_encoding): Do it.
-
-2014-11-25  Werner Lemberg  <wl@gnu.org>
-
-	[Savannah bug #43682] Change some signatures to `void' return type.
-
-	* include/internal/pshints.h (PSH_Globals_SetScaleFunc),
-	include/internal/sfnt.h (TT_Get_Metrics_Func),
-	src/pshinter/pshglob.c (psh_globals_set_scale),
-	src/pshinter/pshrec.c (ps_hints_init), src/sfnt/ttmtx.c
-	(tt_face_get_metrics), src/truetype/ttinterp.c (TT_Goto_CodeRange,
-	TT_Set_CodeRange, TT_Clear_CodeRange, TT_Done_Context,
-	TT_Save_Context): Do it.
-
-	* src/pshinter/pshglob.h, src/pshinter/pshrec.h, src/sfnt/ttmtx.h,
-	src/truetype/ttgload.c (TT_Hint_Glyph), src/truetype/ttinterp.c
-	(TT_Run_Context), src/truetype/ttinterp.h, src/truetype/ttobjs.c
-	(tt_size_run_fpgm, tt_size_run_prep): Updated.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	Remove all code related to FT_MAX_CHARMAP_CACHEABLE.
-
-	This is no longer used.
-
-	* src/base/ftobjs.c, src/cache/ftccmap.c, src/cff/cffobjs.c,
-	src/sfnt/ttcmap.c: Do it.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43680.
-
-	This adds an additional constraint to make the fix from 2013-01-25
-	really work.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_image) <index_format==4>:
-	Check `p' before `num_glyphs'.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix Savannah bug #43679.
-
-	* src/truetype/ttpload.c (tt_face_load_hdmx): Check minimum size of
-	`record_size'.
-
-2014-11-24  Jarkko Pöyry  <jarkko.poyry@gmail.com>
-
-	[cff, pfr, psaux, winfonts] Fix Savannah bug #43676.
-
-	Don't cast cmap init function pointers to an incompatible type.
-
-	Without this patch, the number of parameters between declaration and
-	the real signature differs.  Calling such a function results in
-	undefined behavior.
-
-	  ISO/IEC 9899:TC3 (Committee Draft September 7, 2007)
-	    6.5.2.2 Function calls
-	      9 If the function is defined with a type that is not
-	        compatible with the type (of the expression) pointed to by
-	        the expression that denotes the called function, the
-	        behavior is undefined.
-
-	On certain platforms (c -> js with emscripten) this causes
-	termination of execution or invalid calls because in the emscripten
-	implementation, function pointers of different types are stored in
-	different pointer arrays.  Incorrect pointer type here results in
-	indexing of an incorrect array.
-
-	* src/cff/cffcmap.c (cff_cmap_encoding_init, cff_cmap_unicode_init),
-	src/pfr/pfrcmap.c (pfr_cmap_init), src/psaux/t1cmap.c
-	t1_cmap_standard_init, t1_cmap_expert_init, t1_cmap_custom_init,
-	t1_cmap_unicode_init), src/winfonts/winfnt.c (fnt_cmap_init): Fix
-	signature.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43672.
-
-	* src/sfnt/ttkern.c (tt_face_load_kern): Use correct value for
-	minimum table length test.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[type1, type42] Another fix for Savannah bug #43655.
-
-	* src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c
-	(t42_parse_charstrings): Add another boundary testing.
-
-2014-11-24  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Formatting, copyright, improved documentation.
-
-	* src/tools/docmaker/*: No code changes besides trivial
-	modifications.
-
-2014-11-22  Werner Lemberg  <wl@gnu.org>
-
-	[bdf] Fix Savannah bug #43660.
-
-	* src/bdf/bdflib.c (_bdf_parse_glyphs) <"ENDFONT">: Check
-	`_BDF_GLYPH_BITS'.
-
-2014-11-22  Werner Lemberg  <wl@gnu.org>
-
-	[type42] Allow only embedded TrueType fonts.
-
-	This is a follow-up to Savannah bug #43659.
-
-	* src/type42/t42objs.c (T42_Face_Init): Exclusively use the
-	`truetype' font driver for loading the font contained in the `sfnts'
-	array.
-
-2014-11-22  Werner Lemberg  <wl@gnu.org>
-
-	[type42] Fix Savannah bug #43659.
-
-	* src/type42/t42objs.c (T42_Open_Face): Initialize `face->ttf_size'.
-
-	* src/type42/t42parse.c (t42_parse_sfnts): Always set
-	`face->ttf_size' directly.  This ensures a correct stream size in
-	the call to `FT_Open_Face', which follows after parsing, even for
-	buggy input data.
-	Fix error messages.
-
-2014-11-22  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Fix Savannah bug #43658.
-
-	* src/cff/cf2ft.c (cf2_builder_lineTo, cf2_builder_cubeTo): Handle
-	return values of point allocation routines.
-
-2014-11-22  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43656.
-
-	* src/sfnt/ttcmap.c (tt_cmap4_validate): Fix order of validity
-	tests.
-
-2014-11-21  Werner Lemberg  <wl@gnu.org>
-
-	[type1, type42] Fix Savannah bug #43655.
-
-	* src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c
-	(t42_parse_charstrings): Fix boundary testing.
-
-2014-11-21  Werner Lemberg  <wl@gnu.org>
-
-	* src/pcf/pcfread.c (pcf_get_metrics): Sanitize invalid metrics.
-
-2014-11-21  Werner Lemberg  <wl@gnu.org>
-
-	[ftlcdfil] Obey flow direction.
-
-	* src/base/ftlcdfil.c (_ft_lcd_filter_fir, _ft_lcd_filter_legacy):
-	Handle `up' flow.
-
-2014-11-21  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftbitmap.c (FT_Bitmap_Convert): Improve.
-
-	This commit completes argument checks and adds support for different
-	flow directions.
-
-2014-11-21  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftbitmap.c (FT_Bitmap_Copy): Improve.
-
-	This commit adds argument checks and support for different flow
-	directions.
-
-2014-11-20  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftbitmap.c (FT_Bitmap_New): Check argument.
-
-2014-11-19  Werner Lemberg  <wl@gnu.org>
-
-	Change some fields in `FT_Bitmap' to unsigned type.
-
-	This doesn't break ABI.
-
-	* include/ftimage.h (FT_Bitmap): Make `rows', `width', `num_grays',
-	`pixel_mode', and `palette_mode' unsigned types.
-
-	* src/base/ftbitmap.c: Updated.
-	(FT_Bitmap_Copy): Fix casts.
-
-	* src/cache/ftcsbits.c, src/raster/ftraster.c, src/sfnt/pngshim.c:
-	Updated.
-
-2014-11-19  Werner Lemberg  <wl@gnu.org>
-
-	Make `FT_Bitmap_Convert' correctly handle negative `pitch' values.
-
-	* src/base/ftbitmap.c (FT_Bitmap_Convert): Always use positive value
-	for the pitch while copying data.
-	Correctly set pitch sign in target bitmap.
-
-2014-11-19  Werner Lemberg  <wl@gnu.org>
-
-	Minor code improvement in `FT_Bitmap_Embolden'.
-
-	* src/base/ftbitmap.c (FT_Bitmap_Embolden) <FT_PIXEL_MODE_GRAY[24]>:
-	Fix thinko.
-
-2014-11-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* src/base/fttrigon.c: Use dedicated `FT_Angle' for arctan table.
-
-2014-11-19  Behdad Esfahbod  <behdad@behdad.org>
-
-	Avoid compiler warnings on x86-64 for `FT_MulFix'.
-
-	`FT_MulFix' takes `FT_Long' parameters as defined in `freetype.h',
-	but several inline implementations of it in `ftcalc.h' take
-	`FT_Int32' arguments.  This is causing compiler warnings on x86-64:
-	If parameters of type `FT_Fixed' (= `FT_Long') are passed to the
-	inline implementation of this function, integer values are truncated
-	from 64bit to 32bit.
-
-	* include/internal/ftcalc.h (FT_MulFix) [FT_MULFIX_ASSEMBLER]: Add
-	casts.
-
-2014-11-15  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43597.
-
-	* src/sfnt/pngshim.c (Load_SBit_Png): Protect against too large
-	bitmaps.
-
-2014-11-12  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43591.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_init): Protect against addition
-	and multiplication overflow.
-
-2014-11-12  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43590.
-
-	* src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir):
-	Protect against addition overflow.
-
-2014-11-12  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43589.
-
-	* src/sfnt/sfobjs.c (woff_open_font): Protect against addition
-	overflow.
-
-2014-11-12  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43588.
-
-	* src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate,
-	tt_cmap12_validate, tt_cmap13_validate, tt_cmap14_validate): Protect
-	against overflow in additions and multiplications.
-
-2014-11-10  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] CORDIC improvements.
-
-	The scaling between the hypotenuse and its CORDIC approximation is
-	based on regression analysis. The smaller padding for `theta' is
-	justifed by its maximum error of less than 6.
-
-	* src/base/fttrigon.c (ft_trig_downscale): Borrow code from
-	./ftcalc.c (ft_multo64), change linear intercept.
-	(ft_trig_pseudo_polarize): Decrease `theta' padding.
-
-2014-11-09  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/ftstroke.c (ft_stroker_inside): Fix border intersections.
-
-	One more place to check whether `radius' is zero.
-
-	Problem reported by Marco Wertz <marco.wertz@gmx.de>.
-
-2014-11-07  Werner Lemberg  <wl@gnu.org>
-
-	[bdf] Fix Savannah bug #43535.
-
-	* src/bdf/bdflib.c (_bdf_strncmp): New macro that checks one
-	character more than `strncmp'.
-	s/ft_strncmp/_bdf_strncmp/ everywhere.
-
-2014-11-06  Werner Lemberg  <wl@gnu.org>
-
-	[pcf] Fix Savannah bug #43548.
-
-	* src/pcf/pcfread.c (pcf_get_encodings): Add sanity checks for row
-	and column values.
-
-2014-11-06  Werner Lemberg  <wl@gnu.org>
-
-	[pcf] Fix Savannah bug #43547.
-
-	* src/pcf/pcfread.c (pcf_read_TOC): Check `size' and `offset'
-	values.
-
-2014-11-06  Werner Lemberg  <wl@gnu.org>
-
-	* src/pcf/pcfread.c (pcf_read_TOC): Avoid memory leak.
-
-2014-11-03  Infinality  <infinality@infinality.net>
-
-	* src/truetype/ttsubpix.c (COMPATIBILITY_MODE_Rules): Updated.
-
-	The previous commit deteriorates rendering of DejaVu and similar
-	fonts; this gets compensated with this rule.
-
-2014-11-03  Werner Lemberg  <wl@gnu.org>
-
-	* src/truetype/ttinterp.c (Ins_DELTAP): Fix subpixel hinting.
-
-	Before this patch, it was impossible to ever call DELTAP[123] in
-	subpixel hinting mode as described in the ClearType whitepaper; it
-	only worked if in `compatibility mode'.  However, compatibility mode
-	essentially disables SHPIX, completely ruining hinting of
-	ttfautohint output, for example.
-
-	We now follow the whitepaper more closely so that DELTAP[123]
-	instructions for touched points in the non-subpixel direction are
-	executed.
-
-2014-10-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[smooth] Improve code readability.
-
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code.
-
-2014-10-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[smooth] Reduce outline translations during rendering.
-
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Translate origin
-	virtually by modifying cbox, actually translate outline if cumulative
-	shift is not zero.
-
-2014-10-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[smooth] Fix Savannah bug #35604 (cont'd).
-
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove checks and
-	casts that became unnecessary after the variable type upgrades.
-
-2014-10-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[smooth] Improve code readability.
-
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code.
-
-2014-10-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Unify hypotenuse approximations.
-
-	* include/internal/ftcalc.h (FT_HYPOT): Move macro from here...
-	* include/internal/ftobjs.h: ... to here, next to required `FT_ABS'.
-	* src/smooth/ftgrays.c (gray_render_cubic): Use it here.
-
-2014-10-25  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Test valid darkening parameter macros in `ftoption.h'.
-
-	We no longer need an otherwise unused typedef that can cause a gcc
-	warning.
-	Problem reported by Alexei.
-
-	* src/cff/cffobjs.c (cff_driver_init): Use
-	`CFF_CONFIG_OPTION_DARKENING_PARAMETER_XXX' macros directly.
-	(SET_DARKENING_PARAMETERS): Removed.
-	Compile time tests are now ...
-
-	* devel/ftoption.h, include/config/ftoption.h: ... here.
-
-2014-10-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Improve flat corner definition.
-
-	* include/internal/ftcalc.h (FT_HYPOT): Macro to approximate Euclidean
-	distance with the alpha max plus beta min algorithm.
-	* src/base/ftcalc.c (ft_corner_is_flat): Use it instead of Taxicab
-	metric.
-
-2014-10-23  David Weiß  <David.Weiss@ptvgroup.com>
-
-	[build] Improve property file for vc2010.
-
-	User-defined properties should be empty by default to prevent linker
-	failures.
-
-	* builds/windows/vc2010/freetype.user.props,
-	builds/windows/vc2010/freetype.vcxproj:
-	s/OptionsDirectory/UserOptionDirectory/.
-	Comment out all user options.
-
-2014-10-23  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Work around bug in preprocessor of MSVC 2010.
-
-	We have been hit by
-
-	  https://connect.microsoft.com/VisualStudio/feedback/details/718976/msvc-pr
-
-	* devel/ftoption.h, include/config/ftoption.h: Replace
-	`CFF_CONFIG_OPTION_DARKENING_PARAMETERS' with eight macros
-	`CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}'.
-
-	* src/cff/cffobjs.c (SET_DARKENING_PARAMETERS): Removed.  We no
-	longer need double expansion.
-	(SET_DARKENING_PARAMETERS_0): Renamed to ...
-	(SET_DARKENING_PARAMETERS): ... this.
-	Update call.
-
-2014-10-20  Werner Lemberg  <wl@gnu.org>
-
-	[sbit] Minor fixes.
-
-	* src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]:
-	Accept overlay format also, but emit warning message in that case.
-	(tt_sbit_decoder_load_metrics): Add missing newline to error
-	message.
-	(tt_sbit_load_sbix_image): Add `rgbl' graphic type (as used on iOS
-	7.1) to the list of unsupported formats.
-
-2014-10-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[truetype] Clean up bytecode rounding.
-
-	Zero distance does not have to be treated specially if you follow
-	specifications and check the sign as the very last step of rounding.
-
-	* src/truetype/ttinterp.c (Round_None, Round_To_Grid,
-	Round_Down_To_Grid, Round_Up_To_Grid, Round_To_Double_Grid): Use
-	macros when available, do not check for non-zero distance.
-	(Round_To_Half_Grid, Round_Super, Round_Super_45): Ditto, return phase
-	if sign changed.
-
-2014-10-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[truetype] Unwrap engine compensation settings.
-
-	* src/truetype/ttobjs.c (tt_size_init_bytecode): Updated.
-
-2014-10-18  David Weiß  <David.Weiss@ptvgroup.com>
-
-	[build] Add property file to vc2010 project.
-
-	This simplifies custom build configurations, especially for
-	automated build environments.
-
-	* builds/windows/vc2010/freetype.user.props: New configuration file.
-
-	* builds/windows/vc2010/freetype.vcxproj: Include
-	`freetype.user.props' and use its data fields.
-
-	* builds/windows/vc2010/index.html: Updated.
-
-2014-10-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add blue-zone support for Telugu.
-
-	This essentially moves the Telugu script from the `Indic' hinter to
-	the `Latin' hinter.
-
-	Note that this is a first shot and quite certainly needs
-	refinements.
-
-	* src/autofit/afblue.dat: Add blue zone data for Telugu.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/afscript.h: Add Telugu standard characters and move
-	data out of AF_CONFIG_OPTION_INDIC block.
-
-	* src/autofit/afranges.c: Move Telugu data out of
-	AF_CONFIG_OPTION_INDIC block.
-
-	* src/autofit/afstyles.h: Update Telugu data; in particular, use
-	AF_WRITING_SYSTEM_LATIN.
-
-2014-10-18  David Wimsey  <david@wimsey.us>
-
-	[cmake] Add iOS build support.
-	From Savannah patch #8497.
-
-	* builds/cmake/iOS.cmake: New file.  Universal binaries are built
-	with both 32 and 64 bit arm architectures.
-
-	* CMakeLists.txt (IOS_PLATFORM): New variable for running the iOS
-	toolchain.  Possible values are `OS' to build on iOS, or
-	`SIMULATOR' to build on APPLE.
-
-2014-10-16  Behdad Esfahbod  <behdad@behdad.org>
-	    Werner Lemberg  <wl@gnu.org>
-
-	[cff] Add `CFF_CONFIG_OPTION_DARKENING_PARAMETERS' config macro.
-
-	* devel/ftoption.h, include/config/ftoption.h
-	(CFF_CONFIG_OPTION_DARKENING_PARAMETERS): New macro.
-
-	* src/cff/cffobjs.c (SET_DARKENING_PARAMETERS,
-	SET_DARKENING_PARAMETERS_0): New macros.
-	(cff_driver_init): Use new macros.
-
-2014-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[truetype] Limit delta shift range.
-
-	The valid range for delta shift is zero through six.  Negative values
-	are invalid according to
-
-	  https://developer.apple.com/fonts/TrueType-Reference-Manual/RM04/Chap4.html#delta%20shift
-
-	* src/truetype/ttobjs.h (delta_shift, delta_base): Make unsigned.
-	* src/truetype/ttinterp.h (DO_SDS): Throw an error if `delta_shift'
-	is out of range.
-	(Ins_DELTAP, Ins_DELTAC): Optimize for valid `delta_shift'.
-
-2014-10-16  Werner Lemberg  <wl@gnu.org>
-
-	A better fix for Savannah bug #43392.
-	Suggested by Doug Felt <dougfelt@gmail.com>.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Set
-	`vertAdvance' to zero...
-
-	* src/truetype/ttgload.c (TT_Load_Glyph): ... and set here a default
-	value for `vertAdvance' based on `linearVertAdvance' in case
-	`vertAdvance' is zero.  Note that the previous computed ad-hoc value
-	for `linearVertAdvance' was apparently not tested in a real-life
-	situation.
-
-2014-10-14  David Weiß  <David.Weiss@ptvgroup.com>
-
-	[build] Better optimization settings for vc2010 solution file.
-
-	* builds/windows/vc2010/freetype.sln,
-	builds/windows/vc2010/freetype.vcxproj: Updated.
-
-2014-10-14  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Adjust Devenagari character range.
-
-	* src/autofit/afranges.c (af_deva_uniranges): Omit characters that
-	are common to all other Indic scripts.
-
-2014-10-12  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #43392.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Don't let
-	vertical metrics uninitialized.
-
-2014-10-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Small bbox correction.
-
-	* src/base/ftbbox.c (FT_Outline_Get_BBox): Start from nonsense bbox
-	instead of initial point that could be `off' in conic outlines.
-
-2014-10-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Fix Savannah bug #43356.
-
-	* src/base/ftbbox.c (BBox_Move_To, BBox_Conic_To): Update bbox in case
-	of implicit `to'.
-	(BBox_Line_To): New emitter that does not update bbox.
-
-2014-10-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Introduce and use new macro `FT_UPDATE_BBOX'
-
-	* src/base/ftbbox.c (FT_UPDATE_BBOX): New macro.
-	(FT_Outline_Get_BBox): Use it here.
-
-2014-10-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Significant optimization of `ft_div64by32'
-
-	We shift as many bits as we can into the high register, perform
-	32-bit division with modulo there, then work through the remaining
-	bits with long division. This optimization is especially noticeable
-	for smaller dividends that barely use the high register.
-
-	* src/base/ftcalc.c (ft_div64by32): Updated.
-
-2014-10-02  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix Savannah bug #43271.
-
-	* src/cff/cf2font.c (cf2_computeDarkening): Change overflow
-	detection to use logarithms and clamp `scaledStem'.
-
-2014-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* src/base/ftcalc.c: Remove miscellaneous type casts.
-
-2014-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Use more common `FT_MSB' implementation with masks.
-
-	* src/base/ftcalc.c (FT_MSB): Updated.
-
-2014-09-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Clean up.
-
-	* src/base/ftcalc.c (FT_MOVE_SIGN): New macro for frequently used
-	code.
-
-2014-09-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Avoid unnecessary long division.
-
-	This applies to `FT_MulDiv' but not to `FT_DivFix', where overflows or
-	lack thereof are predicted accurately.
-
-	* src/base/ftcalc.c (ft_div64by32): Improve readability.
-	(FT_MulDiv, FT_MulDiv_No_Round) [!FT_LONG64]: Use straight division
-	when multiplication stayed within 32 bits.
-
-2014-09-24  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Minor clean-ups.
-
-	* src/autofit/afhints.c (AF_FLAGS): Remove obsolete values.
-
-	* src/autofit/afhints.c (af_glyph_hints_dump_points,
-	af_glyph_hints_align_strong_points): Updated.
-
-	* src/autofit/aflatin.c (af_latin_hints_link_segments,
-	af_latin_hints_compute_segments), src/autofit/afcjk.c
-	(af_cjk_hints_link_segments), src/autofit/aflatin2.c
-	(af_latin2_hints_link_segments, af_latin2_hints_compute_segments):
-	There are no longer fake segments since more than 10 years...
-
-2014-09-22  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Minor code streamlining.
-
-	* src/autofit/afhints.c (af_axis_hints_new_edge): Remove redundant
-	initialization.
-
-2014-09-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* src/base/ftcalc.c: Harmonize code.
-
-2014-09-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Tighten the overflow check in `FT_MulDiv'.
-
-	* src/base/ftcalc.c (FT_MulDiv) [!FT_LONG64]: Updated.
-
-2014-09-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Fix Savannah bug #43153.
-
-	* src/psaux/psconv.c (PS_Conv_ToFixed): Add protection against
-	overflow in `divider'.
-
-2014-09-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Tighten the overflow check in `FT_DivFix'.
-
-	This fixes a 13-year old bug. The original overflow check should have
-	been updated when rounding was introduced into this function
-	(c2cd00443b).
-
-	* src/base/ftcalc.c (FT_DivFix) [!FT_LONG64]: Updated.
-	* include/freetype.h (FT_DivFix): Updated documentation.
-
-2014-09-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Tighten the overflow check in `FT_MulFix'.
-
-	* src/base/ftcalc.c (FT_MulFix) [!FT_LONG64]: Updated.
-
-2014-09-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[truetype] Shortcut ppem calculations for square pixels.
-
-	* src/truetype/ttinterp.h (TT_ExecContextRec): New field
-	`cur_ppem_func' with a function pointer.
-	* src/truetype/ttinterp.c (TT_RunIns): Initialize `cur_ppem_func'
-	depending on the pixel geometry to either...
-	(Current_Ppem_Stretched): ... this for stretched pixels.
-	(Current_Ppem): ... or this for square pixels.
-	(DO_MPPEM, DO_MPS, Ins_DELTAP, Ins_DELTAC): Use `cur_ppem_func'.
-
-2014-08-31  Behdad Esfahbod  <behdad@behdad.org>
-
-	Don't use `register' keyword.  Fixes compiler warnings.
-
-	* src/base/ftcalc.c (FT_Add64) [!FT_LONG64]: Do it.
-	* src/gzip/inftrees.c (huft_build): Ditto.
-	* src/truetype/ttinterp.c (TT_MulFix14_arm): Ditto.
-
-2014-08-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[truetype] Optimize DELTAP and DELTAC.
-
-	* src/truetype/ttinterp.c (Ins_DELTAP, Ins_DELTAC): Move ppem
-	calculations outside of the loop.
-
-2014-08-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Fix Savannah bug #43033.
-
-	* include/config/ftconfig.h, builds/unix/ftconfig.in,
-	builds/vms/ftconfig.h [FT_LONG64]: Do not disable the macro when
-	64-bit type is `long'.
-
-2014-08-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Small optimization of `FT_MulFix'.
-
-	* src/base/ftcalc.c (FT_MulFix): Loosen up the condition for direct
-	32-bit calculations.
-
-2014-08-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Use unsigned calculation in `FT_MulDiv'.
-
-	* src/base/ftcalc.c (FT_MulDiv): Updated to expand 32-bit range.
-
-2014-08-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Remove truncation in `FT_DivFix'.
-
-	* src/base/ftcalc.c (FT_DivFix): Updated.
-
-2014-08-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Minor refactoring.
-
-	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Updated.
-
-2014-08-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Turn FT_MSB into a macro when using gcc builtins.
-
-	* src/base/ftcalc.c, include/internal/ftcalc.h: Updated.
-
-2014-08-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Avoid undefined FT_MSB in `BBox_Cubic_Check'.
-
-	* src/base/ftbbox.c (BBox_Cubic_Check): Update.
-	(update_cubic_max): Repalce with...
-	(cubic_peak): ... this, which now handles upscaling.
-
-2014-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Handle collapsed outlines to avoid undefined FT_MSB.
-
-	* src/base/ftoutln.c (FT_Outline_Get_Orientation): Update.
-
-2014-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Restore FT_MulFix inlining.
-
-	* include/freetype.h (FT_MulFix): Unconditionally defined.
-
-	* src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: Move code from here...
-
-	* include/internal/ftcalc.h [FT_MULFIX_ASSEMBLER]: ... to here,
-	which conditionally replaces the function with an inline version
-	through the macro.
-
-2014-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Refactor.
-
-2014-07-26  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Fix typo.
-
-	* src/cff/cf2hints.c (cf2_glyphpath_computeOffset): Use correct
-	offsets in third quadrant.
-
-	Reported by maks <maksqwe1@ukr.net>.
-
-2014-07-17  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #42788.
-
-	* src/pfr/pfrobjs.c: Include `ftcalc.h'.
-
-2014-07-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	Replace `ft_highpow2' function.
-
-	* src/pfr/pfrobjs.c (pfr_face_get_kerning): Use `FT_MSB' instead of
-	`ft_highpow2'.
-
-	* src/base/ftutil.c, include/internal/ftobjs.h (ft_highpow2): Remove
-	it.
-
-2014-07-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* src/base/ftcalc.c (FT_MSB): Utilize gcc builtins.
-
-2014-07-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Move assembler code back in the source file.
-
-	FT_MulFix assembler used to reside in ftcalc.c before f47d263f1b.
-
-	* include/config/ftconfig.h, builds/unix/ftconfig.in,
-	builds/vms/ftconfig.h [FT_MULFIX_ASSEMBLER]: Move code from here...
-
-	* src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: ... to here.
-
-2014-07-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Further clean up color bitmap conversion.
-
-	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Stop
-	using FT_MulFix and FT_DivFix since all calculations fit into 32 bits.
-
-2014-07-13  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Improve handling of buggy `prep' tables.
-
-	In case of an error in the `prep' table, no longer try to execute it
-	again and again.  This makes FreeType handle endless loops in buggy
-	fonts much faster.
-
-	* src/truetype/ttobjs.h (TT_SizeRec): The fields `bytecode_ready'
-	and `cvt_ready' are now negative if not initialized yet, otherwise
-	they indicate the error code of the last run.
-
-	* src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep,
-	tt_size_done_bytecode, tt_size_init_bytecode,
-	tt_size_ready_bytecode, tt_size_init, tt_size_done, tt_size_reset):
-	Updated.
-
-	* src/truetype/ttgload.c (tt_loader_init): Updated.
-	* src/truetype/ttinterp.c (TT_RunIns): Force reexecution of `fpgm'
-	and `prep' only if we are in the `glyf' table.
-
-2014-07-12  Werner Lemberg  <wl@gnu.org>
-
-	* builds/vms/ftconfig.h: Synchronize.
-	Problem reported by Alexei.
-
-2014-07-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Clean up bitmap conversion.
-
-	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use
-	appropriate FT_DivFix and remove superfluous upscaling.
-
-2014-07-04  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Small optimization of the ancient code.
-
-	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Loosen up the
-	condition for direct 32-bit calculations.
-
-2014-06-27  Werner Lemberg  <wl@gnu.org>
-
-	Fix Apple standard glyph names.
-
-	* src/sfnt/ttpost.c (tt_post_default_names): Synchronize with
-	`tools/glnames.py'
-
-	Problem reported by Adam Twardoch <adam@fontlab.com>.
-
-2014-06-17  Werner Lemberg  <wl@gnu.org>
-
-	Partially revert commit from 2014-06-13.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Move
-	declaration of `p_first' and `p_last' out of the loop.
-
-2014-06-17  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/freetype2.m4: s/AC_PATH_PROG/AC_PATH_TOOL/.
-
-	This simplifies cross-compiling.
-
-2014-06-13  Werner Lemberg  <wl@gnu.org>
-
-	Fix more compiler warnings.
-	Reported by Wojciech Mamrak <wmamrak@gmail.com>.
-
-	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
-	Make integer constant unsigned.
-
-	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
-	<TT_SBIT_TABLE_TYPE_SBIX>: Fix types.
-	(tt_sbit_decoder_load_compound, tt_face_load_sbix_image): Add proper
-	casts.
-
-2014-06-13  Werner Lemberg  <wl@gnu.org>
-
-	Fix compiler warnings.
-	Reported by Wojciech Mamrak <wmamrak@gmail.com>.
-
-	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage),
-	src/autofit/afmodule.c (af_property_set): Fix `signed' vs.
-	`unsigned' issues.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Make compiler
-	happy.
-
-	* src/base/ftlcdfil.c (_ft_lcd_filter_fir): Use only four elements
-	for `fir'.
-	Fix `signed' vs. `unsigned' issues.
-
-	* src/sfnt/sfobjs.c (WRITE_BYTE): Removed, unused.
-	(WRITE_USHORT, WRITE_ULONG): Add proper casts.
-
-	* src/truetype/ttgload.c (TT_Get_VMetrics): Add proper casts.
-
-	* src/truetype/ttinterp.c (Ins_DELTAP): Add proper casts for `B1'
-	and `B2'.
-
-2014-05-16  Alexey Petruchik  <alexey.petruchik@gmail.com>
-
-	[cmake] Add option to build OS X framework.
-
-	* CMakeLists.txt: Update accordingly.
-
-	* builds/mac/freetype-Info.plist: New file.
-
-2014-05-13  Pavel Koshevoy  <pkoshevoy@gmail.com>
-
-	* CMakeLists.txt (BASE_SRCS): Add missing `ftbdf.c'.
-
-2014-05-11  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix variable initializations.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Assign default
-	values to `in_dir' and `out_dir' for all points.
-
-2014-05-11  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix crash with font `CabinSketch-Bold.ttf'.
-
-	Problem reported by Ralf S. Engelschall <rse@engelschall.com>.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Fix threshold for
-	finding first non-near point.
-	Properly initialize non-near point deltas.
-
-2014-05-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add blue-zone support for Devanagari.
-
-	This essentially moves the Devanagari script from the `Indic' hinter
-	to the `Latin' hinter.  Thanks to Girish Dalvi
-	<girish.dalvi@gmail.com> for guidance with blue zone characters!
-
-	* src/autofit/afblue.dat: Add blue zone data for Devanagari.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/afscript.h: Add Devanagari standard characters and
-	move data out of AF_CONFIG_OPTION_INDIC block.
-
-	* src/autofit/afranges.c: Move Devanagari data out of
-	AF_CONFIG_OPTION_INDIC block.
-	Move U+20B9, (new) Rupee sign, from Latin to Devanagari.
-
-	* src/autofit/afstyles.h: Update Devanagari data; in particular, use
-	AF_WRITING_SYSTEM_LATIN.
-
-2014-05-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix handling of neutral blue zones in stems.
-
-	* src/autofit/afhints.h (AF_Edge_Flags): New value
-	`AF_EDGE_NEUTRAL'.
-
-	* src/autofit/aflatin.c (af_latin_hints_compute_blue_edges): Trace
-	neutral blue zones with AF_EDGE_NEUTRAL.
-	(af_latin_hint_edges): Skip neutral blue zones if necessary.
-
-2014-04-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce neutral blue zones to the latin module.
-
-	Such blue zones match either the top or the bottom of a contour.  We
-	need them for scripts where accent-like elements directly touch the
-	base character (for example, some vowel signs in Devanagari, cf.
-	U+0913 or U+0914).
-
-	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_NEUTRAL): New
-	property.
-
-	* src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/aflatin.h (AF_LATIN_IS_NEUTRAL_BLUE): New macro.
-	(AF_LATIN_BLUE_NEUTRAL): New enumeration value.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues,
-	af_latin_hints_compute_blue_edges): Handle neutral blue zones.
-
-2014-04-25  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/hbshim.c: Partially revert commit from 2014-04-17.
-
-	Using input glyph coverage data is simply wrong.
-
-	Problem reported by Nikolaus Waxweiler <madigens@gmail.com> and
-	Mantas Mikulėnas <grawity@gmail.com>.
-
-2014-04-23  Werner Lemberg  <wl@gnu.org>
-
-	* src/raster/ftraster.c (Vertical_Sweep_Span): Use drop-out mode.
-
-	This spot has been missed while introducing support for various
-	drop-out modes years ago (including no drop-out mode, which this
-	commit fixes).
-
-	Problem reported by Patrick Thomas <pthomas505@gmail.com>.
-
-2014-04-22  Werner Lemberg  <wl@gnu.org>
-
-	* src/sfnt/pngshim.c (error_callback): s/longjmp/ft_longjmp/.
-
-2014-04-20  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix Savannah bug #42148.
-
-	The adaptation of the cjk auto-hinter module to blue stringsets in
-	2013-08-25 had three severe bugs.  Mea culpa.
-
-	1. Contrary to the latin auto-hinter, characters for reference and
-	   overshoot values of a blue zone are specified separately.  Due to
-	   the screwed-up change it didn't work at all.
-
-	2. A boolean comparison was erroneously replaced with a cast,
-	   causing invalid results with the `^' operator later on.  The
-	   visual artifact caused by this problem is the topic of the bug
-	   report.
-
-	3. Two flag values were inverted, causing incorrect assignment of
-	   reference and overshoot values.
-
-	* src/autofit/afblue.dat: Fix CJK bluestrings, introducing a new
-	syntax to have both reference and overshoot characters in a single
-	string.  This is error #1.
-	Add extensive comments.
-
-	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_CJK_FILL): Removed, no
-	longer used.
-	(AF_BLUE_PROPERTY_CJK_TOP, AF_BLUE_PROPERTY_CJK_HORIZ): Fix values.
-	This is error #3.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_blues): Correct error #1.
-	Use character `|' to separate characters for reference and overshoot
-	values.
-	Improve tracing messages, synchronizing them with the latin
-	auto-hinter.
-	(af_cjk_hints_compute_blue_edges): Fix value of `is_top_right_blue'.
-	This is error #2.
-	(af_cjk_align_linked_edge): Add tracing message.
-
-	* src/autofit/afcjk.h (AF_CJK_IS_FILLED_BLUE): Removed, no longer
-	used.
-
-2014-04-17  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] More coverage fixes for complex scripts.
-
-	* src/autofit/hbshim.c (af_get_coverage): Merge input glyph coverage
-	of GSUB lookups into output coverage.  Otherwise, ligatures are not
-	handled properly.
-	Don't check blue zone characters for default coverage.
-
-2014-04-17  Werner Lemberg  <wl@gnu.org>
-
-	Make `FT_Get_SubGlyph_Info' actually work.
-
-	* src/base/ftobjs.c (FT_Get_SubGlyph_Info): Return FT_Err_Ok
-	if there is no error.
-
-2014-04-15  Werner Lemberg  <wl@gnu.org>
-
-	[afblue.pl]: Minor improvements.
-
-	* src/tools/afblue.pl: Allow whitespace before comments.
-	Ignore whitespace in strings.
-
-2014-04-14  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve coverage handling.
-
-	* src/autofit/hbshim.c (af_get_coverage): Don't exclude glyphs
-	appearing in the GPOS table if we are processing the default
-	coverage.
-
-2014-04-13  David Weber <weber.aulendorf@googlemail.com>
-
-	[smooth] Fix stand-alone compilation.
-
-	* src/smooth/ftgrays.c (FT_BEGIN_STMNT, FT_END_STMNT): Define.
-
-2014-04-12  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Redesign the recognition algorithm of strong points.
-
-	In particular, local extrema without horizontal or vertical segments
-	are better recognized:
-
-	  + A                + D
-	   \                /
-	    \              /
-	     \            /
-	      \          /
-	       \        + C
-	        \    /
-	       B +/
-
-	If the distances AB and CD are large, point B wasn't previously
-	detected as an extremum since the `ft_corner_is_flat' function
-	`swallowed' BC regardless of its direction, tagging point B as weak.
-	The next iteration started at B and made `ft_corner_is_flat' swallow
-	point C, tagging it as weak also, et voilà.
-
-	To improve that, another pass gets now performed before calling
-	`ft_corner_is_flat' to improve the `topology' of an outline: A
-	sequence of non-horizontal or non-vertical vectors that point into
-	the same quadrant are handled as a single, large vector.
-
-	Additionally, distances of near points are now accumulated, which
-	makes the auto-hinter handle them as if they were prepended to the
-	next non-near vector.
-
-	This generally improves the auto-hinter's rendering results.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Implement it.
-
-	* src/autofit/afhints.h (AF_FLAGS): Remove no longer used flag
-	`AF_FLAG_NEAR'.
-
-2014-04-05  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve scoring algorithm for identifying stems.
-
-	Problem reported by Karsten Lücke <karsten.luecke@kltf.de>.
-
-	The new algorithm takes care of the width of stems: If the distance
-	between two segments is larger than the largest stem width, the
-	demerits quickly increase for larger distances.  This improves
-	hinting of slanted fonts (especially if the inner parts of serifs
-	have non-horizontal `shoulders'), avoiding false stem links.
-
-	* src/autofit/aflatin.c (af_latin_hints_link_segments): Use largest
-	stem width (if available) to compute better demerits for distances
-	between stems.
-	(af_latin_hints_detect_features): Pass stem width array and array
-	size.
-	(af_latin_metrics_init_widths): Updated to use original algorithm.
-	(af_latin_hints_apply): Updated to use new algorithm.
-
-	* src/autofit/aflatin.h: Updated.
-	* src/autofit/afcjk.c: Updated.
-
-2014-04-03  Werner Lemberg  <wl@gnu.org>
-
-	Don't require `gzip' module for `sfnt'.
-
-	Reported by Preet <prismatic.project@gmail.com>.
-
-	* src/sfnt/sfobjs.c (woff_open_font): Guard use of
-	FT_Gzip_Uncompress with FT_CONFIG_OPTION_USE_ZLIB.
-
-2014-03-27  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #38235.
-
-	Work around a bug in pkg-config version 0.28 and earlier: If a
-	variable value gets surrounded by doublequotes (in particular values
-	for the `prefix' variable), the prefix override mechanism fails.
-
-	* builds/unix/freetype2.in: Don't use doublequotes.
-	* builds/unix/unix-def.in (freetype.pc): Escape spaces in directory
-	names with backslashes.
-
-2014-03-24  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41946.
-
-	Based on a patch from Marek Kašík <mkasik@redhat.com>.
-
-	* builds/unix/configure.raw (LIBS_CONFIG): Remove.
-	* builds/unix/freetype-config.in (libs): Hard-code value.
-	* builds/unix/unix-def.in: Updated.
-
-2014-03-22  Werner Lemberg  <wl@gnu.org>
-
-	Another revert for the change from 2014-03-18.
-
-	Problem reported by Nikolaus Waxweiler <madigens@gmail.com>.
-
-	* src/base/ftcalc.c (FT_MulFix): Ensure that an `FT_MulFix' symbol
-	gets always exported.
-
-2014-03-20  Werner Lemberg  <wl@gnu.org>
-
-	CMakeLists.txt: Another fix for include directories.
-
-	Problem reported by Taylor Holberton <taylorcholberton@gmail.com>.
-
-2014-03-19  Werner Lemberg  <wl@gnu.org>
-
-	CMakeLists.txt: Fix include directories.
-
-	Problem reported by Taylor Holberton <taylorcholberton@gmail.com>.
-
-2014-03-19  Werner Lemberg  <wl@gnu.org>
-
-	Partially revert last commit.
-
-	Found by Alexei.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Initializing
-	those variables is plain wrong, since we are in a loop.
-
-2014-03-18  Sean McBride  <sean@rogue-research.com>
-	    Werner Lemberg  <wl@gnu.org>
-
-	Fix clang warnings.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize
-	some variables.
-
-	* src/base/ftcalc.c (FT_MulFix): Only use code if
-	`FT_MULFIX_INLINED' is not defined.
-
-	* src/bdf/bdfdrivr.c (bdf_cmap_class), src/cache/ftcbasic.c
-	(ftc_basic_image_family_class, ftc_basic_image_cache_class,
-	ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class),
-	src/cache/ftccmap.c (ftc_cmap_cache_class), src/cache/ftcmanag.c
-	(ftc_size_list_class, ftc_face_list_class), src/pcf/pcfdrivr.c
-	(pcf_cmap_class), src/pfr/pfrdrivr.c (pfr_metrics_service_rec): Make
-	function static.
-
-	* src/type1/t1driver.c (t1_ps_get_font_value): Remove redundant
-	code.
-
-2014-03-17  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41869.
-
-	This works around a problem with HarfBuzz (<= 0.9.26), which doesn't
-	validate glyph indices returned by
-	`hb_ot_layout_lookup_collect_glyphs'.
-
-	* src/autofit/hbshim.c (af_get_coverage): Guard `idx'.
-
-	* docs/CHANGES: Updated.
-
-2014-03-14  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/configure.raw: Don't show error messages of `which'.
-
-2014-03-09  Alan Coopersmith  <alan.coopersmith@oracle.com>
-
-	Fix cppcheck 1.64 warning.
-
-	* src/autofit/afglobal.c (af_face_globals_new): Catch NULL pointer
-	dereference in case of error.
-
-2014-03-09  Sean McBride  <sean@rogue-research.com>
-
-	* src/sfnt/ttcmap.c (tt_face_build_cmaps): Remove clang warning.
-
-2014-03-06  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.3 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-3'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.3.
-
-	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
-	builds/windows/vc2008/freetype.vcproj,
-	builds/windows/vc2008/index.html,
-	builds/windows/vc2010/freetype.vcxproj,
-	builds/windows/vc2010/index.html,
-	builds/windows/visualc/freetype.dsp,
-	builds/windows/visualc/freetype.vcproj,
-	builds/windows/visualc/index.html,
-	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj,
-	builds/windows/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.2/2.5.3/, s/252/253/.
-
-	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
-
-	* builds/unix/configure.raw (version_info): Set to 17:2:11.
-	* CMakeLists.txt (VERSION_PATCH): Set to 3.
-	* docs/CHANGES: Updated.
-
-2014-03-06  Werner Lemberg  <wl@gnu.org>
-
-	Fixes for compilation with C++.
-
-	* src/autofit/hbshim.c (scripts): Change type to `hb_script_t'.
-	(af_get_coverage): Updated.
-	(COVERAGE): Add cast.
-
-2014-03-06  Sean McBride  <sean@rogue-research.com>
-
-	Remove more clang analyzer warnings.
-
-	* src/bdf/bdflib.c (_bdf_readstream), src/truetype/ttgload.c
-	(TT_Load_Glyph): Remove dead stores.
-
-2014-03-05  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/configure.raw: Simplify.
-
-2014-03-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Fix a bug in configure in library dependency setting
-	Reported in https://bugs.freedesktop.org/show_bug.cgi?id=75652.
-
-	* builds/unix/configure.raw: Use `x"${xxx}" != xno' style.
-
-2014-03-04  Werner Lemberg  <wl@gnu.org>
-
-	Minor fix for `make devel'.
-
-	* builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Don't use
-	pkg-config for bzip2 since not all GNU/Linux distributions have
-	`bzip2.pc' (and the header file `bzlib.h' is located in /usr/include
-	normally).
-
-2014-03-04  Sean McBride  <sean@rogue-research.com>
-
-	Fix several clang static analyzer dead store warnings.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload,
-	af_glyph_hints_align_weak_points): Remove unnecessary assignments.
-
-	* src/bdf/bdflib.c (bdf_font_load): Ditto.
-
-	* src/pshinter/pshalgo.c (psh_glyph_compute_extrema,
-	psh_glyph_interpolate_other_points): Ditto.
-
-	* src/type1/t1load.c (T1_Set_MM_Blend): Ditto.
-
-2014-03-03  Werner Lemberg  <wl@gnu.org>
-
-	Rewrite library option handling in `configure'.
-
-	o Introduce `auto' value for `--with-XXX' library options; this is
-	  now the default.
-
-	o First use `pkg-config' for library detection, then fall back to
-	  other tests.
-
-	* builds/unix/configure.raw (--with-zlib, --with-bzip2, --with-png,
-	--with-harfbuzz): Rewrite.
-	Use new `xxx_reqpriv', `xxx_libpriv', and `xxx_libstaticconf'
-	variables to collect data for `freetype2.pc' and `freetype-config'.
-	(FT2_EXTRA_LIBS): Renamed to ...
-	(ft2_extra_libs): This since it gets no longer substituted.
-	(REQUIRES_PRIVATE, LIBS_PRIVATE, LIBS_CONFIG, LIBSSTATIC_CONFIG):
-	New output variables, replacing `XXX_PKG' and `LIBXXX'.
-	Add notice at the end of `configure' showing the library
-	configuration.
-
-	* builds/unix/freetype-config.in (--static): New command line
-	option.
-	(libs): Updated.
-	(staticlibs): New variable, to be used if `--static' is given.
-	* docs/freetype-config.1: Document `--static'.
-
-	* builds/unix/freetype2.in, builds/unix/unix-def.in: Updated.
-
-2014-03-01  Werner Lemberg  <wl@gnu.org>
-
-	Avoid `long long' warnings with older gcc compilers.
-	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
-
-	* builds/unix/configure.raw: Don't use gcc's `-pedantic' flag for
-	versions < 4.6.  This is especially needed for Max OS X since this
-	OS runs a gcc variant (or emulation) based on version 4.2.1.
-
-2014-03-01  Werner Lemberg  <wl@gnu.org>
-
-	* docs/INSTALL.CROSS: Revised and updated.
-
-2014-03-01  Werner Lemberg  <wl@gnu.org>
-
-	Make `make clean' remove `freetype2.pc'.
-
-	This is a generated file at build time, not configure time.
-
-	* builds/unix/unix-def.in (DISTCLEAN): Move `freetype2.pc' to ...
-	(CLEAN): This variable.
-
-2014-03-01  Werner Lemberg  <wl@gnu.org>
-
-	Use pkg-config for detecting libpng and libbz2 also.
-
-	* builds/unix/configure.raw (HAVE_PKG): New variable.
-	Search for libbz2 using `pkg-config'; s/BZ2/BZIP2/.
-	Search for libpng using `pkg-config'.
-	Fix definition of `LIBHARFBUZZ' variable.
-	* builds/unix/freetype-config.in ($libs): Updated.
-	* builds/unix/freetype2.in: Add `URL' field.
-	Update `Requires.private' and `Libs.private'.
-	* builds/unix/unix-def.in: Updated.
-
-2014-03-01  Werner Lemberg  <wl@gnu.org>
-
-	Add configure support for HarfBuzz.
-
-	* builds/unix/pkg.m4: New file.
-	* builds/unix/configure.raw: Search for libharfbuzz using
-	`pkg-config'.
-	Add `--without-harfbuzz' option.
-	* builds/unix/freetype-config.in, builds/unix/freetype2.in,
-	builds/unix/unix-def.in (freetype-config, freetype2.pc): Handle
-	HarfBuzz.
-
-	* docs/INSTALL.UNIX: Document interdependency of Freetype with
-	HarfBuzz.
-
-2014-02-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[cff] Math simplifications.
-
-	* src/cf2blues.c (cf2_blues_init): Use `FT_MulDiv'.
-	* src/cf2ft.c (cf2_getScaleAndHintFlag): Use simple division.
-
-2014-02-28  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix Savannah bug #41697, part 2.
-
-	* src/cff/cf2ft.c (cf2_initLocalRegionBuffer,
-	cf2_initGlobalRegionBuffer): It is possible for a charstring to call
-	a subroutine if no subroutines exist.  This is an error but should
-	not trigger an assert.  Split the assert to account for this.
-
-2014-02-28  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix Savannah bug #41697, part 1.
-
-	* src/cff/cf2hints.c (cf2_hintmap_build): Return when `hintMask' is
-	invalid.  In this case, it is not safe to use the length of
-	`hStemHintArray'; the exception has already been recorded in
-	`hintMask'.
-
-2014-02-26  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix Savannah bug #41696.
-
-	* src/sfnt/ttcmap.c (tt_cmap0_validate, tt_cmap2_validate,
-	tt_cmap4_validate, tt_cmap14_validate): Fix limit tests.
-
-2014-02-26  Werner Lemberg  <wl@gnu.org>
-
-	[winfnt] Fix Savannah bug #41694.
-
-	* src/winfonts/winfnt.c (FNT_Load_Glyph): Check glyph offset.
-
-2014-02-26  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Fix Savannah bug #41693.
-
-	* src/cff/cffload.c (CFF_Load_FD_Select): Reject empty array.
-
-2014-02-26  Werner Lemberg  <wl@gnu.org>
-
-	[bdf] Fix Savannah bug #41692.
-
-	bdflib puts data from the input stream into a buffer in chunks of
-	1024 bytes.  The data itself gets then parsed line by line, simply
-	increasing the current pointer into the buffer; if the search for
-	the final newline character exceeds the buffer size, more data gets
-	read.
-
-	However, in case the current line's end is very near to the buffer
-	end, and the keyword to compare with is longer than the current
-	line's length, an out-of-bounds read might happen since `memcmp'
-	doesn't stop properly at the string end.
-
-	* src/bdf/bdflib.c: s/ft_memcmp/ft_strncmp/ to make comparisons
-	stop at string ends.
-
-2014-02-17  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[autofit] Fix `make multi' compilation.
-
-	* src/autofit/hbshim.c: Include `afglobal.h' and `aftypes.h'.
-
-2014-02-19  Werner Lemberg  <wl@gnu.org>
-	    Simon Bünzli  <zeniko@gmail.com>
-
-	Fix Savannah bug #32902.
-
-	Patch taken from
-
-	  https://code.google.com/p/sumatrapdf/source/browse/trunk/ext/_patches/freetype2.patch?spec=svn8620&r=8620#87
-
-	with slight modifications.
-
-	* src/type1/t1parse.c (T1_Get_Private_Dict): Add heuristic test to
-	handle fonts that incorrectly use \r at the beginning of an eexec
-	block.
-
-2014-02-19  Simon Bünzli  <zeniko@gmail.com>
-
-	Fix Savannah bug #41590.
-
-	* src/type1/t1load.c (parse_encoding): Protect against invalid
-	number.
-
-2014-02-12  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Optimize by using `FT_MulDiv'.
-	Suggested by Alexei.
-
-	* src/cff/cf2font.c (cf2_computeDarkening): Do it.
-
-2014-02-12  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41465.
-
-	* builds/unix/unix-def.in (CLEAN): Add `freetype-config'.
-	(DISTCLEAN): Remove `freetype-config'.
-
-2014-02-08  Sean McBride  <sean@rogue-research.com>
-
-	Fix clang static analyzer and compiler warnings.
-
-	* src/autofit/afhints.c (af_glyph_hints_align_weak_points),
-	src/autofit/afloader (af_loader_load_g) <FT_GLYPH_FORMAT_COMPOSITE>,
-	src/base/ftcalc.c (FT_MSB), src/base/ftoutln.c
-	(FT_Outline_Decompose), src/bdf/bdfdrivr.c (bdf_interpret_style),
-	src/cff/cffparse.c (cff_parse_integer), src/cid/cidparse.c
-	(cid_parser_new), src/pfr/pfrload.c (pfr_phy_font_load),
-	src/raster/ftraster.c (Decompose_Curve), src/sfnt/sfdriver.c
-	(sfnt_get_ps_name), src/sfnt/ttcmap.c (tt_cmap12_next,
-	tt_cmap13_next), src/smooth/ftgrays.c (gray_hline): Remove dead
-	code.
-
-	* src/autofit/afmodule.c (af_property_get_face_globals,
-	af_property_set, af_property_get), src/base/ftbitmap.c
-	(ft_gray_for_premultiplied_srgb_bgra): Make functions static.
-
-	* src/base/ftobjs.c (ft_remove_renderer): Protect against
-	library == NULL.
-	(ft_property_do): Make function static.
-
-	* src/base/ftrfork.c: Include `ftbase.h'.
-
-	* src/sfnt/ttsbit.c (tt_face_load_sbix_image)
-	[!FT_CONFIG_OPTION_USE_PNG], src/type1/t1gload.c
-	(T1_Compute_Max_Advance): Avoid compiler warning.
-
-	* src/truetype/ttinterp.c (TT_New_Context): Reduce scope of
-	variable.
-
-2014-02-08  Werner Lemberg  <wl@gnu.org>
-
-	Fix Windows build directories.
-
-	The build target is now `windows' instead of `win32'.
-
-	Problem reported by Nickolas George <darknova.clan@gmail.com>.
-
-	* builds/modules.mk: Don't use `win32' and `win16' (!) but
-	`windows'.
-
-	* builds/windows/detect.mk, builds/windows/win32-def.mk:
-	s/win32/windows/.
-
-2014-02-08  Eugen Sawin  <esawin@mozilla.com>
-
-	Fix Savannah bug #41507.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap)
-	[!FT_CONFIG_OPTION_USE_PNG] <17, 17, 19>: Fix error handling.
-
-2014-02-08  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix minor performance bug.
-
-	* src/cff/cf2font.c (cf2_font_setup): Darkening amount and blue zone
-	calculations are now cached and not recomputed on each glyph.
-
-2014-02-05  Werner Lemberg  <wl@gnu.org>
-
-	Fix problems with perl 5.8.8 as distributed with current MinGW.
-
-	* src/tools/afblue.pl: Work-around for Perl bug #63402.
-	(string_re): Avoid `possessive quantifiers', which have been
-	introduced in Perl version 5.10.
-
-2014-02-04  Werner Lemberg  <wl@gnu.org>
-
-	Fix compilation with MinGW.
-
-	Right now, compilation out of the box with latest MinGW is broken
-	due to bugs in header files of mingwrt 4.0.3 in strict ANSI mode,
-	cf.
-
-	  https://sourceforge.net/p/mingw/bugs/2024/
-	  https://sourceforge.net/p/mingw/bugs/2046/
-
-	* builds/unix/configure.raw: Don't set `-ansi' flag for MinGW.
-
-2014-02-04  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Minor fix.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
-	src/autofit/aflatin.c (af_latin_metrics_init_widths): Fix handling
-	of alternative standard characters.
-	This also fixes a compilation warning in non-debug mode.
-
-2014-02-03  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Fix Savannah bug #41363.
-
-	* src/cff/cf2ft.c (cf2_checkTransform): Convert assertion into
-	parameter check.
-	(cf2_decoder_parse_charstrings): Call `cf2_checkTransform' only if
-	we are scaling the outline.
-	(cf2_getPpemY): Remove problematic assertion.
-
-2014-01-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce two more slots for standard characters.
-
-	This is useful for OpenType features like `c2sc' (caps to small
-	caps) that don't have lowercase letters by definition, or other
-	features that mainly operate on numerals.
-
-	* src/autofit/afscript.h: Add more standard characters.
-
-	* src/autofit/aftypes.h: Update use of `SCRIPT' macro.
-	(AF_ScriptClassRec): Add members to hold two more standard
-	characters.
-	(AF_DEFINE_SCRIPT_CLASS): Updated.
-
-	* src/autofit/afglobal.c, src/autofit/afglobal.h,
-	* src/autofit/afpic.c, src/autofit/afranges.h, src/autofit/hbshim.c:
-	Update use of `SCRIPT' macro.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
-	src/autofit/aflatin.c (af_latin_metrics_init_widths): Scan two more
-	standard characters.
-
-2014-01-24  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41320.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues)
-	<AF_LATIN_IS_LONG_BLUE>: Avoid negative index of `last'.
-
-2014-01-23  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41310.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap) <glyph_format==5>:
-	Don't check metrics, which this format doesn't have.
-	This is another correction to the commit from 2013-11-21.
-
-2014-01-23  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41309.
-
-	* src/type1/t1load.c (t1_parse_font_matrix): Properly handle result
-	of `T1_ToFixedArray'.
-
-	* src/cid/cidload.c (cid_parse_font_matrix): Synchronize with
-	`t1_parse_font_matrix'.
-
-	* src/type42/t42parse.c (t42_parse_font_matrix): Synchronize with
-	`t1_parse_font_matrix'.
-	(t42_parse_encoding): Synchronize with `t1_parse_encoding'.
-
-	* src/psaux/psobjs.c (ps_parser_load_field) <T1_FIELD_TYPE_BBOX>,
-	<T1_FIELD_TYPE_MMOX>: Properly handle result of `ps_tofixedarray'.
-
-2014-01-22  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/hbshim.c (af_get_coverage): Fix memory leaks.
-
-2014-01-16  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve tracing of style coverages.
-
-	* include/internal/fttrace.h: Add `afglobal' for tracing style
-	coverages.
-
-	* src/autofit/afglobal.c: Include FT_INTERNAL_DEBUG_H.
-	(FT_COMPONENT): Define.
-	(af_face_globals_compute_style_coverage): Trace `gstyles' array
-	data.
-
-2014-01-09  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #41158.
-
-	* builds/unix/install.mk (install): Create man page directory.
-
-2014-01-08  Chongyu Zhu  <lembacon@gmail.com>
-
-	[arm] Fix Savannah bug #41138, part 2.
-
-	* builds/unix/ftconfig.in (FT_MulFix_arm), include/config/ftconfig.h
-	(FT_MulFix_arm), src/truetype/ttinterp.c (TT_MulFix14_arm): Fix
-	preprocessor conditionals for `add.w'.
-
-2014-01-08  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix Savannah bug #41138, part 1.
-
-	* src/tools/afblue.pl <Handling #endif>: Produce correct auxiliary
-	enumeration names for generated `#else'.
-
-	* src/autofit/afblue.h: Regenerated.
-
-2014-01-06  Werner Lemberg  <wl@gnu.org>
-
-	Add manual page for `freetype-config'.
-	Contributed by Nis Martensen <nis.martensen@web.de>.
-
-	* docs/freetype-config.1: New file.
-
-	* builds/unix/unix-def.in (mandir): Define.
-	* builds/unix/install.mk (install, uninstall): Handle manpage.
-
-2014-01-05  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Minor fixes for `afblue.pl'.
-
-	* src/tools/afblue.pl (aux_name): Don't use `reverse'.
-	<Handling #endif>: Use proper indentation for generated `#else'.
-
-	* src/autofit/afblue.h: Regenerated.
-
-2014-01-04  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix Indic scripts.
-
-	Split the single, incorrect Indic entry into separate scripts so
-	that the covered ranges are the same: Bengali, Devanagari, Gujarati,
-	Gurmukhi, Kannada, Limbu, Malayalam, Oriya, Sinhala, Sundanese,
-	Syloti Nagri, Tamil, Telugu, and Tibetan.  At the same time, remove
-	entries for Meetai Mayak and Sharada – the Unicode ranges were
-	incorrect (and nobody has complained about that), fonts are scarce
-	for those scripts, and the Indic auto-hinter support is rudimentary
-	anyways.
-
-	* src/autofit/afscript.h: Updated, using AF_CONFIG_OPTION_INDIC and
-	AF_CONFIG_OPTION_CJK.
-
-	* src/autofit/afstyles.h (STYLE_DEFAULT_INDIC): New auxiliary macro.
-	Use it, together with AF_CONFIG_OPTION_INDIC and
-	AF_CONFIG_OPTION_CJK, to update.
-
-	* src/autofit/afranges.c [AF_CONFIG_OPTION_INDIC]: Updated.
-	[!AF_CONFIG_OPTION_INDIC, !AF_CONFIG_OPTION_CJK]: Removed.
-	Sort entries by tags.
-
-2014-01-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Thinko.
-
-	* src/autofit/hbshim.c (af_get_char_index): Similar to
-	`af_get_coverage', reject glyphs which are not substituted.
-
-2014-01-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix handling of default coverages.
-
-	With this commit, the implementation of coverage handling is
-	completed.
-
-	* src/autofit/hbshim.c (af_get_coverage): Exit early if nothing to
-	do.
-	Reject coverages which don't contain appropriate glyphs for blue
-	zones.
-
-2014-01-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix handling of default coverages.
-
-	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
-	First handle non-default coverages, then the default coverage of the
-	default script, and finally the other default coverages.
-
-2014-01-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix scaling of HarfBuzz shaping.
-
-	* src/autofit/hbshim.c (af_get_char_index): Scale to units per EM.
-
-2014-01-03  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Better ftgrid support.
-
-	* src/autofit/afhints.c (af_glyph_hints_get_segment_offset): Add
-	parameters `is_blue' and `blue_offset'.
-
-2014-01-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Remove some styles.
-
-	* src/autofit/afcover.h: Remove coverages for alternative fractions,
-	denominators, numerators, and fractions.
-
-	* src/autofit/afstyles.h (META_STYLE_LATIN): Updated.
-
-2014-01-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add more styles.
-
-	* src/autofit/afstyles.h (STYLE_LATIN, META_STYLE_LATIN): New
-	auxiliary macros; use them to define styles for Cyrillic, Greek, and
-	Latin.
-
-	* src/autofit/afcover.h: Remove coverage for oldstyle figures.
-	Since those digits are used in combination with ordinary letters, it
-	makes no sense to handle them separately.
-
-	* src/autofit/afglobal.c (af_face_globals_get_metrics): Don't limit
-	`options' parameter to 4 bits.
-
-2014-01-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix style assignments to glyphs.
-
-	* src/autofit/hbshim.c (af_get_coverage)
-	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Scan GPOS coverage of features also
-	so that we can skip glyphs that have both GSUB and GPOS data.
-
-2014-01-01  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/hbshim.c: s/{lookups,glyphs}/gsub_{lookups,glyphs}/.
-
-2014-01-01  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Implement and use `af_get_char_index' with HarfBuzz.
-
-	* src/autofit/hbshim.c (COVERAGE) [FT_CONFIG_OPTION_USE_HARFBUZZ]:
-	Redefine to construct HarfBuzz features.
-	(af_get_char_index) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Rewritten.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Use
-	`y_offset' to adjust `best_y'.
-
-2013-12-31  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/AF_STYLE_...._DEFAULT/AF_STYLE_...._DFLT/i.
-
-2013-12-31  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix interface of `af_get_char_index'.
-
-	* src/autofit/hbshim.c (af_get_char_index): Return error value.
-	Add argument for y offset (to be used in a yet-to-come patch).
-
-	* src/autofit/hbshim.h, src/autofit/afcjk.c,
-	src/autofit/aflatin.c: Updated.
-
-2013-12-30  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Don't combine multiple features into one set.
-
-	Combining them, as originally envisioned, would lead to much more
-	complicated code, as investigations have shown meanwhile.  The major
-	drawback is that we run out of available style slots much earlier.
-	However, this is only a theoretical issue since we don't support a
-	large number of scripts currently.
-
-	* src/autofit/afcover.h: Replace `COVERAGE_{1,2,3}' macros with
-	a single-element `COVERAGE' macro, sort the elements by the feature
-	tags, and add entry for `ruby'.
-
-	* src/autofit/aftypes.h: Updated.
-	* src/autofit/hbshim.c: Updated.
-
-2013-12-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Code shuffling to reduce use of cpp macros.
-
-	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
-	Call `af_get_coverage' unconditionally.
-
-	* src/autofit/autofit.c: Include `hbshim.c' unconditionally.
-
-	* src/autofit/hbshim.c (af_get_coverage)
-	[!FT_CONFIG_OPTION_USE_HARFBUZZ]: Provide dummy function.
-
-	* src/autofit/hbshim.h: Provide function declarations
-	unconditionally.
-
-2013-12-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add wrapper function for `FT_Get_Char_Index'.
-
-	Yet-to-come changes will provide HarfBuzz functionality for the new
-	function.
-
-	* src/autofit/hbshim.c (af_get_char_index): New function.
-	* src/autofit/hbshim.h: Updated.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
-	af_cjk_metrics_init_blues, af_cjk_metrics_check_digits): Updated.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
-	af_latin_metrics_init_blues, af_latin_metrics_check_digits):
-	Updated.
-
-2013-12-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Use `global' HarfBuzz font object.
-
-	We now use `hb_font' instead of `hb_face' since yet-to-come changes
-	need this.
-
-	* src/autofit/afglobal.h: Include `hbshim.h'.
-	(AF_FaceGlobalsRec) [FT_CONFIG_OPTION_USE_HARFBUZZ]: New member
-	`hb_font'.
-
-	* src/autofit/afglobal.c (af_face_globals_new)
-	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Create `hb_font'.
-	(af_face_globals_free) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Destroy
-	`hb_font'.
-
-	* src/autofit/hbshim.h: Include HarfBuzz headers.
-
-	* src/autofit/hbshim.c: Include `hbshim.h' instead of HarfBuzz
-	headers.
-	(af_get_coverage): Updated.
-
-2013-12-27  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Handle `DFLT' OpenType script for coverages.
-
-	* include/ftautoh.h: Document new `default-script' property.
-
-	* src/autofit/hbshim.c (af_get_coverage): Use `AF_FaceGlobals' for
-	type of first parameter.
-	(script_tags): Add one more element.
-	(af_get_coverage): Adjust `script_tags' to handle `DFLT' script tag.
-
-	* src/autofit/hbshim.h: Updated.
-
-	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
-	Updated.
-
-	* src/autofit/afglobal.h (AF_SCRIPT_DEFAULT): New macro.
-
-	* src/autofit/afmodule.h (AF_ModuleRec): New `default_script'
-	member.
-
-	* src/autofit/afmodule.c (af_property_set, af_property_get): Handle
-	`default-script' property.
-	(af_autofitter_init): Updated.
-
-2013-12-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[ftrfork] Fix the face order difference between POSIX and Carbon.
-
-	The fragmented resources in Suitcase and .dfont should be reordered
-	when `POST' resource for Type1 is being restored, but reordering of
-	sfnt resources induces the different face order.  Now the ordering
-	is restricted to `POST' resource only, to prevent the different
-	order issue (e.g. the face index in the fontconfig cache generated
-	with Carbon framework is incompatible with that by FreeType 2
-	without Carbon framework.)  Found by Khaled Hosny and Hin-Tak Leung.
-
-	http://lists.gnu.org/archive/html/freetype-devel/2013-02/msg00035.html
-	http://lists.gnu.org/archive/html/freetype-devel/2013-12/msg00027.html
-
-	* src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Add a switch
-	`sort_by_res_id' to control the fragmented resource ordering.
-	* include/internal/ftrfork.h: Declare new switch.
-	* src/base/ftobjs.c (IsMacResource): Enable the sorting for `POST'
-	resource, and disable the sorting for `sfnt' resource.
-
-2013-12-25  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #40997.
-
-	* src/bdf/bdfdrivr.c (BDF_Face_Init): Only use OR operator to
-	adjust face flags since FT_FACE_FLAG_EXTERNAL_STREAM might already
-	be set.
-	* src/cff/cffobjs.c (cff_face_init): Ditto.
-	* src/cid/cidobjs.c (cid_face_init): Ditto.
-	* src/pcf/pcfread.c (pcf_load_font): Ditto.
-	* src/pfr/pfrobjs.c (pfr_face_init): Ditto.
-	* src/type1/t1objs.c (T1_Face_Init): Ditto.
-	* src/type42/t42objs.c (T42_Face_Init): Ditto.
-	* src/winfonts/winfnt.c (FNT_Face_Init): Ditto.
-
-2013-12-21  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce `coverages'.
-
-	Coverages are the interface to the HarfBuzz library to acces
-	OpenType features for handling glyphs not addressable by the cmap.
-
-	Right now, compilation of HarfBuzz is only added to the development
-	build.  A solution for standard build mode will be delayed until
-	HarfBuzz gets split into two libraries to avoid mutual dependencies
-	between FreeType and HarfBuzz.
-
-	Note that this is only a first step in handling coverages, basically
-	providing the framework only.  Code for handling selected OpenType
-	features (this is, actually using the data in `afcover.h') will
-	follow.
-
-	* devel/ftoption.h, include/config/ftoption.h
-	(FT_CONFIG_OPTION_USE_HARFBUZZ): New macro.
-
-	* src/autofit/hbshim.c, src/autofit/hbshim.h, src/autofit/afcover.h:
-	New files.
-
-	* src/autofit/afscript.h: Add HarfBuzz script name tags.
-
-	* src/autofit/afstyles.h: Add default coverage enumeration values.
-
-	* src/autofit/aftypes.h: Update use of `SCRIPT' and `STYLE' macros.
-	(AF_Coverage): New enumeration (generated by `afcover.h').
-	(AF_StyleClassRec): New member `coverage'.
-	(AF_DEFINE_STYLE_CLASS): Updated.
-
-	* include/internal/fttrace.h: Add `afharfbuzz' for tracing coverage
-	data.
-
-	* src/autofit/afglobal.h: Update use of `SCRIPT' and `STYLE' macros.
-	(AF_SCRIPT_FALLBACK): Renamed to ...
-	(AF_STYLE_FALLBACK): ... this.
-
-	* src/autofit/afglobal.c: Include `hbshim.c'.
-	Update use of `SCRIPT' and `STYLE' macros.
-	(af_face_globals_compute_style_coverage)
-	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Call `af_get_coverage'.
-	Update.
-
-	* src/autofit/afmodule.h (AF_ModuleRec):
-	s/fallback_script/fallback_style/.
-
-	* src/autofit/afmodule.c (af_property_set): Adapt handling of
-	`fallback-script' property to set a fallback style.
-	(af_property_get, af_autofitter_init): Updated.
-
-	* src/autofit/afpic.c: Update use of `SCRIPT' and `STYLE' macros.
-
-	* src/autofit/afranges.h: Update use of `SCRIPT' macro.
-
-	* src/autofit/autofit.c [FT_CONFIG_OPTION_USE_HARFBUZZ]: Include
-	`hbshim.c'.
-
-	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `hbshim.c'.
-	(AUTOF_DRV_H): Add `afcover.h'.
-
-	* builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Use pkg-config for
-	all libraries needed by FreeType.
-
-2013-12-21  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #40975 (sort of).
-
-	* src/truetype/ttinterp.c (Ins_IP): Fix sign typo to make FreeType
-	behave the same as the Windows TrueType engine for the invalid case.
-
-2013-12-21  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Make PIC mode work actually.
-
-	* src/autofit/afpic.h (AFModulePIC): Fix array sizes to fit the
-	enumeration values automatically generated by including `afscript.h'
-	and friends.
-
-	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated.
-
-2013-12-21  Werner Lemberg  <wl@gnu.org>
-
-	Fix PIC linking.
-
-	* include/internal/ftrfork.h (CONST_FT_RFORK_RULE_ARRAY_BEGIN): Fix
-	generated function name.
-
-	* src/base/basepic.c (FT_Init_Table_raccess_guess_table): Rename
-	to ...
-	(FT_Init_Table_ft_raccess_guess_table): ... this so that the
-	function name correctly corresponds to what the macro framework
-	expects.
-
-	* src/psnames/rules.mk (PSNAMES_DRV_SRC_S): Use correct file name so
-	that PIC functions are compiled also.
-
-2013-12-21  Werner Lemberg  <wl@gnu.org>
-
-	[base] Add missing dependencies to Makefile.
-
-	* src/base/rules.mk (BASE_SRC): Add `basepic.c' and `ftpic.c'.
-	(BASE_H): Add `basepic.h'.
-
-2013-12-20  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix PIC compilation.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
-	src/autofit/aflatin.c (af_latin_metrics_init_widths)
-	[FT_CONFIG_OPTION_PIC]: Declare `globals'.
-
-	* src/autofit/afglobal.c: Always call AF_DEFINE_SCRIPT_CLASS, and
-	AF_DEFINE_STYLE_CLASS.
-
-	* src/autofit/afpic.c: Include `afglobal.h'.
-	(autofit_module_class_pic_init): Typo.
-
-	* src/autofit/aftypes.h (AF_DEFINE_SCRIPT_CLASS,
-	AF_DEFINE_STYLE_CLASS): Don't use the same identifier for macro
-	parameter and structure member.
-
-2013-12-20  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce `styles'.
-
-	This is the new top-level structure for handling glyph input data;
-	scripts are now defined separately.
-
-	* src/autofit/aftypes.h (SCRIPT): Updated.
-	(AF_ScriptClassRec): Move `blue_stringset' and `writing_system'
-	members to ...
-	(AF_Style_ClassRec): ... this new structure.
-	(AF_Style): New enumeration.
-	(AF_StyleMetricsRec): Replace `script' enumeration with
-	`style_class' pointer.
-	(AF_DEFINE_SCRIPT_CLASS, AF_DECLARE_SCRIPT_CLASS): Updated.
-	(AF_DEFINE_STYLE_CLASS, AF_DECLARE_STYLE_CLASS): New macros.
-
-	* src/autofit/afstyles.h: New file, using data from `afscript.h'.
-	* src/autofit/afscript.h: Updated.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
-	af_cjk_metrics_init_blues, af_cjk_hint_edges): Updated.
-
-	* src/autofit/afglobal.c (SCRIPT): Updated.
-	(STYLE): Redefine macro to load `afstyles.h'.
-	(af_script_names) [FT_DEBUG_LEVEL_TRACE]: Replace with...
-	(af_style_names): ... this array.
-	(af_face_globals_compute_script_coverage): Renamed to...
-	(af_face_globals_compute_style_coverage): ... this.
-	Updated.
-	(af_face_globals_new, af_face_globals_free,
-	af_face_globals_get_metrics): Updated.
-
-	* src/autofit/afglobal.h (SCRIPT): Updated.
-	(STYLE): Redefine macro to load `afstyles.h'.
-	(AF_SCRIPT_FALLBACK): Update definition.  This will get more
-	refinements with later on.
-	(AF_SCRIPT_UNASSIGNED): Replace with...
-	(AF_STYLE_UNASSIGNED): ... this macro.
-	(AF_FaceGlobalsRec): Updated.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
-	af_latin_metrics_init_blues, af_latin_metrics_scale_dim,
-	af_latin_hint_edges): Updated.
-
-	* src/autofit/aflatin2.c (af_latin2_metrics_init_widths): Updated.
-	(af_ltn2_uniranges): Removed.
-
-	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
-	Updated.
-
-	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated.
-	* src/autofit/afpic.h (AF_STYLE_CLASSES_GET): New macro.
-	(AFModulePIC): Add `af_style_classes' and `af_style_classes_rec'
-	members.
-
-	* src/autofit/afranges.h: Updated.
-
-	* src/autofit/rules.mk (AUTOF_DRV_H): Add `afstyles.h'.
-
-2013-12-19  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Factor scripts and uniranges out of writing system files.
-
-	* src/autofit/afranges.c, src/autofit/afranges.h: New files.
-
-	* src/autofit/afscript.h: Extend `SCRIPT' macro with more
-	parameters, taking data from the writing system files.
-
-	* src/autofit/aftypes.h: Updated.
-
-	* src/autofit/afglobal.c: Include `afranges.h'.
-	Load `afscript.h' to call AF_DEFINE_SCRIPT_CLASS.
-	* src/autofit/afglobal.c: Include `afranges.h'.
-	Load `afscript.h' to call AF_DECLARE_SCRIPT_CLASS.
-
-	* src/autofit/afcjk.c, src/autofit/afcjk.h: Updated.
-	* src/autofit/afdummy.c, src/autofit/afdummy.h: Updated.
-	* src/autofit/afindic.c, src/autofit/afindic.h: Updated.
-	* src/autofit/aflatin.c, src/autofit/aflatin.h: Updated.
-	* src/autofit/aflatn2.c, src/autofit/aflatn2.h: Updated.
-
-	* src/autofit/afpic.c: Updated.
-
-	* src/autofir/autofit.c: Include `afranges.c'.
-	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afranges.c'.
-
-2013-12-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] More code orthogonality.
-
-	* src/autofit/aftypes.h (AF_StyleMetrics): Replace `script_class'
-	pointer to an `AF_ScriptClass' structure with `script' index of type
-	`AF_Script'.
-	Move some code around.
-
-	* src/autofit/afcjk.c: Include `afpic.h'.
-	(af_cjk_metrics_init_widths, af_cjk_metrics_init_blues,
-	af_cjk_hint_edges): Updated.
-
-	* src/autofit/aflatin.c: Include `afpic.h'.
-	(af_latin_metrics_init_widths, af_latin_metrics_init_blues,
-	af_latin_metrics_scale_dim, af_latin_hint_edges): Updated.
-
-	* src/autofit/afglobal.c (af_face_globals_get_metrics): Updated.
-
-	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
-	Updated.
-
-2013-12-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/ScriptMetrics/StyleMetrics/.
-
-2013-12-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/script_{metrics,hints}/style_{metrics,hints}/
-
-2013-12-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/gscripts/gstyles/.
-
-2013-12-18  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/glyph_scripts/glyph_styles/.
-
-	This is the first commit of a series to create a new top-level
-	structure (a `style') for handling scripts, writing_systems, and
-	soon-to-be-added coverages.
-
-2013-12-17  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/AF_Script_/AF_WritingSystem_/ where appropriate.
-
-2013-12-11  Infinality  <infinality@infinality.net>
-
-	[truetype] Simplify logic of rendering modes.
-
-	This patch unifies the subpixel and non-subpixel cases.
-
-	* src/truetype/ttinterp.h (TT_ExecContextRec): Remove
-	`grayscale_hinting'; all code should refer to `grayscale' instead.
-	Remove unused `native_hinting' member.
-	Rename `subpixel_hinting' member to `subpixel.
-
-	* src/truetype/ttgload.c (TT_LOADER_SET_PP): Updated.
-	(tt_loader_init): Updated.
-
-	* src/truetype/ttinterp.c (Ins_GETINFO): Simplify.
-	Updated.
-
-2013-12-11  Werner Lemberg  <wl@gnu.org>
-
-	[documentation] Add section how to include FreeType header files.
-	Problem reported by David Kastrup <dak@gnu.org>.
-
-	Surprisingly, a description how to do that was completely missing in
-	the API reference.
-
-	* include/freetype.h, include/ftchapters.h: New documentation
-	section `header_inclusion'.
-
-2013-12-10  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/DFLT/NONE/, s/dflt/none/.
-
-2013-12-10  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/AF_SCRIPT_NONE/AF_SCRIPT_UNASSIGNED/.
-
-2013-12-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix scaling of vertical phantom points.
-
-	* src/truetype/ttgload.c (load_truetype_glyph): Scale pp3.x and
-	pp4.x also.
-
-2013-12-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix positioning of composite glyphs.
-	Problem reported by Nigel Tao <nigeltao@golang.org>.
-
-	* src/truetype/ttgload.c (TT_Hint_Glyph): Remove code that shifts
-	the glyph (component) by a fractional value computed from the LSB
-	phantom point.  This is wrong, since the horizontal phantom points
-	get rounded horizontally later on.
-
-2013-12-08  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.2 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-2'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.2.
-
-	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
-	builds/windows/vc2008/freetype.vcproj,
-	builds/windows/vc2008/index.html,
-	builds/windows/vc2010/freetype.vcxproj,
-	builds/windows/vc2010/index.html,
-	builds/windows/visualc/freetype.dsp,
-	builds/windows/visualc/freetype.vcproj,
-	builds/windows/visualc/index.html,
-	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj,
-	builds/windows/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.1/2.5.2/, s/251/252/.
-
-	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 2.
-
-	* builds/unix/configure.raw (version_info): Set to 17:1:11.
-	* CMakeLists.txt (VERSION_PATCH): Set to 2.
-	* docs/CHANGES: Updated.
-
-2013-12-07  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Next round in phantom point handling.
-
-	Greg Hitchcock provided very interesting insights into the
-	complicated history of the horizontal positions of the TSB and BSB
-	phantom points.
-
-	* src/truetype/ttgload.c (TT_LOADER_SET_PP)
-	[TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Use `subpixel_hinting' and
-	`grayscale_hinting' flags as conditionals for the x position of TSB
-	and BSB.
-
-2013-12-05  Werner Lemberg  <wl@gnu.org>
-
-	* builds/freetype.mk (FT_CC): Removed.  Unused.
-
-2013-12-04  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix handling of embedded bitmap strikes.
-
-	This corrects the commit from 2013-11-21.  Problem reported by
-	Andrey Panov <panov@canopus.iacp.dvo.ru>.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Fix logic to
-	detect excessive bytes for bit-aligned bitmaps.
-
-2013-12-03  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Remove dead code.
-
-	Reported by Nigel Tao <nigeltao@golang.org>.
-
-	* include/internal/tttypes.h (TT_LoaderRec): Remove unused
-	`preserve_pps' field.
-	* src/truetype/ttgload.c (TT_Hint_Glyph): Updated.
-
-2013-12-03  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix phantom point handling.
-
-	This is a further improvement to the changes from 2013-11-06.
-
-	* src/truetype/ttgload.c (TT_Hint_Glyph): Horizontal phantom points
-	are rounded horizontally, vertical ones are rounded vertically.
-	(TT_LOADER_SET_PP): The horizontal position of vertical phantom
-	points in pre-ClearType mode is zero, as shown in the OpenType
-	specification.
-
-2013-12-02  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix change from 2013-11-20.
-
-	Problem reported by Akira Kakuto <kakuto@fuk.kindai.ac.jp>.
-
-	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Protect call to
-	`Update_Max' with both a TT_USE_BYTECODE_INTERPRETER guard and a
-	`IS_HINTED' clause.
-	Also remove redundant check using `maxSizeOfInstructions' – in
-	simple glyphs, the bytecode data comes before the outline data, and
-	a validity test for this is already present.
-
-2013-11-27  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix use of dumping functions in `ftgrid' demo program.
-
-	* src/autofit/afhints.c (AF_DUMP) [FT_DEBUG_AUTOFIT]: New macro.
-	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
-	af_glyph_hints_dump_edges) [FT_DEBUG_AUTOFIT]: Add parameter to
-	handle output to stdout.
-	Use AF_DUMP.
-	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
-	af_glyph_hints_dump_edges) [!FT_DEBUG_AUTOFIT]: Removed.
-
-2013-11-25  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.1 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-1'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.1.
-
-	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-	builds/windows/vc2005/index.html,
-	builds/windows/vc2008/freetype.vcproj,
-	builds/windows/vc2008/index.html,
-	builds/windows/vc2010/freetype.vcxproj,
-	builds/windows/vc2010/index.html,
-	builds/windows/visualc/freetype.dsp,
-	builds/windows/visualc/freetype.vcproj,
-	builds/windows/visualc/index.html,
-	builds/windows/visualce/freetype.dsp,
-	builds/windows/visualce/freetype.vcproj,
-	builds/windows/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.5.0/2.5.1/, s/250/251/.
-
-	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
-
-	* builds/unix/configure.raw (version_info): Set to 17:0:11.
-	* CMakeLists.txt (VERSION_PATCH): Set to 1.
-	* docs/CHANGES, docs/release: Updated.
-
-2013-11-23  Werner Lemberg  <wl@gnu.org>
-
-	[truetype]: Add tricky font names `hkscsiic.ttf' and `iicore.ttf'.
-
-	* src/truetype/ttobjs.c (TRICK_NAMES_MAX_CHARACTERS,
-	TRICK_NAMES_COUNT): Updated.
-	(trick_names): Add family name for the two fonts.
-
-2013-11-23  Werner Lemberg  <wl@gnu.org>
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Typo.
-
-2013-11-21  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Typo.
-
-	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
-
-	* src/sfnt/sfobjs.c (sfnt_load_face): Return correct `bsize->width'
-	value if the font lacks an `OS/2' table.
-
-2013-11-21  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Improve handling of buggy embedded bitmap strikes.
-
-	We are now able to successfully load `AppleMyoungJo.ttf'.
-	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Don't trust glyph
-	format.
-
-2013-11-20  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Don't trust `maxp's `maxSizeOfInstructions'.
-
-	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>; see
-
-	  http://lists.nongnu.org/archive/html/freetype-devel/2013-08/msg00005.html
-
-	for details.
-
-	* src/base/ftobjs.c (FT_Load_Glyph): Check size of `fpgm' and `prep'
-	tables also for setting `autohint'.
-
-	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Use code from
-	`TT_Process_Composite_Glyph' for handling unreliable values of
-	`maxSizeOfInstructions'.
-
-2013-11-16  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix `OS/2' table version 5 support.
-
-	We now follow the `official' announcement from Microsoft (on the
-	OpenType mailing list, which unfortunately hasn't a public archive).
-
-	* include/freetype/tttables.h (TT_OS2):
-	s/usLowerPointSize/usLowerOpticalPointSize/,
-	s/usUpperPointSize/usUpperOpticalPointSize/.
-
-	* src/sfnt/ttload.c (tt_face_load_os2): Update, and set correct
-	default values.
-
-2013-11-13  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/ft2unix.h: Remove.  No longer necessary.
-
-	* builds/unix/install.mk (install): Updated.
-
-2013-11-13  Werner Lemberg  <wl@gnu.org>
-
-	Simplify header file hierarchy.
-
-	This large patch changes the header file directory layout from
-	`include/freetype/...' to `include/...', effectively removing one
-	level.  Since the file `ft2build.h' is also located in `include'
-	(and it stays there even after installation), all FreeType header
-	files are now in a single directory.
-
-	Applications that use (a) `freetype-config' or FreeType's
-	`pkg-config' file to get the include directory for the compiler, and
-	(b) the documented way for header inclusion like
-
-	  #include <ft2build.h>
-	  #include FT_FREETYPE_H
-	  ...
-
-	don't need any change to the source code.
-
-	* include/freetype/*: Move up to...
-	* include/*: ... this directory.
-
-	* builds/amiga/include/freetype/*: Move up to...
-	* builds/amiga/include/*: ... this directory.
-
-	*/*: Essentially do `s@/freetype/@/@' where appropriate.
-
-	* CMakeList.txt: Simplify.
-	* builds/unix/freetype-config.in, builds/unix/freetype2.in: For
-	`--cflags', return a single directory.
-	* builds/unix/install.mk (install): No longer try to remove `cache'
-	and `internal' subdirectories; instead, remove the `freetype'
-	subdirectory.
-
-2013-11-12  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix last `truetype' commit.
-
-	* src/truetype/ttgload.c (tt_get_metrics): Preserve stream position.
-	Return error value.
-	(load_truetype_glyph): Updated.
-
-2013-11-10  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CMAKE: New dummy file.
-
-2013-11-08  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Fix for hints that touch.
-
-	* src/cff/cf2hints.c (cf2_hintmap_insertHint): Fix condition for
-	finding index value of insertion point.
-
-2013-11-06  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix handling of phantom points in composite glyphs.
-	Problem reported by Nigel Tao <nigeltao@golang.org>.
-
-	This is a follow-up commit to the previous one.
-
-	* src/truetype/ttgload.c (load_truetype_glyph): Call
-	`tt_get_metrics' after loading the glyph header.
-
-2013-11-06  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Improve emulation of vertical metrics.
-
-	This commit also improves the start values of vertical phantom
-	points.  Kudos to Greg Hitchcock for help.
-
-	* src/truetype/ttgload.c (TT_Get_VMetrics): Add parameter to pass
-	`yMax' value.  Replace code with fixed Microsoft definition.
-	(tt_get_metrics): Updated.
-	(TT_LOADER_SET_PP): Add explanation how to initialize phantom
-	points, taken from both the OpenType specification and private
-	communication with Greg (which will eventually be added to the
-	standard).
-	Fix horizontal position of `pp3' and `pp4'.
-
-	* src/truetype/ttgload.h: Updated.
-
-	* src/truetype/ttdriver.c (tt_get_advances): Updated.
-
-	* docs/CHANGES: Updated.
-
-2013-11-05  Werner Lemberg  <wl@gnu.org>
-
-	* builds/windows/vc2010/freetype.vcxproj: s/v110/v100/.
-	PlatformToolSet version 110 is for VC2012.
-
-	Problem reported (with solution) by Dave Arnold <darnold@adobe.com>.
-
-2013-11-05  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Correctly reset point tags for glyph components.
-	Problem reported by Nigel Tao <nigeltao@golang.org>.
-
-	* src/truetype/ttgload.c (TT_Process_Composite_Glyph): Fix loop.
-
-2013-11-02  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Fix GETINFO opcode handling of subpixel hinting bits.
-
-	* src/truetype/ttinterp.c (Ins_GETINFO): Don't request bit 6 set to
-	get info on subpixel hinting.
-
-	* docs/CHANGES: Updated.
-
-2013-11-02  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #40451.
-
-	Simply apply the patch from the bug report.
-
-	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
-	include/freetype/config/ftconfig.h: The used #pragma directives only
-	work with gcc versions 4.6 and higher.
-
-2013-11-01  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CHANGES: Updated.
-
-2013-11-01  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Minor code refactoring.
-
-	Two benefits: The allocated FDEF (and IDEF) array gets slightly
-	smaller, and the `ttdebug' demo program has access to function
-	numbers without additional costs.
-
-	Fortunately, no changes to FontForge are necessary – this is the
-	only external TrueType debugger I know of, but others may exist and
-	should check the code accordingly.
-
-	* src/truetype/ttinterp.h (TT_CallRec): Replace `Cur_Restart' and
-	`Cur_End' with a pointer to the corresponding `TT_DefRecord'
-	structure.
-
-	* src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF, Ins_ENDF,
-	Ins_CALL, Ins_LOOPCALL, Ins_UNKNOWN, TT_RunIns <Invalid_Opcode>):
-	Updated.
-
-2013-10-27  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Implement support for `OS/2' table version 5.
-
-	See
-
-	  http://typedrawers.com/discussion/470/new-microsoft-size-specific-design-selection-mechanism
-
-	for the announcement.
-
-	* include/freetype/tttables.h (TT_OS2): Add fields
-	`usLowerPointSize' and `usUpperPointSize'.  Since FreeType returns
-	this structure only as a pointer through `FT_Get_Sfnt_Table', there
-	shouldn't be any ABI problems.
-
-	* src/sfnt/ttload.c (tt_face_load_os2): Implement it.
-
-	* docs/CHANGES: Updated.
-
-2013-10-24  Werner Lemberg  <wl@gnu.org>
-
-	* README.git, docs/CHANGES, docs/INSTALL: Updated.
-
-2013-10-24  John Cary  <cary@txcorp.com>
-
-	Provide cmake support.
-
-	* CMakeLists.txt: New file.
-
-2013-10-23  Kenneth Miller  <kennethadammiller@yahoo.com>
-	    Werner Lemberg  <wl@gnu.org>
-
-	Provide support for x64 builds in Visual C++ project files.
-
-	* src/builds/win32: Renamed to...
-	* src/builds/windows: This.
-
-	* src/builds/windows/vc2010/*: Updated to handle x64 target.
-
-	* src/builds/windows/*.mk, docs/INSTALL.GNU: s/win32/windows/ where
-	appropriate.
-
-2013-10-22  Werner Lemberg  <wl@gnu.org>
-
-	* src/base/md5.c, src/base/md5.h: Updated to recent version.
-
-	* src/base/ftobjs.c: Updated; `md5.c' no longer uses `free'.
-
-	The canonical URL to get updates for this file is
-
-	  http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/popa3d/popa3d/md5/
-
-	as the author told me in private communication.
-
-2013-10-19  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] s/SMALL_TOP/X_HEIGHT/.
-
-	* src/autofit/afblue.dat: Updated.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/aflatin.c, src/autofit/aflatin.h,
-	src/autofit/atlatin2.c: Updated.
-
-2013-10-19  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/afblue.dat: s/MINOR/DESCENDER/.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-2013-10-16  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add description strings to script entries.
-
-	Currently, this is unused.
-
-	* src/autofit/afscript.h: Do it.
-	* src/autofit/afglobal.c, src/autofit/afpic.c,
-	src/autofit/aftypes.h: Updated.
-
-2013-10-16  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve tracing message for extra light flag.
-
-	* src/autofit/aflatin.c (af_latin_metrics_scale_dim): Do it.
-
-2013-10-15  Chongyu Zhu  <lembacon@gmail.com>
-
-	[arm] Fix thumb2 inline assembly under LLVM.
-
-	When using `ADD' with an immediate operand, the instruction is
-	actually `ADD Rd, Rn, #<imm12>', that is, the maximum of the
-	immediate operand cannot exceed 4095.  It will fail to compile with
-	LLVM.
-
-	However, in GCC, due to some legacy compatibility considerations,
-	`ADD.W' will be automatically emitted when the immediate operand is
-	larger than 4095.
-
-	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
-	(FT_MulFix_arm) [__GNUC__]: Support clang compiler.
-
-	* src/truetype/ttinterp.c (TT_MulFix14_arm) [__GNUC__]: Ditto.
-
-2013-10-12  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve tracing of `latin' hinter.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Report blue
-	zone types.
-	(af_latin_metrics_scale_dim): Report scaling changes due to x height
-	alignment.
-	Report scaled stroke width and blue zone values.
-
-2013-10-03  Dave Arnold  <darnold@adobe.com>
-
-	* src/cff/cf2font.c (cf2_computeDarkening): Avoid division by zero.
-
-	Note that the old code avoided using a region of the piecewise
-	linear function where the slope was zero.  The recovery was to use a
-	different section of the function, which produced a different,
-	incorrect amount of darkening.
-
-2013-10-02  Darrell Bellert  <darrell.bellert@hl.konicaminolta.us>
-
-	* src/sfnt/ttload.c (tt_face_load_pclt): Fix `pclt_fields'.
-
-2013-10-02  Dave Arnold  <darnold@adobe.com>
-
-	* src/cff/cf2font.c (cf2_computeDarkening): Initialize darkenAmount.
-
-	This line was lost in commit 89ca1fd6 (from 2013-06-25).  The effect
-	is to use a previous darkening amount when producing an unhinted,
-	unscaled outline.  This can cause autohint samples in ftgrid and
-	ftview to be based on darkened CFF outlines instead of unhinted,
-	undarkened ones.
-
-2013-09-29  Dave Arnold  <darnold@adobe.com>
-
-	Fix Savannah bug #39295.
-
-	The bug was caused by switching to the initial hintmap (the one in
-	effect when `moveto' executes) just before drawing the final element
-	in the charstring.  This ensured that the path was closed (in both
-	Character Space and Device Space).  But if the final element was a
-	curve and if the final hintmap was different enough from the initial
-	one, then the curve was visibly distorted.
-
-	The first part of the fix is to draw the final curve using the final
-	hintmap as specified by the charstring.  This corrects the
-	distortion but does not ensure closing in Device Space.  It may
-	require the rasterizer to automatically generate an extra closing
-	line.  Depending on the hintmap differences, this line could be from
-	zero to a couple pixels in length.
-
-	The second part of the fix covers the case where the charstring
-	subpath is closed with an explicit line.  We now modify that line's
-	end point to avoid the distortion.
-
-	Some glyphs in the bug report font (TexGyreHeros-Regular) that show
-	the change are:
-
-	  25ppem    S (98)
-	  24ppem    eight (52)
-	  25.5ppem  p (85)
-
-	Curves at the *end* of a subpath are no longer distorted.  However,
-	some of these glyphs have bad hint substitutions in the middle of a
-	subpath, and these are not affected.
-
-	The patch has been tested with a set of 106 fonts that shipped with
-	Adobe Creative Suite 4, together with 756 Open Source CFF fonts from
-	Google Fonts.  There are 1.5 million glyphs, of which some 20k are
-	changed with the fix.  A sampling of a few hundred of these changes
-	have been examined more closely, and the changes look good (or at
-	least acceptable).
-
-	* src/cff/cf2hints.h (CF2_GlyphPathRec): New element `pathIsClosing'
-	to indicate that we synthesize a closepath line.
-
-	* src/cff/cf2hints.c (cf2_glyphpath_init): Updated.
-	(cf2_glyphpath_pushPrevElem): If closing, use first hint map (for
-	`lineto' operator) and adjust hint zone.
-	For synthesized closing lines, use end point in first hint zone.
-	(cf2_glyphpath_lineTo): Take care of synthesized closing lines.  In
-	particular, shift the detection of zero-length lines from character
-	space to device space.
-	(cf2_glyphpath_closeOpenPath): Remove assertion.
-	Updated.
-
-2013-09-25  Werner Lemberg  <wl@gnu.org>
-
-	* src/autofit/aflatin.c (af_{grek,cyrl}_uniranges): Fix arrays.
-
-2013-09-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[bdf, pcf] Refuse non-zero face_index.
-
-	Suggested by Akira Tagoh, see
-
-	  http://lists.gnu.org/archive/html/freetype/2013-09/msg00030.html
-
-	* src/bdf/bdfdrivr.c (BDF_Face_Init): Return `Invalid_Argument'
-	error if the font could be opened but non-zero `face_index' is
-	given.
-	* src/pcf/pcfdrivr.c (PCF_Face_Init): Ditto.
-
-	* src/type42/t42objs.c (T42_Face_Init): Remove unrequired FT_UNUSED
-	macro for `face_index' because it is validated later.
-
-2013-09-23  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #40090.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_scale): Revert commit
-	306f8c5d (from 2013-08-25) affecting this function.
-
-2013-09-22  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Disunify Cyrillic and Greek handling from Latin.
-
-	* src/autofit/afscript.h: Add Cyrillic and Greek.
-
-	* src/autofit/afblue.dat (AF_BLUE_STRINGSET_GREK,
-	AF_BLUE_STRINGSET_CYRL): Add blue zones for Greek and Cyrillic.
-	(AF_BLUE_STRINGSET_LATN): Fix typo.
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/aflatin.c (af_grek_uniranges, af_cyrl_uniranges): New
-	arrays.
-	(af_grek_script_class, af_cyrl_script_class): New scripts.
-	* src/autofit/aflatin.h: Updated.
-
-2013-09-20  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CHANGES: Updated.
-
-2013-09-20  Behdad Esfahbod  <behdad@behdad.org>
-
-	Fix vertical size of emboldened glyphs.
-
-	Cf. https://bugzilla.gnome.org/show_bug.cgi?id=686709
-
-	* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Adjust `horiBearingY'
-	also.
-
-2013-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	* include/freetype/ftoutln.h: Correct FT_Outline_Get_Orientation
-	algorithm description.
-
-2013-09-11  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve Hebrew rendering.
-
-	This change introduces a new blue zone property
-	`AF_BLUE_PROPERTY_LATIN_LONG' to make the auto-hinter ignore short
-	top segments.
-
-	* src/autofit/afblue.dat: Fix Hebrew blue strings.
-	Use AF_BLUE_PROPERTY_LATIN_LONG for AF_BLUE_STRING_HEBREW_TOP.
-
-	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_LONG): New macro.
-
-	* src/autofit/afblue.c, src/autofit/afblue.h: Updated.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Handle
-	`AF_LATIN_IS_LONG_BLUE'.
-
-	* src/autofit/aflatin.h (AF_LATIN_IS_LONG_BLUE): New macro.
-
-2013-08-28  Behdad Esfahbod  <behdad@google.com>
-
-	[sfnt] Fix frame access while reading WOFF table directory.
-
-	* src/sfnt/sfobjs.c (woff_open_font): Using single memory frame
-	while reading the directory entries for the whole loop.
-
-2013-08-29  Werner Lemberg  <wl@gnu.org>
-            Behdad Esfahbod  <behdad@google.com>
-
-	Implement support for WOFF containers.
-
-	We simply synthesize a SFNT from the WOFF, create a memory stream
-	for the new data, and load the SFNT as usual.
-
-	Does NOT add any API to access WOFF metadata or private blocks.
-
-	* include/freetype/internal/tttypes.h (WOFF_HeaderRec,
-	WOFF_TableRec): New structures.
-
-	* include/freetype/tttags.h (TTAG_wOFF): New macro.
-
-	* src/base/ftobjs.c (FT_Open_Face): Set `stream' after calling
-	`open_face'.
-
-	* src/sfnt/sfobjs.c [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Include
-	`FT_GZIP_H'.
-	(WRITE_BYTE, WRITE_USHORT, WRITE_ULONG): New temporary macros for
-	writing to a stream.
-	(sfnt_stream_close, compare_offsets, woff_open_font): New functions.
-	(sfnt_open_font): Handle `TTAG_wOFF'.
-	(sfnt_init_face): Set `stream' after calling `sfnt_open_font'.
-
-	* src/truetype/ttobjs.c (tt_face_init): Set `stream' after calling
-	`sfnt->init_face'.
-
-	* src/base/ftobjs.c (open_face): Use a pointer to FT_Stream as an
-	argument so that a changed stream survives.
-	Update callers.
-
-2013-08-28  Werner Lemberg  <wl@gnu.org>
-
-	[gzip] New function `FT_Gzip_Uncompress'.
-
-	This is modeled after zlib's `uncompress' function.  We need this
-	for WOFF support.
-
-	* include/freetype/ftgzip.h, src/gzip/ftgzip.c (FT_Gzip_Uncompress):
-	New function.
-
-	* src/gzip/rules.mk: Rewrite to better reflect dependencies.
-
-2013-08-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix `make multi' compilation.
-
-	* src/autofit/afblue.cin, src/autofit/afblue.c: Don't include
-	`afblue.h' but `aftypes.h'.
-	* src/autofit/afcjk.c: Don't include `aftypes.h' but `afglobal.h'.
-
-2013-08-28  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix C++ compilation.
-
-	* src/autofit/afglobal.c (af_face_globals_get_metrics),
-	src/autofit/afdummy.c (af_dflt_script_class), src/autofit/afindic.c
-	(af_deva_script_class): Use proper casts.
-
-2013-08-27  Behdad Esfahbod  <behdad@google.com>
-
-	* src/sfnt/ttload.c (tt_face_load_font_dir): Fix sign typos.
-
-2013-08-27  Behdad Esfahbod  <behdad@google.com>
-
-	FT_Open_Face: Improve external stream handling.
-
-	If the font's `clazz->init_face' function wants to swap to new
-	stream, handling of whether original stream was external could
-	result to either memory leak or double free.  Mark externality into
-	face flags before calling `init_face' such that the clazz can handle
-	external streams properly.
-
-	* src/base/ftobjs.c (FT_Open_Face): Move code to set
-	FT_FACE_FLAG_EXTERNAL_STREAM to...
-	(open_face): This function.
-
-2013-08-27  Werner Lemberg  <wl@gnu.org>
-
-	Remove `FT_SqrtFixed' function.
-
-	It's no longer used.
-
-	* include/freetype/internal/ftcalc.h, src/base/ftcalc.c: Do it.
-
-2013-08-27  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] While tracing, report script names instead of ID values.
-
-	* src/autofit/afglobal.c (af_script_names) [FT_DEBUG_LEVEL_TRACE]:
-	New array.
-	* src/autofit/afglobal.h: Updated.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
-	af_cjk_hint_edges): Use `af_script_names'.
-	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
-	af_latin_hint_edges): Ditto.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Report used script while hinting a glyph.
-
-	* src/autofit/afcjk.c (af_cjk_hint_edges), src/autofit/aflatin.c
-	(af_latin_hint_edges): Implement it.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add support for Hebrew script.
-
-	* src/autofit/afblue.dat: Add blue strings for Hebrew.
-	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
-
-	* src/autofit/aflatin.c (af_hebr_uniranges): New array.
-	(af_hebr_script_class): New script.
-	* src/autofit/aflatin.h, src/autofit/afscript.h: Updated.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve tracing messages.
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths): Mention script
-	ID in tracing message.
-	(af_cjk_metrics_init_blues): Initialize `axis' outside of the inner
-	loop.
-	Improve tracing messages.
-	(af_cjk_hint_edges) [FT_DEBUG_LEVEL_TRACE]: New variable
-	`num_actions' to count hinting actions.
-	Improve tracing messages.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_widths): Mention
-	script ID in tracing message.
-	(af_latin_metrics_init_blues, af_latin_hint_edges): Improve tracing
-	messages.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	Better tracing of loaded glyphs.
-
-	Previously, the loading of a glyph was traced at level 4, if at all.
-	With this change, all font loading routines emit a tracing message
-	at level 1, making it easier to select tracing output (for example
-	using F2_DEBUG="any:1 afhints:7 aflatin:7").
-
-	* src/bdf/bdfdrivr.c (BDF_Glyph_Load): Add tracing message.
-	* src/cff/cffdrivr.c (cff_glyph_load): Ditto.
-	* src/cff/cffgload.c (cff_decoder_prepare): Improve tracing
-	messages.
-	* src/cid/cidgload.c (cid_load_glyph): Use level 1 for tracing
-	message.
-	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Ditto.
-	* src/pfr/pfrobjs.c (pfr_slot_load): Add tracing message.
-	* src/truetype/ttgload.c (TT_Load_Glyph): Ditto.
-	* src/type1/t1gload.c (T1_Load_Glyph): Ditto.
-	* src/type42/t42objs.c (T42_GlyphSlot_Load): Ditto.
-	* src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix script selection.
-
-	* src/autofit/afglobal.c (af_face_globals_get_metrics): Use
-	`AF_SCRIPT_DFLT', not value 0.
-	Simplify code.
-
-	* src/autofit/afscript.h: Sort by script name.
-
-2013-08-26  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Make `dummy' hinter work as expected.
-
-	* src/autofit/afdummy.c (af_dummy_hints_init): Properly set scaling
-	information.
-	(af_dummy_hints_apply): Scale the glyphs.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Make `cjk' module use blue stringsets.
-
-	* src/autofit/afcjk.c (AF_CJK_MAX_TEST_CHARACTERS): Removed.
-	(af_cjk_hani_blue_chars): Removed.
-	(AF_CJK_BLUE_TYPE_*): Removed.
-	(af_cjk_metrics_init_blues): Replace AF_CJK_MAX_TEST_CHARACTERS with
-	AF_BLUE_STRING_MAX_LEN.
-	Change loops to use offsets (in file `afblue.h') into the new arrays
-	`af_blue_stringsets' and `af_blue_strings' (in file `afblue.c').
-	Instead of three dimensions (as used in the old blue string array)
-	we now use properties to do the same, saving one loop nesting level.
-
-	* src/autofit/afcjk.h: Remove old enumeration values superseded by
-	the new data in `afblue.h'.
-	(AF_CJK_IS_TOP_BLUE, AF_CJK_IS_HORIZ_BLUE, AF_CJK_IS_FILLED_BLUE,
-	AF_CJK_IS_RIGHT_BLUE): New macros, to be used in
-	`af_cjk_metrics_init_blues'.
-	(AF_CJK_BLUE_IS_RIGHT): Remove this now redundant enum value.
-	(AF_CJK_BLUE_IS_TOP): Renamed to...
-	(AF_CJK_BLUE_TOP): This.
-	(AF_CJK_MAX_BLUES): Remove.
-	(AF_CJKAxisRec): Updated.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Typo.
-
-	* src/autofit/afblue.hin, src/autofit/afblue.c (GET_UTF8_CHAR): Use
-	cast.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Synchronize `cjk' with `latin' module (and vice versa).
-
-	* src/autofit/afcjk.c (af_cjk_metrics_init_widths): Add tracing
-	messages.
-	(af_cjk_metrics_init_blues): Don't pass blue string array as
-	argument but use the global array directly.
-	Use `outline' directly.
-	Update and add tracing messages.
-	(af_cjk_metrics_init): Simplify code.
-	(af_cjk_metrics_scale_dim): Improve tracing message.
-	(af_cjk_metrics_scale): Synchronize.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
-	af_latin_metrics_init_blues): Improve and add tracing messages.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Make `latin' module use blue stringsets.
-
-	* src/autofit/aflatin.c (AF_LATIN_MAX_TEST_CHARACTERS): Removed.
-	(af_latin_blue_chars): Removed.
-	(af_latin_metrics_init_blues): Replace AF_LATIN_MAX_TEST_CHARACTERS
-	with AF_BLUE_STRING_MAX_LEN.
-	Change loops to use offsets (in file `afblue.h') into the new arrays
-	`af_blue_stringsets' and `af_blue_strings' (in file `afblue.c').
-	Use `AF_LATIN_IS_SMALL_TOP_BLUE' macro.
-
-	* src/autofit/aflatin.h: Remove old enumeration values superseded by
-	the new data in `afblue.h'.
-	(AF_LATIN_IS_TOP_BLUE): Updated definition.
-	(AF_LATIN_IS_SMALL_TOP_BLUE): New macro.
-	(AF_LATIN_MAX_BLUES): Remove.
-	(AF_LatinAxisRec): Updated.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Add blue stringsets.
-
-	* src/autofit/aftypes.h: Include `afblue.h'.
-	(AF_ScriptClassRec): Add `blue_stringset' field.
-	(AF_DEFINE_SCRIPT_CLASS): Updated.
-
-	* src/autofit/autofit.c: Include `afblue.c'.
-
-	* src/autofit/afcjk.c (af_hani_script_class), src/autofit/afdummy.c
-	(af_dflt_script_class), src/autofit/afindic.c
-	(af_deva_script_class), src/autofit/aflatin.c
-	(af_latn_script_class), src/autofit/aflatin2.c
-	(af_ltn2_script_class): Updated.
-
-	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afblue.c'.
-
-2013-08-25  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce data file for blue strings.
-
-	The idea is to have a central file which gets processed by a Perl
-	script to create proper `.c' and `.h' files using templates.  There
-	are two other reasons to do that:
-
-	  . The data file should be easily readable.  We use UTF-8 encoding
-	    which then gets converted to single bytes.
-
-	  . Since the number of supported scripts will increase soon, the
-	    current usage of blue string arrays is a waste of space.  Using
-	    the Perl script it is possible to imitate jagged arrays,
-	    defining enumeration constants as offsets into the arrays.
-
-	This commit only adds files without changing any functionality.
-
-	* src/autofit/afblue.dat: New data file.
-	* src/tools/afblue.pl: New Perl script for processing `afblue.dat'.
-
-	* src/autofit/afblue.cin, src/autofit/afblue.hin: New template files
-	for...
-	* src/autofit/afblue.c, src/autofit/afblue.c: New source files.
-	To avoid a dependency on Perl, we add them too.
-
-2013-08-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Enable new algorithm for `BBox_Cubic_Check'.
-
-	* src/base/ftbbox.c: Enable new BBox_Cubic_Check algorithm, remove
-	the old one.
-	Improve comments.
-
-2013-08-18  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/unix-def.in (freetype2.pc): Don't set executable bit.
-
-2013-08-18  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #39804.
-
-	* builds/unix/configure.raw (LIBPNG): Define and export.
-	* builds/unix/freetype-config.in, builds/unix/freetype2.in: Handle
-	libpng.
-
-2013-08-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Clean up BBox_Conic_Check.
-
-	* src/base/ftbbox.c (BBox_Conic_Check): Remove redundant checks for
-	extremum at the segment ends, which are already within the bbox.
-	Slightly modify calculations.
-
-2013-08-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Finish experimental (disabled) BBox_Cubic_Check implementation.
-
-	* src/base/ftbbox.c (BBox_Cubic_Check): Scale arguments to improve
-	accuracy and avoid overflows.
-
-2013-08-13  Alexei Podtelezhnikov  <apodtele@gmail.com>
-
-	[base] Refactor experimental (disabled) BBox_Cubic_Check.
-
-	* src/base/ftbbox.c (BBox_Cubic_Check): Implement the minimum search
-	as the mirror image of the maximum search implemented here...
-	(update_max): New function.
-
-2013-08-06  John Tytgat  <John.Tytgat@esko.com>
-
-	Fix Savannah bug #39702.
-
-	* src/cff/cffload.c (cff_index_get_pointers): Check for `cur_offset
-	!= 0'; this stronger test is mandated by the CFF specification.
-	Fix test for INDEX structures which have one or more empty entries
-	at the end.
-
-2013-08-05  Werner Lemberg  <wl@gnu.org>
-
-	Fix gcc pragmas, part 2.
-
-	* src/truetype/ttinterp.c (TT_MulFix14_long_long,
-	TT_DotFix14_long_long): `#pragma gcc diagnostic {push,pop}' has been
-	introduced with gcc version 4.6.
-
-2013-08-05  Werner Lemberg  <wl@gnu.org>
-
-	Fix gcc pragmas.
-
-	* src/truetype/ttinterp.c (TT_MulFix14_long_long,
-	TT_DotFix14_long_long): Older gcc versions don't accept diagnostic
-	pragmas within a function body.
-
-2013-08-05  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #39700.
-
-	* builds/unix/ftconfig.h: Synchronize with
-	`include/freetype/config/ftconfig.h'.
-
-	* builds/vms/ftconfig.h: Ditto.
-	Make the differences to the master `ftconfig.h' file as small as
-	possible for easier maintainance.
-
-2013-08-05  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Improve handling of `near' points.
-
-	Points which are very near to each other are now marked as such.
-	The `weak' flag is then computed by using the `in' vector of the
-	first and the `out' vector of the last point of a group of near
-	points.
-
-	For example, this fixes the rendering of glyph `Oslash' in
-	`Roboto-Thin.ttf'.
-
-	* src/autofit/afhints.h (AF_Flags): New value `AF_FLAGS_NEAR'.
-
-	* src/autofit/afhints.c (af_glyph_hints_reload): Introduce
-	the heuristic value `near_limit' to decide whether the current point
-	is near to the previous one, then set `AF_FLAG_NEAR' accordingly.
-	Store good `in' vector (of last non-near point) in
-	`last_good_in_{x,y}' and use it as an argument to
-	`ft_corner_is_flat' if necessary.
-
-2013-08-02  Werner Lemberg  <wl@gnu.org>
-
-	* include/freetype/ftcffdrv.h: Improve documentation.
-	This is based on blog entries from David Lemon and Dave Arnold (both
-	from Adobe) with kind permission.  Dave also helped in
-	proof-reading.
-
-2013-08-02  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Move declaration of scripts into separate file.
-
-	This has the benefit that we don't need to duplicate the data at
-	different places.
-
-	* src/autofit/afscript.h: New file.
-
-	* src/autofit/aftypes.h (AF_Script): Include `afscript.h' to define
-	the enumeration values.
-
-	* src/autofit/afglobal.c: Include `afscript.h' to get the script
-	specific header files.
-	(af_script_classes): Include `afscript.h' to fill this array.
-
-	* src/autofit/afpic.c: Include `afscript.h' to get the script
-	specific header files.
-	(autofit_module_class_pic_init): Include `afscript.h' for
-	initialization.
-	* src/autofit/afpic.h (AF_SCRIPT_CLASSES_COUNT,
-	AF_SCRIPT_CLASSES_REC_COUNT): Removed.  Use `AF_SCRIPT_MAX' instead.
-
-	* src/autofit/rules.mk (AUTOF_DRV_H): Updated.
-
-2013-08-02  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Move declaration of writing systems into separate file.
-
-	This has the benefit that we don't need to duplicate the data at
-	different places.
-
-	* src/autofit/afwrtsys.h: New file.
-
-	* src/autofit/aftypes.h (AF_WritingSystem): Include `afwrtsys.h' to
-	define the enumeration values.
-
-	* src/autofit/afglobal.c: Include `afwrtsys.h' to get the writing
-	system specific header files.
-	Include `afpic.h'.
-	(af_writing_system_classes): Include `afwrtsys.h' to fill this
-	array.
-
-	* src/autofit/afpic.c: Include `afwrtsys.h' to get the writing
-	system specific header files.
-	(autofit_module_class_pic_init): Include `afwrtsys.h' for
-	initialization.
-	* src/autofit/afpic.h (AF_WRITING_SYSTEM_CLASSES_COUNT,
-	AF_WRITING_SYSTEM_CLASSES_REC_COUNT): Removed.  Use
-	`AF_WRITING_SYSTEM_MAX' instead.
-
-2013-08-02  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Fix compilation with g++.
-
-	* src/sfnt/pngshim.c (error_callback, read_data_from_FT_stream): Use
-	cast.
-	(Load_SBit_Png): Pacify compiler.
-
-2013-08-02  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-            Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix `make multi'.
-
-	* include/freetype/config/ftconfig.h (FT_LOCAL_ARRAY,
-	FT_LOCAL_ARRAY_DEF): New macros.
-
-	* src/autofit/afglobal.c (af_writing_system_classes,
-	af_script_classes): Use FT_LOCAL_ARRAY_DEF.
-	* src/autofit/afglobal.h: Declare `af_writing_system_classes' and
-	`af_script_classes'.
-	* src/autofit/afloader.c: Include `afpic.h'.
-
-2013-08-01  Werner Lemberg  <wl@gnu.org>
-
-	Another round of cppcheck nitpicks.
-
-	The call was (from the top-level of the FreeType tree):
-
-	  cppcheck --force \
-	           --enable=all \
-	           -I /usr/include \
-	           -I /usr/local/include \
-	           -I /usr/lib/gcc/i586-suse-linux/4.7/include \
-	           -I include \
-	           -I include/freetype \
-	           -I include/freetype/config \
-	           -I include/freetype/internal \
-	           -DFT2_BUILD_LIBRARY \
-	           . &> cppcheck.log
-
-	using cppcheck git commit f7e93f99.
-
-	Note that cppcheck still can't handle `#include FOO' (with `FOO' a
-	macro).
-
-	*/* Improve variable scopes.
-	*/* Remove redundant initializations which get overwritten.
-
-	* src/gxvalid/*: Comment out redundant code or guard it with
-	FT_DEBUG_LEVEL_TRACE.
-
-2013-07-30  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Introduce `writing systems'.
-
-	This patch adds a new top level to the auto-hinter's script class
-	hierarchy.  It defines `writing systems' which can contain multiple
-	scripts.
-
-	For example, the `latin' writing system (in file `aflatin.c') is
-	able to support scripts like Latin, Cyrillic, Armenian, etc., which
-	can be handled similarly.
-
-	Scripts are now named using four-letter OpenType tags.
-
-	* src/autofit/aftypes.h (AF_ScriptClassRec): Move relevant members
-	to...
-	(AF_WritingSystemClassRec): This new structure.  It holds pointers
-	to functions which can be shared among related scripts.
-	(AF_WritingSystem): New enumeration.
-	(AF_Script): Revised values using four-letter tags.
-	(AF_DEFINE_WRITING_SYSTEM_CLASS): New macro.
-	(AF_DEFINE_SCRIPT_CLASS): Updated.
-
-	* src/autofit/afglobal.c (af_writing_system_classes): New global,
-	constant array.
-	(af_script_classes): Updated.
-	(af_face_globals_free): Updated.
-	Remove assertion.
-	(af_face_globals_get_metrics): Updated.
-
-	* src/autofit/afglobal.h (AF_SCRIPT_FALLBACK)
-	[!AF_CONFIG_OPTION_CJK]: Handle this case.
-
-	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
-	Updated.
-
-	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated;
-	initialize structures for both writing systems and scripts.
-	* src/autofit/afpic.h: Updated.
-	(AF_WRITING_SYSTEM_CLASSES_GET): New macro.
-
-	* src/autofit/afcjk.c (af_cjk_writing_system_class): New writing
-	system.
-	(af_cjk_uniranges): Renamed to...
-	(af_hani_uniranges): This.
-	(af_cjk_script_class): Reduced and renamed to...
-	(af_hani_script_class): This.
-	* src/autofit/afcjk.h: Updated.
-
-	* src/autofit/afdummy.c (af_dummy_writing_system_class): New writing
-	system.
-	(af_dummy_script_class): Reduced and renamed to...
-	(af_dflt_script_class): This.
-	* src/autofit/afdummy.h: Updated.
-
-	* src/autofit/afindic.c (af_indic_writing_system_class): New writing
-	system.
-	(af_indic_uniranges): Renamed to...
-	(af_deva_uniranges): This.
-	(af_indic_script_class): Reduced and renamed to...
-	(af_deva_script_class): This.
-	* src/autofit/afcjk.h: Updated.
-
-	* src/autofit/aflatin.c (af_latin_writing_system_class): New writing
-	system.
-	(af_latin_uniranges): Renamed to...
-	(af_latn_uniranges): This.
-	(af_latin_script_class): Reduced and renamed to...
-	(af_latn_script_class): This.
-	* src/autofit/aflatin.h: Updated.
-
-	* src/autofit/aflatin2.c (af_latin2_writing_system_class): New
-	writing system.
-	(af_latin2_uniranges): Renamed to...
-	(af_ltn2_uniranges): This.
-	Synchronize ranges with `latin'.
-	(af_latin2_script_class): Reduced and renamed to...
-	(af_ltn2_script_class): This.
-	* src/autofit/aflatin2.h: Updated.
-
-2013-07-30  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Variable renaming.
-
-	* src/autofit/aftypes.h (AF_ScriptMetricsRec):
-	s/clazz/script_class/.
-	Update all users.
-
-2013-07-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	Ignore libpng-config under cross-building configuration,
-	because it will return the flags for the hosting environment.
-
-	* builds/unix/configure.raw: Ignore libpng-config when
-	`cross_compiling' == yes.
-
-2013-07-30  Behdad Esfahbod  <behdad@google.com>
-
-	Prevent division by zero by a transparent color.
-
-	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra):
-	Return 0 immediately, when alpha channel is zero.
-
-2013-07-25  Behdad Esfahbod  <behdad@google.com>
-
-	Add FT_FACE_FLAG_COLOR and FT_HAS_COLOR.
-
-	Also disambiguate Google's color bitmap tables.
-
-	* include/freetype/freetype.h (FT_FACE_FLAG_COLOR, FT_HAS_COLOR):
-	New macros.
-
-	* include/freetype/internal/tttypes.h (TT_SbitTableType): Add
-	TT_SBIT_TABLE_TYPE_CBLC.
-
-	* src/sfnt/sfobjs.c (sfnt_load_face): Handle FT_FACE_FLAG_COLOR.
-
-	* src/sfnt/ttsbit.c (tt_face_load_sbit,
-	tt_face_load_strike_metrics, tt_face_load_sbit_image): Handle
-	TT_SBIT_TABLE_TYPE_CBLC.
-
-2013-07-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
-
-	[sfnt] Fix for `make multi' target.
-
-	* src/sfnt/pngshim.c (Load_SBit_Png): Use FT_LOCAL_DEF().
-
-2013-07-20  Werner Lemberg  <wl@gnu.org>
-
-	* docs/INSTALL.GNU: Updated.
-
-2013-07-20  Behdad Esfahbod  <behdad@google.com>
-
-	[sfnt] Fix `sbix' table version handling.
-
-	* src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]:
-	USHORT version numbers are to be considered as `minor'.
-
-2013-07-19  Werner Lemberg  <wl@gnu.org>
-
-	[autofit] Fix segment classification for blue zones.
-
-	The old code (essentially unchanged since the very beginning)
-	incorrectly handled this configuration
-
-	               x -o- x
-	                /   \
-	               /     \
-	              /       \
-	             o         o
-
-	as flat and this
-
-	                o               o
-	               /               /
-	             x|              x|
-	              |               |
-	              o---------------o
-
-	as round.  (`o' and `x' are on and off points, respectively).
-
-	This is a major change which should improve the rendering results
-	enormously for many TrueType fonts, especially in the range approx.
-	20-40ppem, fixing the appearance of many overshoots.
-
-	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Look at the
-	first and last points of the segment, not the points right before
-	and after.
-
-2013-07-19  Behdad Esfahbod  <behdad@google.com>
-
-	[sfnt] `sbix' fix-ups.
-
-	* src/sfnt/sfobjs.c (sfnt_load_face): Apple's `sbix' color bitmaps
-	are rendered scaled and then the `glyf' outline rendered on top.  We
-	don't support that yet, so just ignore the `glyf' outline and
-	advertise it as a bitmap-only font.
-
-	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
-	[TT_SBIT_TABLE_TYPE_SBIX]: Return metrics in 26.6 units.
-	(tt_face_load_sbix_image): Typo.
-
-2013-07-18  Behdad Esfahbod  <behdad@google.com>
-
-	[sfnt] Add support for Apple's `sbix' color bitmap table.
-
-	* include/freetype/internal/tttypes.h (TT_SBit_MetricsRec): Widen
-	fields to FT_Short and FT_UShort, respectively.
-	(TT_SBitTableType): New enumeration.
-	(TT_FaceRec): Add `sbit_table_type' field.
-
-	* include/freetype/tttags.h (TTAG_sbix): New macro.
-
-	* src/sfnt/pngshim.c (Load_SBit_Png): Pass a more generic
-	FT_GlyphSlot argument instead FT_Bitmap.
-	Add flag to control map and metrics handling.
-	Update all users.
-
-	* src/sfnt/ttsbit.c: Include `ttmtx.h'.
-	(tt_face_load_eblc): Renamed to...
-	(tt_face_load_sbit): This.
-	Handlic `sbix' bitmaps.
-	(tt_face_free_eblc): Renamed to...
-	(tt_face_load_sbit): This.
-	Updated.
-	(tt_face_load_strike_metrics): Handle `sbix' bitmaps.
-	(tt_face_load_sbix_image): New function.
-	(tt_sbit_decoder_alloc_bitmap, tt_sbit_decoder_load_image,
-	tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned,
-	tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png,
-	tt_sbit_decoder_load_image, tt_sbit_decoder_load_bitmap): Don't pass
-	and handle load flags.
-	(tt_sbit_decoder_load_bitmap) [!FT_CONFIG_OPTION_USE_PNG]: Better
-	handle formats 17-19.
-	Move color to grayscale conversion to...
-	(tt_face_load_sbit_image): Here.
-	Handle `sbix' bitmaps.
-
-	* src/sfnt/pngshim.h: Updated.
-	* src/sfnt/ttsbit.h: Updated.
-	* src/sfnt/sfdriver.c: Updated.
-
-2013-07-18  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Ignore invalid magic number in `head' or `bhed'.
-
-	Other font engines seem to ignore it also.  Problem reported by
-	Hin-Tak Leung <htl10@users.sourceforge.net>.
-
-	* src/sfnt/ttload.c (check_table_dir): Don't abort but warn only if
-	we have an invalid magic number.
-
-2013-07-16  Werner Lemberg  <wl@gnu.org>
-
-	[smooth] Fix segfault caused by previous commit.
-
-	* src/smooth/ftgrays.c (gray_set_cell): Always compute
-	`ras.invalid'.
-
-2013-07-16  David Turner  <digit@google.com>
-
-	[smooth] Improve performance.
-
-	Provide a work-around for an ARM-specific performance bug in GCC.
-	This speeds up the rasterizer by more than 5%.
-
-	Also slightly optimize `set_gray_cell' and `gray_record_cell' (which
-	also improves performance on other platforms by a tiny bit (<1%).
-
-	* src/smooth/ftgrays.c (FT_DIV_MOD): New macro.
-	Use it where appropriate.
-
-	(gray_record_cell, gray_set_cell, gray_move_to,
-	gray_convert_glyph_inner): Streamline condition handling.
-
-2013-07-16  David Turner  <digit@google.com>
-
-	[truetype] Add assembler code for TT_MulFix14 and TT_DotFix14.
-
-	This patch provides slightly optimized versions for ARM, x86, and
-	x86_64 CPUs if built with GCC.
-
-	Also remove some dead code.
-
-	* src/truetype/ttinterp.c (TT_MulFix14_arm, TT_MulFix14_long_long,
-	TT_DotFix14_long_long): New functions.
-
-2013-07-16  David Turner  <digit@google.com>
-
-	Optimize FT_MulFix for x86_64 GCC builds.
-
-	This patch provides an optimized `FT_MulFix' implementation for
-	x86_64 machines when FreeType is built with GCC, or compatible
-	compilers like Clang.
-
-	Example:
-	  bin/ftbench -p -t 5 -s 14 -f 0008 Arial.ttf
-
-	Before:
-
-	  Load                       4.863 us/op
-	  Load_Advances (Normal)     4.816 us/op
-	  Load_Advances (Fast)       0.028 us/op
-	  Render                     2.753 us/op
-	  Get_Glyph                  0.463 us/op
-	  Get_CBox                   0.077 us/op
-	  Get_Char_Index             0.023 us/op
-	  Iterate CMap              13.898 us/op
-	  New_Face                  12.368 us/op
-	  Embolden                   0.028 us/op
-	  Get_BBox                   0.302 us/op
-
-	After:
-
-	  Load                       4.617 us/op
-	  Load_Advances (Normal)     4.645 us/op
-	  Load_Advances (Fast)       0.027 us/op
-	  Render                     2.789 us/op
-	  Get_Glyph                  0.460 us/op
-	  Get_CBox                   0.077 us/op
-	  Get_Char_Index             0.024 us/op
-	  Iterate CMap              13.403 us/op
-	  New_Face                  12.278 us/op
-	  Embolden                   0.028 us/op
-	  Get_BBox                   0.301 us/op
-
-	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
-	(FT_MulFix_x86_64): New function.
-
-2013-07-16  David Turner  <digit@google.com>
-
-	Speed up ARMv7 support.
-
-	When building for ARMv7 with thumb2 instructions, the optimized
-	`FT_MulFix_arm' assembly routine was not being used.
-
-	The reason for this is in the `ftconfig.h' header, namely:
-
-	- The assembly routine uses the `smull' instruction which is not
-	  available when generating Thumb-1 machine code.  It is available
-	  in Thumb-2 mode, though.
-
-	- The header was written a long time ago before Thumb-2 became
-	  widely popular (e.g. with Android).  So it simply doesn't use the
-	  assembly routine if the `__thumb__' built-in macro is defined.
-
-	- When compiling in Thumb-2 mode, the compiler will define both
-	  `__thumb__' and `__thumb2__'.
-
-	By checking for `(__thumb2__ || !__thumb__)', we ensure that the
-	assembly routine is only avoided when generating Thumb-1 code.
-
-	Given that this is performance-sensitive function, this improves
-	`ftbench' as follows on a Galaxy Nexus:
-
-	                           Before (us/op)   After (us/op)
-
-	  - loading Arial.ttf glyphs at 14 ppem [1]
-
-	      Load                   34.285          33.098
-
-	  - same operation with the light auto-hinter [2]
-
-	      Load                   31.317          29.590
-
-	  - same operation without hinting [3]
-
-	      Load                    6.143           5.376
-
-	  - loading Arial.ttf advances at 14 ppem [4]
-
-	      Load_Advances (normal) 34.216          33.016
-	      Load_Advances (fast)    0.176           0.176
-
-	  [1] ftbench -t 5 -p -s 14 -b a -f 0008 Arial.ttf
-	  [2] ftbench -t 5 -p -s 14 -b a -r 1 -f 0028 Arial.ttf
-	  [3] ftbench -t 5 -p -s 14 -b a -f 000a Arial.ttf
-	  [4] ftbench -t 5 -p -s 14 -b b -f 0008 Arial.ttf
-
-	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
-	(FT_MULFIX_ASSEMBLER): Fix handling for ARMv7.
-
-2013-06-28  Werner Lemberg  <wl@gnu.org>
-
-	* docs/CHANGES: Updated.
-
-2013-06-27  Werner Lemberg  <wl@gnu.org>
-
-	* src/winfonts/winfnt.c (FNT_Load_Glyph): Fix bitmap width guard.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Add darkening limit to `darkening-parameters'.
-
-	* src/cff/cffdrivr.c (cff_property_set): Add check.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	[cff] Add `darkening-parameters' property.
-
-	* include/freetype/ftcffdrv.h: Document it.
-
-	* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
-	`darkening-parameters' property.
-
-	* src/cff/cf2font.h (CF2_FontRec): Add `darkenParams' array.
-
-	* src/cff/cf2font.c (cf2_computeDarkening): Add `darkenParams'
-	argument and use it.
-	Update all callers.
-
-	* src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Copy
-	`darken_params' values.
-
-	* src/cff/cffobjs.h (CFF_DriverRec): Add `darken_params' array.
-
-	* src/cff/cffobjs.c (cff_driver_init): Set default values for
-	`darken_params'.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Code shuffling.
-
-	* src/tools/docmaker/tohtml.py (re_url): Move regexp...
-	* src/tools/docmaker/sources.py: ... to this file.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Remove unused functions.
-
-	* src/tools/docmaker/content.py (DocMarkup.get_start,
-	DocBlock.get_markup_name): Removed.
-	* src/tools/docmaker/tohtml.py (html_quote0, dump_html_code,
-	HtmlFormatter.make_html_words): Removed.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	* builds/freetype.mk (dll): Remove target.
-
-	Problem reported by Jörg Günnewig <joerg.guennewig@googlemail.com>.
-
-2013-06-25  Werner Lemberg  <wl@gnu.org>
-
-	[docmaker] Recognise URLs.
-
-	* src/tools/docmaker/tohtml.py (re_url): New regular expression.
-	(make_html_para): Use it.
-
-2013-06-19  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.0.1 released.
-	===========================
-
-
-	Tag sources with `VER-2-5-0-1'.
-
-	* include/freetype/config/ftoption.h: Undefine
-	CFF_CONFIG_OPTION_OLD_ENGINE.
-	* devel/ftoption.h: Define CFF_CONFIG_OPTION_OLD_ENGINE.
-
-2013-06-19  Werner Lemberg  <wl@gnu.org>
-
-	* builds/unix/install.mk (install): Don't create `cache' directory.
-
-	Found by Peter Breitenlohner <peb@mppmu.mpg.de>.
-
-2013-06-19  Werner Lemberg  <wl@gnu.org>
-
-	* Version 2.5.0 released.
-	=========================
-
-
-	Tag sources with `VER-2-5-0'.
-
-	* docs/VERSION.DLL: Update documentation and bump version number to
-	2.5.0.
-
-	* README, Jamfile (RefDoc),
-	builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
-	builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
-	builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
-	builds/win32/visualc/freetype.dsp,
-	builds/win32/visualc/freetype.vcproj,
-	builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
-	builds/win32/visualce/freetype.vcproj,
-	builds/win32/visualce/index.html,
-	builds/wince/vc2005-ce/freetype.vcproj,
-	builds/wince/vc2005-ce/index.html,
-	builds/wince/vc2008-ce/freetype.vcproj,
-	builds/wince/vc2008-ce/index.html: s/2.4.12/2.5.0/, s/2412/250/.
-
-	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 5.
-	(FREETYPE_PATCH): Set to 0.
-
-	* builds/unix/configure.raw (version_info): Set to 16:2:10.
-
-	* src/base/ftobjs.c (FT_Open_Face): Pacify compiler.
-	* src/truetype/ttinterp.c (Ins_MSIRP, Ins_MIRP): Ditto.
-
-2013-06-18  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #39269.
-
-	* src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Free memory in
-	case of reacollocation failures.
-
-2013-06-18  Andrew Church  <achurch+savannah@achurch.org>
-
-	Fix Savannah bug #39266.
-
-	If memory allocations fail at certain points while opening a font,
-	FreeType can either crash due to a NULL dereference or leak memory.
-
-	* include/freetype/internal/ftobjs.c (FT_Face_InternalRec,
-	FT_LibraryRec): Make `refcount' a signed integer.  If, for example,
-	FT_Open_Face() fails in a memory allocation before the face's
-	reference count is set to 1, a subsequent `FT_Done_Library' call
-	would otherwise loop over `FT_Done_Face' 2^32 times before freeing
-	the face.
-
-	* src/base/ftobjs.c (open_face): Initialize `stream' and friends
-	earlier.
-	(FT_Open_Face) <Fail>: Behave correctly if `node' is NULL.
-	(FT_Destroy_Module) <Fail>: Check that `renderer_clazz' is valid.
-
-2013-06-14  Werner Lemberg  <wl@gnu.org>
-
-	* src/smooth/ftgrays.c One final pragma to silence 64-bit MSVC.
-
-2013-06-06  Dave Arnold  <darnold@adobe.com>
-	    Werner Lemberg  <wl@gnu.org>
-
-	[cff] Add code to Adobe's engine to handle ppem > 2000.
-
-	* src/cff/cffgload.c (cff_slot_load): If we get
-	FT_Err_Glyph_Too_Big, retry unhinted and scale up later on.
-
-2013-06-12  Werner Lemberg  <wl@gnu.org>
-
-	Another try on pragmas.
-
-	* include/freetype/internal/ftdebug.h: Move pragmas to...
-	* include/freetype/internal/internal.h: ... this file since it gets
-	included by all source files.
-	* include/freetype/internal/ftserv.h: Remove pragma which has no
-	effect.
-
-2013-06-12  Werner Lemberg  <wl@gnu.org>
-
-	* include/freetype/internal/ftdebug.h: Disable MSVC warning C4127.
-
-	This partially undoes commit 3f6e0e0c.
-
-2013-06-12  Werner Lemberg  <wl@gnu.org>
-
-	More compiler warning fixes.
-
-	*/*: Use cast to `FT_Bool' (or `Bool') where appropriate.
-
-2013-06-10  Werner Lemberg  <wl@gnu.org>
-
-	[truetype] Improve handling of broken sbit advance widths.
-
-	* src/truetype/ttgload.c (TT_Load_Glyph): Use the glyph's (scaled)
-	`linearHoriAdvance' if the sbit's `horiAdvance' value is zero.
-
-	Cf. font `Fixedsys Excelsior' v3.01 (FSEX300.ttf), glyph A, 16ppem.
-
-2013-06-10  Werner Lemberg  <wl@gnu.org>
-
-	[sfnt] Improve embedded bitmap tracing.
-
-	* src/base/ftobjs.c (FT_Request_Size): Move trace message regarding
-	bitmap strike match to...
-	(FT_Match_Size): This function.
-
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics,
-	tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned,
-	tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png,
-	tt_sbit_decoder_load_image): Decorate with tracing messages.
-
-2013-06-10  Werner Lemberg  <wl@gnu.org>
-
-	Fix Savannah bug #39160.
-
-	* src/truetype/ttinterp.c (Ins_SDPVTL): Set projection vector too
-	for the degenerate case.
-
-2013-06-09  David Turner  <digit@google.com>
-
-	* src/cache/ftcmanag.c (FTC_Manager_Reset): Add missing cache flush.
-
-	This code, present since eight(!) years in the unused `CACHE'
-	branch, has been forgotten to apply to the master branch.  It's
-	really amazing that noone has ever complained since
-	`FTC_Manager_Reset' is pretty useless without flushing the cache.
-
-2013-06-07  Werner Lemberg  <wl@gnu.org>
-
-	Add and improve pragmas for MSVC compiler.
-
-	* include/freetype/internal/ftdebug.h: Remove pragmas.
-	* include/freetype/internal/ftserv.h: Use push and pop for pragmas.
-	* include/freetype/internal/ftvalid.h: Handle warning C4324.
-	* src/base/ftobjs.c: Use push and pop for pragmas.
-	* src/gzip/ftgzip.c: Handle warning C4244.
-
-2013-06-07  Werner Lemberg  <wl@gnu.org>
-
-	[cff] s/cf2_getGlyphWidth/cf2_getGlyphOutline/.
-
-	* src/cff/cf2font.c, src/cff/cf2font.h, src/cff/cf2ft.c: Do it.
-
-2013-06-06  Dave Arnold  <darnold@adobe.com>
-
-	[cff] Add early exit feature for width-only calls.
-
-	This is for `FT_Get_Advance'.
-
-	There are 7 places where the spec says the width can be defined:
-
-	  hstem/hstemhm
-	  vstem/vstemhm
-	  cntrmask/hintmask
-	  hmoveto
+	  hstem
+	  vstem
 	  vmoveto
+	  callsubr
+	  div
 	  rmoveto
-	  endchar
+	  hmoveto
+	  Numbers
 
-	* src/cff/cf2intrp.c (cf2_doStems): Exit early for width-only calls,
-	if possible.
+	The subsequent commits will implement these changes and adapt
+	accesses of data and objects to the new interpreter.
 
-	(cf2_interpT2CharString) <cf2_cmdHSTEM>, <cf2_cmdVSTEM>,
-	<cf2_cmdVMOVETO>, <cf2_cmdENDCHAR>, <cf2_cmdHINTMASK>,
-	<cf2_cmdRMOVETO>, <cf2_cmdHMOVETO>: Exit early for width-only calls.
+	NOTE: Will not compile in the meantime!
 
-2013-06-06  Werner Lemberg  <wl@gnu.org>
+	* src/psaux/psintrp.c: Add opcodes to enum.
+	(cf2_interpT2CharString): Copy relevant code over from
+	`t1_decoder_parse_charstrings' (in `t1decode.c').
 
-	Next round of compiler fixes.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* builds/win32/ftdebug.c, builds/wince/ftdebug.c (ft_debug_init):
-	Add proper cast.
+	[type1] Fixes for rendering.
 
-	* include/freetype/internal/ftserv.h (FT_SERVICE_UNAVAILABLE): Fix
-	cast.
-	* include/freetype/internal/ftstream.h: Decorate stream and frame
-	macros with `FT_Long' and `FT_ULong' as appropriate.
+	The Type 1 advance width calculation passes null for glyph slot,
+	etc, which can cause null pointer access in the new interpreter.
+	Fall back to the old one for now.
 
-	* src/base/ftrfork.c (raccess_guess_darwin_hfsplus,
-	raccess_guess_darwin_newvfs): Use cast.
+	Fix the large glyph retry code and ensure hinting and scaling flags
+	are set properly.
 
-	* src/bdf/bdflib.c (_bdf_set_default_spacing): Use cast.
+	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add a
+	check for metrics_only.
+	Set the `force_scaling' flag.
+	(T1_Parse_Glyph): Updated.
+	(T1_Load_Glyph): Add `hinting' and `scaled' flags.
 
-	* src/cache/ftcmanag.c (FTC_Manager_Check): Fix cast.
-	* src/cache/ftcmanag.h (FTC_ManagerRec): Ditto.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/cff/cf2arrst.c (cf2_arrstack_setNum_Elements): Use cast.
-	* src/cff/cf2ft.c (cf2_freeSeacComponent): Ditto.
-	* src/cff/cffobjs.c (remove_subset_prefix, remove_style): Ditto.
+	[psaux] Add missing objects (2/2).
 
-	* src/cid/cidparse.c (cid_parser_new): Use cast.
+	Synthesize a `SubFont' object for Type 1 fonts.  This is used in the
+	interpreter to access Private dict data, which are stored in
+	different places for Type 1 and CFF.  This allows the same data to
+	be used in either mode.
 
-	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Use cast.
+	* src/psaux/psobjs.c (t1_make_subfont): New procedure to copy
+	required values to a dummy `CFF_SubFont' object.  This is similar to
+	`cff_make_private_dict'.
+	* src/psaux/psobjs.h: Add the new declaration.
 
-	* src/psaux/psobjs.c (reallocate_t1_table): Fix argument type.
+	* include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Ditto.
+	Add this to the PSAux Service for future use with CID fonts.
 
-	* src/raster/ftraster.c (ft_black_reset): Use cast.
+	* src/type1/t1gload.c: Include FT_INTERNAL_CFF_TYPES_H.
+	(T1_Parse_Glyph_And_Get_Char_String): Add the call.
 
-	* src/truetype/ttgxvar.c (FT_Stream_FTell): Use cast.
-	(ALL_POINTS): Fix cast.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/type1/t1driver.c (t1_ps_get_font_value): Add casts.
-	* src/type1/t1parse.c (T1_Get_Private_Dict): Add cast.
+	[psaux] Add missing objects for Type 1 (1/2).
 
-2013-06-05  Dave Arnold  <darnold@adobe.com>
+	Move `CF2_Font' instance to `PS_Decoder'.  This is the context for
+	the interpreter and since it is currently stored in `CFF_Font', is
+	unavailable in Type 1 mode.
 
-	Fix more MSVC Win32 compiler warnings.
+	* include/freetype/internal/psaux.h (T1_Decoder, PS_Decoder): New
+	`cf2_instance' field.
 
-	* src/base/ftobjs.c: Fix typo in MS pragma.
+	* src/psaux/psdecode.c (ps_decoder_init): Copy `cf2_instance' to
+	`PS_Decoder'.
 
-	* src/base/bdflib.c (_bdf_set_default_spacing, _bdf_add_property):
-	`lineno' is only used in debug mode.
+	* src/psaux/t1decode.c (t1_decoder_done): Add finalization code.
 
-	* src/cff/cf2ft.c (cf2_builder_moveTo): `params' is only used in
-	debug mode.
+	* src/psaux/psft.c (cf2_decoder_parse_charstrings): Update accesses.
 
-2013-06-05  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	Fix compiler warnings.
+	Allow `type1' module to use the Adobe engine.
 
-	* include/freetype/internal/ftmemory.h: Decorate memory allocation
-	macros with `FT_Long' where appropriate.
-	Remove duplicate of FT_MEM_QRENEW_ARRAY definition.
+	Add the callback and some conditionals to switch between the two
+	engines.
 
-	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use
-	cast.
+	* include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Change
+	function declarations.
+	* src/psaux/psauxmod.c (T1_Decoder_FuncsRec): Register the
+	callbacks.
 
-	* src/base/ftobjs.c: Add warning disabling pragma for MSVC while
-	including `md5.c'.
+	* src/psaux/psobjs.c (ps_builder_add_point): Add conditionals for
+	number conversion.
 
-	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdESC>: Add
-	cast.
+	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add code
+	to choose which renderer to use.
 
-	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_compound): Fix casts.
-	(tt_sbit_decoder_load_bitmap): Beautification.
+	* src/cid/cidgload.c (cid_load_glyph): Update call.
+	* src/base/ftobjs.c, src/psaux/psobjs.c, src/type1/t1gload.c: Update
+	includes.
 
-	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Initialize
-	variables (earlier).
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Pacify compiler.
+	[type1] Add Adobe engine configuration.
 
-	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Use unsigned constants
-	where appropriate.
+	Use the previously changed PS_Driver in type1 module to store
+	hinting engine configuration.
 
-	* src/type1/t1load.c (T1_Get_MM_Var): Ditto.
+	* include/freetype/ftt1drv.h: New file.
+	Duplicate and rename config options from CFF.
+	* include/freetype/config/ftheader.h (FT_TYPE1_DRIVER_H): New macro.
 
-2013-06-04  Werner Lemberg  <wl@gnu.org>
+	* src/type1/t1driver.c (t1_driver_class): Update declaration.
+	* src/type1/t1objs.c: Include FT_TYPE1_DRIVER_H.
+	(T1_Driver_Init): Update code.
 
-	* src/cff/cf2font.c (cf2_getGlyphWidth): Initialize `advWidth'.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	Problem reported by Ingmar Sittl <ingmar.sittl@elektrobit.com>.
+	[cff] Move and rename `CFF_Driver'.
 
-2013-06-04  Werner Lemberg  <wl@gnu.org>
+	This is so that we can use the same hinting engine parameters for
+	Type 1.
 
-	Apply fixes for cppcheck nitpicks.
+	* include/freetype/internal/cffotypes.h (CFF_Driver): Rename and
+	move to...
+	* include/freetype/internal/psaux.h (PS_Driver): ...here.
 
-	  http://cppcheck.sourceforge.net/
+	* src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffload.c,
+	src/cff/cffobjs.c, src/cff/cffobjs.h, src/psaux/psft.c,
+	src/psaux/psobjs.c: Update references.
 
-	The call was (from the top-level of the FreeType tree):
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-	  cppcheck --force \
-	           --enable=all \
-	           -I include \
-	           -I include/freetype/ \
-	           -I include/freetype/config/ \
-	           -I include/freetype/internal/ \
-	           . &> cppcheck.log
+	[psaux, type1] Reorganize object fields.
+
+	Make some fields more generic, so that we can access them the same
+	way regardless of Type 1 or CFF.
+
+	* include/freetype/internal/psaux.h (PS_Builder): Change `TT_Face'
+	to `FT_Face'.
+	Remove unused fields.
+
+	* src/psaux/psft.c: Update all accesses of `PS_Builder.face'.
+	Add some asserts to guard against casting `T1_Face' as `TT_Face'.
+
+	* src/type1/t1objs.h (T1_GlyphSlot): Reorder fields to follow
+	`CFF_GlyphSlot', so that we can pretend they are the same in the
+	interpreter.
+
+	* src/psaux/psobjs.c (ps_builder_init, ps_builder_add_point):
+	Updated with above changes.
+
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Prepare for Type 1 mode.
+
+	Add some checks for Type 1 data passing through.
+
+	* src/psaux/psfont.h (CF2_Font): Add `isT1' flag.
+	* src/psaux/psfont.c (cf2_font_setup): Skip the variations and blend
+	code which is not applicable for Type 1.
+
+	* src/psaux/psft.c (cf2_decoder_parse_charstrings): Avoid accessing
+	`decoder->cff' in Type 1 mode.
+	Copy `is_t1' flag to `CF2_Font'.
+
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux, cff] Use the new objects.
+
+	* include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Fix
+	switching between new and old engines.
+
+	* src/cff/cffgload.c, src/cff/cffparse.c: Update calls.
+
+	* src/psaux/psblues.c, src/psaux/psfont.c, src/psaux/psfont.h,
+	src/psaux/psft.c, src/psaux/psft.h, src/psaux/psintrp.c: Update all
+	to use new objects.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Objects for new interpreter (part 2).
+
+	Make the new objects copy over values.  They are essentially wrapper
+	types for the different decoders/builders.
+
+	* include/freetype/internal/psaux.h: Update declarations.
+	(PS_Builder): Add `is_t1' flag.
+	(PS_Decoder_{Get,Free}_Glyph_Callback): Renamed to...
+	(CFF_Decoder_{Get,Free}_Glyph_Callback: ... this.
+	(PS_Decoder): Updated.
+	Add `t1_parse_callback' member.
+	(PSAux_ServiceRec): Add `ps_decoder_init' member.
+
+	* src/psaux/psdecode.h, src/psaux/psobjs.h: Update declarations.
+
+	* src/psaux/psdecode.c, src/psaux/psobjs.c: Implement copy with two
+	modes.
+
+	* src/psaux/psauxmod.c: Add builder and decoder functions to `PSAux'
+	service.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Add objects for new interpreter.
+
+	Introduce `PS_Decoder' and `PS_Builder' which include all fields
+	from either Type 1 or CFF decoders/builders.
+
+	* include/freetype/internal/psaux.h (PS_Builder, PS_Decoder): New
+	structs.
+
+	* src/psaux/psobjs.c, src/psaux/psobjs.h: Add `PS_Builder'
+	functions.
+
+	* src/psaux/psdecode.c, src/psaux/psdecode.h: New files to hold
+	`PS_Decoder' initialization functions.
+
+	* src/psaux/psaux.c, src/psaux/Jamfile (_sources),
+	src/psaux/rules.mk (PSAUX_DRV_SRC): Updated.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Rename files.
+
+	Replace the `cf2' file name prefix with `ps' as the Adobe engine
+	will be used for both PostScript Types 1 and 2 (CFF) instead of just
+	CFF.
+
+	s/cf2/ps/ for all following.
+
+	* src/psaux/cf2*: Rename files.
+	* src/psaux/*: Update includes.
+
+	* src/psaux/Jamfile (_sources), src/psaux/rules.mk (PSAUX_DRC_SRC,
+	PSAUX_DRV_H): Update file references.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux] Minor fix.
+
+	Use `MultiMasters' service in `psaux' instead of a call to `cff'.
+	The project builds if CFF_CONFIG_OPTION_OLD_ENGINE is not defined.
+
+	* src/psaux/cf2ft.c: Update includes.
+	(cf2_getNormalizedVector): Use `mm->get_var_blend' instead of
+	`cff_get_var_blend'.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux, cff] Move `cff_random' into `psaux' service.
+
+	NOTE: Does not compile!
+
+	Minor fix to allow both `cff' and `psaux' to use `cff_random'.
+
+	* src/cff/cffload.c (cff_random): Move to...
+	* src/psaux/psobjs.c: Here.
+	* src/cff/cffload.h: Move corresponding declaration to
+	`src/psaux/psobjs.h'.
+
+	* include/freetype/internal/psaux.h (PSAux_ServiceRec): Register the
+	function here...
+	* src/psaux/psauxmod.c: And here.
+
+	* src/cff/cffload.c, src/psaux/cf2intrp.c: Update code.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[cff] Move struct declarations to `freetype/internal'.
+
+	NOTE: Does not compile!
+
+	This is so that the CFF functions moved to `psaux' can access the
+	same structs that they need.
+
+	* src/cff/cfftypes.h: Moved to...
+	* include/freetype/internal/cfftypes.h: ...Here.
+
+	* src/cff/cffobjs.h: Moved the struct declarations to...
+	* include/freetype/internal/cffotypes.h: ... this new file.
+
+	* include/freetype/internal/internal.h (FT_INTERNAL_CFF_TYPES_H,
+	FT_INTERNAL_CFF_OBJECT_TYPES_H): New macros.
+
+	* src/cff/cffcmap.h, src/cff/cffdrivr.c, src/cff/cffgload.c,
+	src/cff/cffgload.h, src/cff/cffload.h, src/cff/cffobjs.c,
+	src/cff/cffobjs.h, src/cff/cffparse.h, src/psaux/psobjs.h,
+	include/freetype/internal/psaux.h,
+	include/freetype/internal/services/svcfftl.h: Update includes.
+
+	* src/cff/rules.mk (CFF_DRV_H): Updated.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux, cff] Add new service for inter-module calls.
+
+	NOTE: Does not compile!
+
+	This is to allow CFF functions moved to `psaux' to call functions
+	declared in `src/cff/cffload.h'.
+
+	* include/freetype/internal/services/svcfftl.h: New file, setting up
+	a `CFFLoad' service.
+
+	* include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC10,
+	FT_DEFINE_SERVICEDESCREC): New macros.
+	(FT_SERVICE_CFF_TABLE_LOAD_H): New macro.
+
+	* src/cff/cffdrivr.c, src/cff/cffpic.h: Register the new service.
+
+	* src/cff/cfftypes.h (CFF_FontRec), src/psaux/cf2font.h
+	(CF2_FontRec): Add service interface.
+
+	* src/cff/cffobjs.c, src/psaux/cf2font.c, src/psaux/cf2ft.c,
+	src/psaux/cf2intrp.c, src/psaux/cffdecode.c: Use the new service.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux, cff] Add callbacks for inter-module calls.
+
+	NOTE: Does not compile!
+
+	* include/freetype/internal/psaux.h: Add function pointer
+	declarations.
+
+	* src/psaux/cffdecode.c (cff_decoder_init): Update to take in
+	callbacks.
+	* src/psaux/cffdecode.h: Ditto.
+
+	* src/cff/cffgload.c (cff_compute_max_advance, cff_slot_load):
+	Update calls to pass in callbacks.
+	* src/psaux/cf2ft.c, src/psaux/cffdecode.c: Use them.
+
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
+
+	[psaux, cff] Create new `PSAux' service interface entries.
+
+	NOTE: Does not compile!
+
+	* include/freetype/internal/psaux.h: Include
+	FT_INTERNAL_TRUETYPE_TYPES_H.
+	(CFF_Builder_FuncsRec, CFF_Decocer_FuncsRec): New function tables.
+	(CFF_Builder): Updated.
+	Fix for forward declaration.
+	(PSAux_ServiceRec): New field `cff_decoder_funcs'.
 
-	Note that the current version heavily chokes on FreeType, delivering
-	many wrong results.  I will report those issues to the cppcheck team
-	so that a newer version gives improved results hopefully.
+	* src/psaux/psauxmod.c (cff_builder_funcs, cff_decoder_funcs): New
+	function tables.
+	(PSAux_Interface): Updated.
 
-	*/* Improve variable scopes.
-	*/* Remove redundant initializations which get overwritten.
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Add `psaux'
+	service interface.
 
-	* src/base/ftmac.c, builds/mac/ftmac.c (count_faces_scalable):
-	Remove unused variable.
+	* src/cff/cffgload.c, src/cff/cffobjs.c, src/cff/cffparse.c: Update
+	function calls to use psaux service.
 
-	* src/base/ftdbgmem.c (ft_mem_table_destroy): `table' can't be zero.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt1_entry_validate):
-	Remove functionless code.
+	[psaux, cff] Move CFF builder components into `psaux' module.
 
-	* src/tools/ftrandom.c (main): Fix memory leak.
+	NOTE: Does not compile!
 
-2013-06-03  Werner Lemberg  <wl@gnu.org>
+	* src/cff/cffgload.c
+	(cff_builder_{init,done,add_point,add_point1,add_contour,start_point,close_contour},
+	cff_check_points): Move to...
+	* src/psaux/psobjs.c: Here.
 
-	Add CFF_CONFIG_OPTION_OLD_ENGINE configuration option.
+	* src/cff/cffgload.h: Move corresponding declarations to
+	`src/psaux/psobjs.h'.
 
-	This controls whether the old FreeType CFF engine gets compiled into
-	FreeType.  It is now disabled by default.
+	* src/cff/cffgload.h (CFF_Builder): Move struct declaration to...
+	* include/freetype/internal/psaux.h: Here.
 
-	* devel/ftoption.h, include/freetype/config/ftoption.h
-	(CFF_CONFIG_OPTION_OLD_ENGINE): New macro.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-	* src/cff/cffdrivr.c (cff_property_set), src/cff/cffgload.c
-	(CFF_Operator, cff_argument_counts, cff_builder_add_point,
-	cff_operator_seac, cff_decoder_parse_charstrings, cff_slot_load),
-	src/cff/cffgload.h, src/cff/cffobjs.c (cff_driver_init): Use
-	CFF_CONFIG_OPTION_OLD_ENGINE to guard the affected code.
+	[psaux, cff] Move CFF decoder components into `psaux' module.
 
-	* docs/CHANGES: Updated.
+	NOTE: Does not compile!
 
-2013-06-02  Werner Lemberg  <wl@gnu.org>
+	* src/cff/cffgload.c (CFF_Operator,
+	CFF_COUNT_{CHECK_WIDTH,EXACT,CLEAR_STACK}, cff_argument_counts,
+	cff_operator_seac, cff_compute_bias,
+	cff_lookup_glyph_by_stdcharcode,
+	cff_decoder_{parse_charstrings,init,prepare}): Move to...
+	* src/psaux/cffdecode.c: This new file.
 
-	Fix PNG library handling.
+	* src/cff/cffgload.h: Move corresponding declarations to...
+	* src/psaux/cffdecode.h: This new file.
 
-	* builds/unix/configure.raw: Don't use LIBPNG_LIBS but
-	LIBPNG_LDFLAGS.
+	* src/cff/cffgload.h (CFF_MAX_{OPERANDS,SUBRS_CALLS,TRANS_ELEMENTS},
+	CFF_Decoder_Zone, CFF_Decoder): Move declarations to...
+	* include/freetype/internal/psaux.h: Here.
 
-2013-05-23  Behdad Esfahbod  <behdad@google.com>
+	* src/psaux/cf2ft.h: Update include.
 
-	Add support for color embedded bitmaps (eg. color emoji).
+	* src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Update with
+	the new file.
 
-	A new load flag, FT_LOAD_COLOR, makes FreeType load color
-	embedded-bitmaps, following this draft specification
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-	  https://color-emoji.googlecode.com/git/specification/v1.html
+	[psaux, cff] Move Adobe's engine components into `psaux' module.
 
-	which defines two new SFNT tables, `CBDT' and `CBLC' (named and
-	modeled after `EBDT' and `EBLC', respectively).  The color bitmaps
-	are stored in the new FT_PIXEL_MODE_BGRA format to represent BGRA
-	pre-multiplied sRGB images.  If PNG support is available, PNG color
-	images as defined in the same proposed specification are supported
-	also.
+	This is the first patch of a sequence to move the Type 2 charstring
+	processing capability from the `cff' module to the `psaux' module.
 
-	Note that color bitmaps are converted to grayscale if client didn't
-	ask for color.
+	NOTE: Does not compile!
 
-	* builds/unix/configure.raw: Search for libpng.
-	Add `--without-png' option.
+	* src/cff/cf2*: Move these files to...
+	* src/psaux/cf2*: Here.
 
-	* devel/ftoption.h, include/freetype/config/ftoption.h
-	(FT_CONFIG_OPTION_USE_PNG): New macro.
+	* src/cff/Jamfile (_sources), src/cff/rules.mk (CFF_DRV_SRC,
+	CFF_DRV_H), src/cff/cff.c, src/cff/cffgload.c: Remove file
+	references.
 
-	* include/freetype/freetype.h (FT_LOAD_COLOR): New load flag.
+	* src/psaux/Jamfile (_sources), src/psaux/rules.mk, src/psaux/psaux.c
+	(PSAUX_DRV_SRC, PSAUX_DRV_H): Add file references.
 
-	* include/freetype/ftimage.h (FT_Pixel_Mode): Add
-	`FT_PIXEL_MODE_BGRA'.
+2017-09-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	* include/freetype/tttags.h (TTAG_CBDT, TTAG_CBLC): New tags.
+	Tweak per-face LCD filtering controls.
 
-	* src/base/ftbitmap.c (FT_Bitmap_Embolden): Updated.
-	(ft_gray_for_premultiplied_srgb_bgra): New function.
-	(FT_Bitmap_Convert): Handle FT_PIXEL_MODE_BGRA.
+	Thing are simpler with a NULL-function pointer.
 
-	* src/sfnt/pngshim.c, src/sfnt/pngshim.h: New files.
+	* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
+	pointer to the filter function.
+	(FT_LibraryRec): Remove unused `lcd_filter'.
+	(FT_Bitmap_LcdFilterFunc, ft_lcd_filter_fir):  Move from here...
+	* include/freetype/ftlcdfil.h (FT_Bitmap_LcdFilterFunc,
+	ft_lcd_filter_fir): ... to here.
 
-	* src/sfnt/sfnt.c: Include `pngshim.c'.
+	* src/base/ftobjs.c (ft_open_face_internal): NULL-initialize the
+	per-face filter.
+	(FT_Face_Properties): Set it.
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Simplify.
 
-	* src/sfnt/ttsbit.c: Include FT_BITMAP_H and `pngshim.h'
-	(tt_face_load_eblc): Load `CBLC'.
-	(tt_sbit_decoder_init): Load `CBDT'.
-	(tt_sbit_decoder_alloc_bitmap): Pass load flags to select between
-	color and grayscale bitmaps.
-	Set `num_grays'.  This is used by `ftview' to choose the blending
-	algorithm.
-	(tt_sbit_decoder_load_byte_aligned,
-	tt_sbit_decoder_load_bit_aligned, tt_sbit_decoder_load_compound,
-	tt_sbit_decoder_load_image): Pass load flag.
-	s/write/pwrite/.
-	Don't call `tt_sbit_decoder_alloc_bitmap'.
-	Updated.
-	(tt_sbit_decoder_load_png) [FT_CONFIG_OPTION_USE_PNG]: New function.
-	(tt_sbit_decoder_load_bitmap): Pass load flag.
-	Handle new glyph formats 17, 18, and 19.
-	Call `tt_sbit_decoder_alloc_bitmap'.
-	Flatten color bitmaps if necessary.
-	(tt_face_load_sbit_image): Updated.
+	* src/base/ftlcdfil.c (ft_lcd_filter_fir, FT_Libary_SetLcdFilter):
+	Minor.
 
-	* src/sfnt/rules.mk (SFNT_DRV_SRC): Add `pngshim.c'.
+2017-09-24  Jonathan Kew  <jfkthame@gmail.com>
 
-	* docs/CHANGES: Updated.
+	[sfnt] Fix `premultiply_data' (#52092).
 
-2013-05-24  Guenter  <info@gknw.net>
+	* src/sfnt/pngshim.c (premultiply_data): Don't use vector extension
+	if we have less than 16 bytes of data.
 
-	Apply Savannah patch #8055.
+2017-09-24  Werner Lemberg  <wl@gnu.org>
 
-	Make `apinames' create an import file for NetWare.
+	[otvalid] Fix handling of ValueRecords.
 
-	* src/tools/apinames.c (PROGRAM_VERSION): Set to 0.2.
-	(OutputFormat): Add `OUTPUT_NETWARE_IMP'.
-	(names_dump): Handle it.
-	(usage): Updated.
-	(main): Handle new command line flag `-wN'.
+	For GPOS pair positioning format 1 the description of ValueRecords
+	in the OpenType specification (1.8.2, from today) is wrong – the
+	offset has to be taken from the parent structure; in this case the
+	`PairSet' table.
 
-2013-05-23  Behdad Esfahbod  <behdad@behdad.org>
+	* src/otvalid/otvgpos.c (otv_PairSet_validate): Set `extra3'.
+	(otv_PairPos_validate): Adjust.
 
-	Compilation fix.
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttinterp.c (TT_RunIns)
-	[!TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Make it work.
+	[otvalid] Handle `GSUB' and `GPOS' v1.1 tables.
 
-2013-05-22  Infinality  <infinality@infinality.net>
+	* src/otvalid/otvgsub.c (otv_GSUB_validate), src/otvalid/otvgpos.c
+	(otv_GPOS_validate): Implement it.
 
-	[truetype] Formatting and an additional subpixel tweak.
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttinterp.c (Ins_SHPIX): Formatting fix.
-	* src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules):
-	Revert previous modification for Verdana clones.
+	[otvalid] Update common table handling to OpenType 1.8.2.
 
-2013-05-22  Infinality  <infinality@infinality.net>
+	* src/otvalid/otvcommn.c (otv_Device_validate): Handle
+	VariationIndex subtable.
+	(otv_Lookup_validate): Handle MarkFilteringSet.
 
-	[truetype] Adjust subpixel zp2 moves and tweak rules.
+2017-09-23  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	These modifications fix thin diagonal stems in some legacy fonts.
+	[build] Windows-style DLL versioning.
 
-	* src/truetype/ttinterp.c (Direct_Move_X): Remove unused macro.
-	(Move_Zp2_Point): Don't always disable x moves for subpixel rendering.
-	(Ins_SHP): Disable x moves here for subpixel rendering.
-	(Ins_SHPIX): Only disable x moves in compatibility mode.
-	Split out zp2 move reversals and reorder conditional respectively.
+	* build/windows/ftver.rc: New VERSIONINFO resource.
+	* build/windows/vc2010/freetype.vcxproj: Further improvements.
 
-	* src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules): Fix oversight.
-	Only adjust Verdana clones for 17 ppem.
-	(SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Courier New.
-	(ALWAYS_SKIP_DELTAP_Rules): Found additional cases for Arial `s'.
+2017-09-23  Ben Wagner  <bungeman@google.com>
 
-2013-05-20  Infinality  <infinality@infinality.net>
+	[truetype] Really fix #52082.
 
-	[truetype] Simplify and improve subpixel function detection.
+	* src/truetype/ttinterp.c (Ins_MDRP): Correct conditional.
 
-	Some small enhancements have allowed the removal of many macros and
-	the simplification of existing rules in `ttsubpix.c'.
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttsubpix.h (SPH_TWEAK_ALLOW_X_DMOVEX,
-	SPH_TWEAK_ALLOW_X_MOVE_ZP2,
-	SPH_TWEAK_DELTAP_SKIP_EXAGGERATED_VALUES,
-	SPH_TWEAK_SKIP_INLINE_DELTAS, SPH_TWEAK_MIRP_CVT_ZERO): Removed.
-	(SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP): New rule macro.
+	[otvalid] Handle `GDEF' v1.2 and v1.3 tables.
 
-	* src/truetype/ttsubpix.c: Updated affected rules.
+	No validation of variation stuff yet.
 
-	* src/truetype/ttinterp.c (Direct_Move_X): Updated.
-	(INS_FDEF): Add additional function detection.
-	(INS_ENDF): Set runtime flag.
-	(Ins_CALL): Skip the call under certain conditions.
-	Remove bad code.
-	(Ins_LOOPCALL): Skip the call under certain conditions.
-	Remove bad code.
-	(Move_Zp2_Point): Updated.
-	(Ins_SHPIX): Updated.
-	Skip the move under some situations.
-	(Ins_MIAP): Improve conditions.
-	(Ins_MIRP): Updated.
-	(Ins_DELTAP): Skip move under certain conditions.
-	Simplify conditions.
-	(TT_RunIns): Updated.
-	Add code to handle new function detection.
-	Trace messages.
+	* src/otvalid/otvgdef.c (otv_MarkGlyphSets_validate): New function.
+	(otv_GDEF_validate): Implement it.
 
-2013-05-17  Werner Lemberg  <wl@gnu.org>
+2017-09-22  Werner Lemberg  <wl@gnu.org>
 
-	Update more FT_Err_XXX macros using FT_ERR and FT_THROW;
+	[otvalid] Handle `BASE' v1.1 table.
 
-	* builds/amiga/src/base/ftsystem.c, builds/mac/ftmac.c,
-	builds/unix/ftsystem.c, builds/vms/ftsystem.c: Do it.
+	No validation of variation stuff yet.
 
-2013-05-15  Werner Lemberg  <wl@gnu.org>
+	* src/otvalid/otvbase.c (otv_BASE_validate): Implement it.
 
-	[truetype] Add `interpreter-version' property.
+2017-09-22  Werner Lemberg  <wl@gnu.org>
 
-	This makes the option TT_CONFIG_OPTION_SUBPIXEL_HINTING controllable
-	at runtime.
+	[otvalid] Macros for 32bit offset support.
 
-	* include/freetype/ftttdrv.h: New file.
+	* src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE32,
+	OTV_OPTIONAL_OFFSET32, OTV_SIZE_CHECK32): New macros.
 
-	* include/freetype/config/ftheader.h (FT_TRUETYPE_DRIVER_H): New
-	macro.
+2017-09-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	* src/truetype/ttdriver.c: Include FT_TRUETYPE_DRIVER_H.
-	(tt_property_set, tt_property_get): Fill templates.
+	[build] Simplify Visual C++ 2010 project.
 
-	* src/truetype/ttobjs.h (TT_DriverRec): Add `interpreter_version'
-	member.
-	Remove unused `extension_component' member.
+	* build/windows/vc2010/freetype.vcxproj: Remove fake singlethreaded
+	configurations and tweak.
 
-	* src/truetype/ttgload.c: Include FT_TRUETYPE_DRIVER_H.
-	(tt_get_metrics, TT_Hint_Glyph, TT_Process_Simple_Glyph,
-	compute_glyph_metrics, tt_loader_init): Use `interpreter_version'.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttinterp.c: Include FT_TRUETYPE_DRIVER_H.
-	(SUBPIXEL_HINTING): New macro to check `interpreter_version' flag.
-	Update all affected functions to use it.
-	Use TT_INTERPRETER_VERSION_XXX where appropriate.
+	[truetype] Integer overflow (#52082).
 
-	* src/truetype/ttobjs.c: Include FT_TRUETYPE_DRIVER_H.
-	(tt_driver_init): Initialize `interpreter_version'.
+	* src/truetype/ttinterp.c (Ins_MDRP): Avoid FT_ABS.
 
-	* src/truetype/ttsubpix.c: Include FT_TRUETYPE_DRIVER_H.
-	Use TT_INTERPRETER_VERSION_XXX where appropriate.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-2013-05-13  Werner Lemberg  <wl@gnu.org>
+	[sfnt] Fix postscript name for default instance of variation fonts.
 
-	[truetype] Avoid empty source file.
+	Problem reported by Behdad.
 
-	* src/truetype/ttsubpix.c [!TT_CONFIG_OPTION_SUBPIXEL_HINTING]:
-	Provide dummy typedef.
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name): Test
+	`is_default_instance'.
 
-2013-05-13  Werner Lemberg  <wl@gnu.org>
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-	* src/cff/cf2font.c (cf2_getGlyphWidth): Fix uninitialized variable.
+	[truetype] Fix `mmvar' array pointers, part 2.
 
-	Fix suggested by Vaibhav Nagarnaik <vnagarnaik@gmail.com>.
+	The previous commit was incomplete.
 
-2013-05-13  Brian Nixon  <bnixon@yahoo.com>
+	* src/truetype/ttgxvar.c: Properly initialize sub-array offsets for
+	`master' also.
 
-	Fix Savannah bug #38970.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-	* src/base/ftdebug.c, builds/win32/ftdebug.c,
-	builds/wince/ftdebug.c, builds/amiga/src/base/ftdebug.c
-	(ft_debug_init): Don't read past the environment variable FT2_DEBUG.
+	[truetype] Fix `mmvar' array pointers.
 
-2013-05-12  Werner Lemberg  <wl@gnu.org>
+	Without this change, clang's AddressSanitizer reports many runtime
+	errors due to misaligned addresses.
 
-	[truetype] Add framework for TrueType properties.
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Use multiples of pointer
+	size for sub-array offsets into `mmvar'.
 
-	* src/truetype/ttdrivr.c: Include FT_SERVICE_PROPERTIES_H.
-	(tt_property_set, tt_property_get): New functions, still empty.
-	Define `tt_service_properties' service.
-	Update `tt_services'.
+2017-09-20  Werner Lemberg  <wl@gnu.org>
 
-	* src/truetype/ttpic.h: Include FT_SERVICE_PROPERTIES_H.
-	(TT_SERVICE_PROPERTIES_GET): New macro.
-	(TTModulePIC): Add `tt_service_properties'.
+	[truetype] Integer overflows.
 
-2013-05-12  Werner Lemberg  <wl@gnu.org>
+	Changes triggered by
 
-	Fix Savannah bug #38967.
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3429
 
-	* src/base/ftcalc.c (FT_DivFix) [FT_LONG64]: Fix cast.
+	* src/truetype/ttinterp.c (Ins_SHPIX, Ins_DELTAP): Use NEG_LONG.
+	(Ins_MIAP): Use SUB_LONG.
 
-2013-05-12  Werner Lemberg  <wl@gnu.org>
+2017-09-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	Introduce unsigned 64bit type (if available).
+	[build] Fix DLL builds in Visual C++ project.
 
-	* include/freetype/config/ftconfig.h: Define FT_UINT64 if available.
-	[FT_LONG64]: Provide FT_UInt64.
+	* build/windows/vc2010/freetype.vcxproj: Use DynamicLibrary in Debug
+	and Release configurations.
+	* include/freetype/config/ftconfig.h (FT_EXPORT, FT_EXPORT_DEF)
+	[_DLL]: Use Visual C++ extensions.
 
-	* builds/unix/ftconfig.in: Synchronized.
+2017-09-19  John Tytgat  <John.Tytgat@esko.com>
 
-2013-05-12  Werner Lemberg  <wl@gnu.org>
+	[cff] Fix family name logic of pure CFF fontdata (#52056).
 
-	Fix Savannah bug #38968.
+	1. If `FamilyName' is present in the CFF font, use this for
+	   FT_Face's `family_name'.
+	2. Otherwise, use the face name and chop off any subset prefix.
+	3. If at this point FT_Face's `family_name' is set, use this
+	   together with the full name to determine the style.
+	4. Otherwise, use `CIDFontName' as FT_Face's `family_name'.
+	5. If we don't have a valid style, use "Regular".
 
-	* include/freetype/ftmodapi.h: Add `FT_EXPORT' to
-	FT_Property_{Set,Get}.
-	* src/base/ftobjs.c: Add `FT_EXPORT_DEF' to
-	FT_Property_{Set,Get}.
+	Previously, FT_Face's `family_name' entry for pure CFF fontdata
+	nearly always was the fontname itself, instead of the `FamilyName'
+	entry in the CFF font (assuming there is one).
 
-2013-05-10  Werner Lemberg  <wl@gnu.org>
+	* src/cff/cffobjs.c (cff_face_init) [pure_cff]: Implement it.
 
-	[sfnt] Clean up bitmap code.
+2017-09-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	* src/sfnt/ttsbit.c: Deleted.
-	* src/sfnt/ttsbit0.c: Renamed to `ttsbit.c'.
-	* rules.mk (SFNT_DRV_H): Updated.
+	[build] Declutter Visual C++ 2010-2017 project.
 
-2013-05-10  Werner Lemberg  <wl@gnu.org>
+	* build/windows/vc2010/freetype.vcxproj: Use MaxSpeed (/02)
+	optimization for Release configuration throughout the project.
 
-	*/* [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove macro and guarded code.
 
 ----------------------------------------------------------------------------
 
-Copyright 2013-2015 by
+Copyright 2017-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.20 b/ChangeLog.20
index 6dae58e..63e3116 100644
--- a/ChangeLog.20
+++ b/ChangeLog.20
@@ -330,7 +330,7 @@
 
 2001-12-22  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
 
-	* src/pfc/pcfread.c (pcf_load_font): Handle property `POINT_SIZE'
+	* src/pcf/pcfread.c (pcf_load_font): Handle property `POINT_SIZE'
 	and fix incorrect computation of `available_sizes'.
 
 2001-12-22  David Turner  <david@freetype.org>
@@ -412,7 +412,7 @@
 	* src/cff/cffgload.h: Updated.
 	* src/cff/cffobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H.
 	(CFF_Size_Get_Globals_Funcs, CFF_Size_Done, CFF_Size_Init,
-	CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GLyphSlot_Init): New
+	CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GlyphSlot_Init): New
 	functions.
 	(CFF_Init_Face): Renamed to ...
 	(CFF_Face_Init): This.
@@ -1056,7 +1056,7 @@
 
 2001-08-30  Anthony Feik  <afeick@hotmail.com>
 
-	* src/type1/t1afm.c (T1_Read_Afm): Now correctly sets the flag
+	* src/type1/t1afm.c (T1_Read_AFM): Now correctly sets the flag
 	FT_FACE_FLAG_KERNING when appropriate for Type1 + AFM files.
 
 2001-08-25  Werner Lemberg  <wl@gnu.org>
@@ -1176,7 +1176,7 @@
 
 	* include/freetype/internal/psaux.h (PS_Table): Use FT_Offset for
 	`cursor' and `capacity'.
-	* src/psaux/psobjc.c (reallocate_t1_table): Use FT_Long for second
+	* src/psaux/psobjs.c (reallocate_t1_table): Use FT_Long for second
 	parameter.
 	(PS_Table_Add): Use FT_Offset for `new_size'.
 
@@ -1338,7 +1338,7 @@
 	(cff_compute_bias): Use `U' for constant.
 	* src/cid/cidload.c (cid_decrypt): Ditto.
 	* src/psaux/psobjs.c (T1_Decrypt): Ditto.
-	* src/psaux/t1decode.c (T1_Decoder_Parse_CharStrings): Ditto.
+	* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
 	* src/sfnt/ttload.c (TT_Load_Kern): Remove unused `version'
 	variable.
 	* src/sfnt/ttsbit.c (TT_Load_SBit_Image): Remove unused `top'
@@ -1524,7 +1524,7 @@
 
 	* src/base/ftcalc.c (FT_DivFix): Fixed a bug in the 64-bit code that
 	created incorrect scale factors!
-	(FT_Round_Fix, FT_CeilFix, FT_FloorFix): Minor improvements.
+	(FT_RoundFix, FT_CeilFix, FT_FloorFix): Minor improvements.
 
 2001-05-12  Werner Lemberg  <wl@gnu.org>
 
@@ -1710,7 +1710,7 @@
 	`FT_Err_*' with `CFF_Err_*'.
 	* src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'.
 	* src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto.
-	* src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with
+	* src/sfnt/sfobjs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with
 	`TT_Err_*'.
 	* src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto.
 	* src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c,
@@ -1730,7 +1730,7 @@
 	* src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use
 	FT_LOCAL_DEF.
 	* src/cid/cidobjs.c (CID_Done_Driver): Ditto.
-	* src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size):
+	* src/truetype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size):
 	Ditto.
 	* src/type1/t1objs.c (T1_Done_Driver): Ditto.
 	* src/pcf/pcfdriver.c (PCF_Done_Face): Ditto.
@@ -1759,7 +1759,7 @@
 
 2001-03-20  Werner Lemberg  <wl@gnu.org>
 
-	* builds/win32/detekt.mk: Fix .PHONY target for Intel compiler.
+	* builds/win32/detect.mk: Fix .PHONY target for Intel compiler.
 
 2001-03-20  David Turner  <david.turner@freetype.org>
 
@@ -2159,7 +2159,7 @@
 
 	* include/freetype/internal/t2types.h,
 	include/freetype/internal/cfftypes.h: Changed the structures for
-	CFF_Encoding and CFF_Encoding for the new implementations of the
+	CFF_Charset and CFF_Encoding for the new implementations of the
 	charset and encoding parsers in the CFF driver.
 
 	* src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode,
@@ -2338,7 +2338,7 @@
 2000-12-06  Werner Lemberg  <wl@gnu.org>
 
 	* builds/module.mk: Replaced `xxx #' with `xxx$(space).
-	* builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to
+	* builds/os2/detect.mk, builds/win32/detect.mk: Moved comment to
 	avoid trailing spaces in variable.
 	* builds/freetype.mk: Use $(D) instead of $D to make statement more
 	readable.
@@ -2412,7 +2412,7 @@
 	* builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc',
 	`setup'.
 
-2000-11-30  David Turner  <david.turner@freetype.ogr>
+2000-11-30  David Turner  <david.turner@freetype.org>
 
 	* INSTALL: Slightly updated the quick starter documentation to
 	include IDE compilation, prevent against BSD Make, and specify `make
@@ -2597,7 +2597,7 @@
 
 ----------------------------------------------------------------------------
 
-Copyright 2000-2015 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.21 b/ChangeLog.21
index a6f8be7..1adc817 100644
--- a/ChangeLog.21
+++ b/ChangeLog.21
@@ -170,7 +170,7 @@
 	FTC_CACHE_TRYLOOP_END): New macros.
 
 	* src/cache/ftccache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c
-	(ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACE_TRYLOOP_END.
+	(ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACHE_TRYLOOP_END.
 
 2005-05-23  Werner Lemberg  <wl@gnu.org>
 
@@ -327,7 +327,7 @@
 	Blaskey <listtarget@danbala.com>).
 
 	* src/sfnt/ttcmap.h (TT_CMap): Add member `unsorted'.
-	* src/sfnt/ttcmac.c: Use SFNT_Err_Ok where appropriate.
+	* src/sfnt/ttcmap.c: Use SFNT_Err_Ok where appropriate.
 
 	(tt_cmap0_validate, tt_cmap2_validate, tt_cmap6_validate,
 	tt_cmap8_validate, tt_cmap10_validate, tt_cmap12_validate): Use
@@ -571,7 +571,7 @@
 	doing anything else.  This avoids unnecessary heap allocations
 	(400KByte of heap memory for the LZW decoder).
 
-	* src/gzip/ftgzip.c (FT_Stream_OpenGZip): Ditto for the gzip
+	* src/gzip/ftgzip.c (FT_Stream_OpenGzip): Ditto for the gzip
 	decoder, although the code savings are smaller.
 
 	* docs/CHANGES: Updated.
@@ -617,7 +617,7 @@
 	`ft_get_adobe_glyph_index', a new function defined in `pstables.h'.
 	(ps_get_macintosh_name, ps_get_standard_strings): Updated.
 
-	* src/base/ftobjs.c (FT_Set_Char_Sizes): Handle fractional sizes
+	* src/base/ftobjs.c (FT_Set_Char_Size): Handle fractional sizes
 	more carefully.  This fixes Savannah bug #12263.
 
 2005-03-06  David Turner  <david@freetype.org>
@@ -756,7 +756,7 @@
 	(AF_AxisHintsRec): Add `max_segments' and `max_edges'.
 	(af_axis_hints_new_segment, af_axis_hints_new_edge): New prototypes.
 
-	* src/autofit/aflatin.c (af_latin_metricsc_scale): Don't call
+	* src/autofit/aflatin.c (af_latin_metrics_scale): Don't call
 	AF_SCALER_EQUAL_SCALES.
 	(af_latin_hints_compute_segments): Change return type to FT_Error.
 	Update all callers.
@@ -1014,7 +1014,7 @@
 	t42_parse_charstrings, t42_parse_dict): Check parser error value
 	after call to T1_Skip_PS_Token (where necessary).
 
-	* src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token,
+	* src/psaux/psobjs.c (skip_string, ps_parser_skip_PS_token,
 	ps_tobytes): Add error messages.
 
 2005-02-12  Werner Lemberg  <wl@gnu.org>
@@ -1112,7 +1112,7 @@
 	but return them as-is.
 
 	* docs/CHANGES: Mention new bitmap API.
-	* include/freetype/ftchapter.s: Updated.
+	* include/freetype/ftchapters.h: Updated.
 
 2004-12-11  Robert Clark  <freetype@ratty.org.uk>
 
@@ -1159,7 +1159,7 @@
 	(ah_test_extremum, ah_get_orientation): Removed.
 	(ah_outline_load): Use FT_Outline_Get_Orientation.
 
-	* src/base/ftsynth.c (ft_test_extrama, ft_get_orientation): Removed.
+	* src/base/ftsynth.c (ft_test_extrema, ft_get_orientation): Removed.
 	(FT_GlyphSlot_Embolden): Use FT_Outline_Get_Orientation.
 
 2004-11-23  Fernando Papa  <fpapa@netgate.com.uy>
@@ -1819,7 +1819,7 @@
 2004-08-11  Detlef Würkner  <TetiSoft@apg.lahn.de>
 
 	* src/base/ftrfork.c (FT_Raccess_Guess)
-	[!FT_CONFIG_OPTION_GUESSING_EMBEDDED_FORK]: Remove compiler
+	[!FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK]: Remove compiler
 	warnings.
 
 2004-08-06  Adam Piotrowski  <st_intel@poczta.onet.pl>
@@ -1829,7 +1829,7 @@
 
 2004-08-05  David Turner  <david@freetype.org>
 
-	`Activate' gray-scale specifing hinting within the TrueType
+	`Activate' gray-scale specifying hinting within the TrueType
 	bytecode interpreter.  This is an experimental feature which
 	should probably be made optional.
 
@@ -1839,7 +1839,7 @@
 	(TT_Load_Glyph): Here.
 	Set `grayscale' flag except for `FT_LOAD_TARGET_MONO'.
 
-	* src/truetyep/ttinterp.c (Ins_GETINFO): Return MS rasterizer
+	* src/truetype/ttinterp.c (Ins_GETINFO): Return MS rasterizer
 	version 1.7.
 	Return rotation and stretching info only if glyph is rotated or
 	stretched, respectively.
@@ -1868,7 +1868,7 @@
 	(LITTLE_ENDIAN_USHORT, LITTLE_ENDIAN_UINT): New macros.
 	(T1_Read_PFM): New function.
 	(T1_Read_Metrics): New higher-level function to be used instead of
-	T1Read_AFM.
+	T1_Read_AFM.
 	Update all callers.
 
 2004-07-31  Werner Lemberg  <wl@gnu.org>
@@ -2048,7 +2048,7 @@
 	pcf_get_metrics, pcf_get_bitmaps, pcf_get_encodings): Improve
 	debugging messages.
 
-	* src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up.
+	* src/pcf/pcfdrivr.c (FT_COMPONENT): Move up.
 	(PCF_Face_Init): Simplify code.
 
 	* src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'.
@@ -2101,7 +2101,7 @@
 
 2004-06-08  David Turner  <david@freetype.org>
 
-	* include/freetype/freetype.h (FT_GlyphMetrics): Move `lsb_delta'
+	* include/freetype/freetype.h (FT_Glyph_Metrics): Move `lsb_delta'
 	and `rsb_delta' elements to...
 	(FT_GlyphSlotRec): Here to retain binary compatibility with older
 	FreeType versions.
@@ -2116,7 +2116,7 @@
 	* include/freetype/cache/ftcmru.h (FTC_MruNode_CompareFunc): Change
 	return type to FT_Bool.
 
-	* src/cache/ftbasic.c (ftc_basic_family_compare): Change return
+	* src/cache/ftcbasic.c (ftc_basic_family_compare): Change return
 	type to FT_Bool.
 
 	* src/cache/ftccache.c (FTC_Cache_Init, ftc_cache_init): Make
@@ -2153,7 +2153,7 @@
 
 	* docs/CHANGES: Updated.
 
-2004-06-04  David Chester  <davidchester@gmx.net>
+2004-06-04  David Chester  <davidchester@qmx.net>
 
 	Improve inter-letter spacing for autohinted glyphs.
 
@@ -2289,7 +2289,7 @@
 
 	* src/cff/cffgload.h (CFF_Builder): Remove `error'.
 	* src/cff/cffgload.c (cff_decoder_parse_charstrings): Replace
-	`Memory_Error' with `Fail' und update all users.
+	`Memory_Error' with `Fail' and update all users.
 
 2004-05-11  Werner Lemberg  <wl@gnu.org>
 
@@ -2528,7 +2528,7 @@
 	* src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
 	ttgxvar.h.
 	(TT_Process_Simple_Glyph, load_truetype_glyph)
-	[TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Support GX var fonts.
 
 	* src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
 	ttgxvar.h.
@@ -2864,7 +2864,7 @@
 	(psh_blues_snap_stem): Don't use blue_shift but blue_threshold.
 
 	* src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro.
-	(psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM.
+	(psh_glyph_find_strong_points): Use PSH_STRONG_THRESHOLD_MAXIMUM.
 	(psh_glyph_find_blue_points): New function.  Needed for fonts like
 	p052003l.pfb (URW Palladio L Roman) which have flex curves at the
 	base line within blue zones, but the flex curves aren't covered by
@@ -2899,7 +2899,7 @@
 	Improve MacOS fond support.  Provide a new API
 	`FT_New_Face_From_FSSpec' similar to `FT_New_Face'.
 
-	* src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h.
+	* src/base/ftmac.c [__MWERKS__]: Include FSp_fopen.h.
 	STREAM_FILE [__MWERKS__]: New macro.
 	(ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions.
 	(file_spec_from_path) [__MWERKS__]: Updated #if statement.
@@ -3331,7 +3331,7 @@
 
 	* src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap
 	Info service function if the cmap comes from sfnt.  Return 0 if the
-	cmap is sythesized in cff module.
+	cmap is synthesized in cff module.
 
 2004-01-20  David Turner  <david@freetype.org>
 
@@ -3361,7 +3361,7 @@
 
 	* src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H.
 	(FT_Outline_GetOutsideBorder): Inverse result.
-	(FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New
+	(FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New
 	functions.
 	(FT_Stroker_EndSubPath): Close path if needed.
 	(FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind.
@@ -3460,7 +3460,7 @@
 
 2003-12-25  Werner Lemberg  <wl@gnu.org>
 
-	* src/base/fttrigon.c, src/base/ftgloadr.c: Inlude
+	* src/base/fttrigon.c, src/base/ftgloadr.c: Include
 	FT_INTERNAL_OBJECTS_H.
 
 	* src/base/ftstroke.c (FT_Outline_GetInsideBorder,
@@ -3493,8 +3493,8 @@
 2003-12-23  David Turner  <david@freetype.org>
 
 	* include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND,
-	FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros.  They
-	are used to avoid compiler warnings with very pedantic compilers.
+	FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_PIX_CEIL): New macros.
+	They are used to avoid compiler warnings with very pedantic compilers.
 	Note that `(x) & -64' causes a warning if (x) is not signed.  Use
 	`(x) & ~63' instead!
 	Updated all related code.
@@ -3539,7 +3539,7 @@
 	src/cache/ftcsbits.c,
 	src/cache/ftccmap.c,
 	src/cache/ftcbasic.c (added),
-	src/cache/ftclru.c (removed):
+	src/cache/ftlru.c (removed):
 
 	  *Complete* rewrite of the cache sub-system to `solve' the
 	  following points:
@@ -4010,7 +4010,7 @@
 	* src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't
 	include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly.
 
-	* src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
+	* src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
 	(cid_ps_get_font_info): New function.
 	(cid_service_ps_info): New service.
 	(cid_services): Updated.
@@ -4119,7 +4119,7 @@
 	(fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty,
 	_num_bdf_properties), src/gzip/infutil.c (inflate_mask),
 	src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td),
-	src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c
+	src/gzip/inftrees.h (inflate_trees_fixed), src/gzip/inftrees.c
 	(inflate_trees_fixed): Decorate with more `const' to avoid
 	writable global variables which are disallowed on ARM.
 
@@ -4231,7 +4231,7 @@
 	(t42_parse_encoding): Use `ft_isdigit'.
 
 
-	* src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if
+	* src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_Ok if
 	success.
 
 2003-10-05  Werner Lemberg  <wl@gnu.org>
@@ -4355,7 +4355,7 @@
 	new POSTSCRIPT_NAMES service.
 	* src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode,
 	t1_decode_init): Use new POSTSCRIPT_NAMES service.
-	* src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include
+	* src/psaux/t1cmap.h, src/psaux/t1decode.h: Don't include
 	FT_INTERNAL_POSTSCRIPT_NAMES_H.
 
 	* src/psnames/psmodule.c:  Don't include
@@ -4659,7 +4659,7 @@
 
 	* src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H,
 	FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H.
-	(t42_service_glyph_dict, t42_service_ps_name): New strucures
+	(t42_service_glyph_dict, t42_service_ps_name): New structures
 	providing Type 42 services.
 	(t42_services): New services list.
 	(T42_Get_Interface): Use `ft_service_list_lookup'.
@@ -4683,7 +4683,7 @@
 	(gindex,gindex).
 
 	* src/base/ftpfr.c (ft_pfr_check): Fix serious typo.
-	* src/pfr/prfload.c: Remove dead code.
+	* src/pfr/pfrload.c: Remove dead code.
 	(pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs):
 	New functions.
 	(pfr_phy_font_done): Free `kern_pairs'.
@@ -4749,8 +4749,7 @@
 	* include/freetype/ttunpat.h: Fixing documentation comment.
 
 	* include/freetype/config/ftoption.h, devel/ftoption.h
-	(TT_CONFIG_OPTION_OPTION_COMPILE_UNPATENTED_HINTING): Replaced
-	with...
+	(TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING): Replaced with...
 	(TT_CONFIG_OPTION_UNPATENTED_HINTING): This.  Updated all users.
 	(TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): Removed.
 
@@ -5024,7 +5023,7 @@
 	drivers.
 
 	* src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code.
-	(FT_Set_Pixel_Size): Assign value to `metrics' after validation of
+	(FT_Set_Pixel_Sizes): Assign value to `metrics' after validation of
 	arguments.
 
 2003-06-20  Werner Lemberg  <wl@gnu.org>
@@ -5116,7 +5115,7 @@
 	ft_glyph_bbox_subpixels, ft_glyph_bbox_gridfit,
 	ft_glyph_bbox_truncate, ft_glyph_bbox_pixels): Replaced with
 	FT_GLYPH_BBOX_UNSCALED, FT_GLYPH_BBOX_SUBPIXELS,
-	FT_GLYPH_BBIX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS.
+	FT_GLYPH_BBOX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS.
 	The lowercase variants are now (deprecated aliases) to the uppercase
 	versions.
 	Updated all other files.
@@ -5200,7 +5199,7 @@
 	* src/cid/cidload.c (cid_load_keyword): Handle
 	T1_FIELD_LOCATION_BBOX.
 	(parse_font_bbox): Commented out.
-	(cid_field_record): Comment out element for parsing FontBBox.
+	(cid_field_records): Comment out element for parsing FontBBox.
 
 	* src/type42/t42parse.c (t42_parse_font_bbox): Commented out.
 	(t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with
@@ -5346,7 +5345,7 @@
 	* src/cff/cffload (cff_subfont_load): Fix default values of
 	expansion_factor and blue_scale.
 
-	* src/cif/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000
+	* src/cid/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000
 	for blue_scale.
 
 	* src/pshinter/pshglob.c (psh_globals_new): Fix default value of
@@ -5569,7 +5568,7 @@
 	* src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c
 	(PCF_Face_Init): Test for charset registry case-insensitively.
 
-	* src/gzip/ftgzip.c (ft_gzip_fil_io): Revert change from yesterday;
+	* src/gzip/ftgzip.c (ft_gzip_file_io): Revert change from yesterday;
 	it has already been fixed differently.
 
 	* src/truetype/ttinterp.c (DO_SFVTL): Add missing braces around
@@ -5706,7 +5705,7 @@
 	(ah_outline_compute_edges): Scale `edge_distance_threshold' down
 	after rounding instead of scaling comparison value in loop.
 
-	* src/autohint/ahhint.c (ah_hinter_align_stong_points): Provide
+	* src/autohint/ahhint.c (ah_hinter_align_strong_points): Provide
 	alternative code which runs faster.
 	Handle `before->scale == 0'.
 
@@ -5916,7 +5915,7 @@
 2003-04-23  Werner Lemberg  <wl@gnu.org>
 
 	* src/pfr/pfrload.c (pfr_extra_item_load_font_id): Use FT_PtrDist
-	instead of FT_Uint for `len'.
+	instead of FT_UInt for `len'.
 
 2003-04-22  Werner Lemberg  <wl@gnu.org>
 
@@ -5960,7 +5959,7 @@
 
 2003-03-27  David Turner  <david@freetype.org>
 
-	* README: Udpated.
+	* README: Updated.
 
 	* README.UNX: Removed (now replaced by docs/INSTALL.UNX).
 
@@ -6275,7 +6274,7 @@
 	(bdf_driver_class): Use `bdf_driver_requester'.
 
 	* src/pcf/pcfdrivr.c: Include FT_BDF_H.
-	(pcf_get_bdf_property, pdc_driver_requester): New functions
+	(pcf_get_bdf_property, pcf_driver_requester): New functions
 	(pcf_driver_class): Use `pcf_driver_requester'.
 
 	* src/pcf/pcfread.c: Include `pcfread.h'.
@@ -6547,10 +6546,10 @@
 
 2002-11-07  David Turner  <david@freetype.org>
 
-	* src/cache/ftcsbit.c (ftc_sbit_node_load): Fixed a small bug that
+	* src/cache/ftcsbits.c (ftc_sbit_node_load): Fixed a small bug that
 	caused problems with embedded bitmaps.
 
-	* src/otlayout/otlayout.h, src/otlyaout/otlconf.h,
+	* src/otlayout/otlayout.h, src/otlayout/otlconf.h,
 	src/otlayout/otlgsub.c, src/otlayout/otlgsub.h,
 	src/otlayout/otlparse.c, src/otlayout/otlparse.h,
 	src/otlayout/otlutils.h: Updating the OpenType Layout code, adding
@@ -6608,7 +6607,7 @@
 
 2002-11-01  David Turner  <david@freetype.org>
 
-	Added PFR-specific public API.  Fixed the kerning retrievel routine
+	Added PFR-specific public API.  Fixed the kerning retrieval routine
 	(it returned invalid values when the outline and metrics resolution
 	differ).
 
@@ -6695,7 +6694,7 @@
 	* src/pfr/pfrgload.c: Include `pfrsbit.h'.
 	* src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten.
 	(pfr_phy_font_done, pfr_phy_font_load): Updated.
-	* src/pfr/pfrobks.c: Include `pfrsbit.h'.
+	* src/pfr/pfrobjs.c: Include `pfrsbit.h'.
 	(pfr_face_init): Handle kerning and embedded bitmaps.
 	(pfr_slot_load): Load embedded bitmaps.
 	(PFR_KERN_INDEX): Removed.
@@ -6973,7 +6972,7 @@
 
 	* src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points),
 	src/pshinter/pshalgo3.c (psh3_glyph_find_strong_points): Adding fix
-	to prevent seg fault when hints are provided in an empty glyph.
+	to prevent segfault when hints are provided in an empty glyph.
 
 	* src/cache/ftccache.i (GEN_CACHE_LOOKUP) [FT_DEBUG_LEVEL_ERROR]:
 	Removed conditional code.  This fixes a bug that prevented
@@ -6996,7 +6995,7 @@
 
 2002-09-08  David Turner  <david@freetype.org>
 
-	Various updates to correctly support sub-pixel rendering.
+	Various updates to correctly support subpixel rendering.
 
 	* include/freetype/config/ftmodule.h: Add two renderers for LCD.
 
@@ -7032,7 +7031,7 @@
 	(FTC_Image_Cache_Lookup): This function.
 	(ftc_image_family_init): Updated.
 
-	* src/cache/ftcsbit.c (FTC_SBitQueryRec, FTC_SBitFamilyRec):
+	* src/cache/ftcsbits.c (FTC_SBitQueryRec, FTC_SBitFamilyRec):
 	Updated.
 	(ftc_sbit_node_load): Updated.
 	Moved code to convert type flags to load flags to...
@@ -7155,7 +7154,7 @@
 	to ...
 	(FT_Glyph_{Init,Done,Transform,GetBBox,Copy,Prepare}Func): This.
 	(FTRenderer_{render,transform,getCBox,setMode}): Renamed to ...
-	(FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SeteModeFunc}):
+	(FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SetModeFunc}):
 	This.
 
 	Updated all affected code.
@@ -7239,7 +7238,7 @@
 	(ft_smooth_render, ft_smooth_render_lcd, ft_smooth_render_lcd_v):
 	New functions.
 
-	(ft_smooth_locd_renderer_class, ft_smooth_lcdv_renderer_class): New
+	(ft_smooth_lcd_renderer_class, ft_smooth_lcdv_renderer_class): New
 	classes.
 
 	* src/truetype/ttobjs.c (TT_{Done,New}_GlyphZone): Renamed to...
@@ -7376,7 +7375,7 @@
 
 	* src/pcf/pcfdriver.c (PCF_Glyph_Load): Fix computation of
 	horiBearingX.
-	* src/bdf/bdfdrivr.c (BDF_GlyphLoad): Fix computation of
+	* src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix computation of
 	horiBearingY.
 
 2002-08-16  George Williams  <gww@silcom.com>
@@ -7556,7 +7555,7 @@
 	Get glyph offset.
 
 	* src/truetype/ttobjs.c (TT_Face_Init)
-	[FT_CONFIG_OPTION_INCOREMENTAL]: Added the incremental loading
+	[FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading
 	system for the TrueType driver.
 
 	* src/cid/cidgload.c (cid_load_glyph)
@@ -7581,7 +7580,7 @@
 
 	* include/freetype/cache/ftccache.h, src/cache/ftccache.i,
 	src/cache/ftccache.c [!FTC_CACHE_USE_LINEAR_HASHING]: Removed.
-	(FTC_CACHE_USE_LINEAR_HASHING: Removed also.
+	(FTC_CACHE_USE_LINEAR_HASHING): Removed also.
 
 	FT_CONFIG_OPTION_USE_CMAPS is now the default.
 
@@ -7603,7 +7602,7 @@
 
 	* src/cid/cidriver.c (Cid_Get_Char_Index, Cid_Get_Next_Char):
 	Removed.
-	(t1_cid_driver_class): Updated.
+	(t1cid_driver_class): Updated.
 	* src/truetype/ttdriver.c (tt_driver_class): Updated.
 	* src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Removed
 	(t1_driver_class): Updated.
@@ -7698,7 +7697,7 @@
 	  CFF_Done_SubFont -> cff_subfont_done
 	  CFF_Load_Font -> cff_font_load
 	  CFF_Done_Font -> cff_font_done
-	  CFF_Size_Get_Global_Funcs -> cff_size_get_global_funcs
+	  CFF_Size_Get_Globals_Funcs -> cff_size_get_globals_funcs
 	  CFF_Size_Done -> cff_size_done
 	  CFF_Size_Init -> cff_size_init
 	  CFF_Size_Reset -> cff_size_reset
@@ -7897,7 +7896,7 @@
 
 2002-06-21  Sven Neumann  <sven@convergence.de>
 
-	* src/prf/pfrtypes.h (PFR_KernPair): New structure.
+	* src/pfr/pfrtypes.h (PFR_KernPair): New structure.
 	(PFR_PhyFont): Use it.
 	(PFR_KernFlags): New enumeration.
 	* src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): New
@@ -8245,7 +8244,7 @@
 	`fttype1.c' in src/base.
 
 	* src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that
-	prevented family blue zones substitution from hapenning correctly.
+	prevented family blue zones substitution from happening correctly.
 
 	* include/freetype/ftbdf.h FT_Get_BDF_Charset_ID): Adding
 	documentation comment.
@@ -8622,7 +8621,7 @@
 
 2002-04-19  Werner Lemberg  <wl@gnu.org>
 
-	* src/pfr/pfrload.c (pfr_extra_items_farse): Fix debug message.
+	* src/pfr/pfrload.c (pfr_extra_items_parse): Fix debug message.
 	(pfr_phy_font_load): s/size/Size/ for local variable to avoid
 	compiler warning.
 	* src/pfr/pfrobjs.c (pfr_face_init): Fix debug message.
@@ -8636,7 +8635,7 @@
 	src/pfr/*: New files.
 
 	* include/freetype/config/ftmodule.h,
-	include/freetype/internal/fttrace.h, src/Jamefile: Updated.
+	include/freetype/internal/fttrace.h, src/Jamfile: Updated.
 
 	* src/type1/t1gload.h (T1_Load_Glyph), src/type1/t1gload.c
 	(T1_Load_Glyph): Fixed incorrect parameter sign-ness in callback
@@ -8676,7 +8675,7 @@
 
 2002-04-16  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
 
-	* src/pcf/pcfread (pcf_get_accell): Fix parsing of accelerator
+	* src/pcf/pcfread.c (pcf_get_accel): Fix parsing of accelerator
 	tables.
 
 2002-04-15  David Turner  <david@freetype.org>
@@ -8716,7 +8715,7 @@
 
 	src/cache/ftcimage.c, src/cache/ftcsbits.c,
 
-	src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
+	src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffobjs.c,
 
 	src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
 
@@ -9063,12 +9062,12 @@
 	  FT_Glyph_Name_Requester => FT_Face_GetGlyphNameFunc
 	  FT_Name_Index_Requester => FT_Face_GetGlyphNameIndexFunc
 
-	* src/base/ftapi.c: New file.  It contains backwards compatibility
+	* src/base/ftapi.c: New file.  It contains backward compatibility
 	functions.
 
 	* include/freetype/internal/psaux.h, src/cid/cidload.c,
 	src/cidtoken.h, src/psaux/psobjs.c, src/psaux/psobjs.h,
-	src/psaux/t1decode.c, stc/type1/t1load.c, src/type1/t1tokens.h:
+	src/psaux/t1decode.c, src/type1/t1load.c, src/type1/t1tokens.h:
 	Updated common PostScript type definitions.
 	Renamed all enumeration values like to uppercase variants:
 
@@ -9076,7 +9075,7 @@
 	  t1_field_cid_info => T1_FIELD_LOCATION_CID_INFO
 	  etc.
 
-	* include/freetype/internal/psglobals.h: Removed.
+	* include/freetype/internal/psglobal.h: Removed.
 	* include/freetype/internal/pshints.h, src/pshinter/pshglob.h:
 	Updated.
 
@@ -9106,7 +9105,7 @@
 	FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
 	* src/base/ftcalc.c (FT_MulFix): Ditto.
 	* src/cff/cffdrivr.c (cff_get_name_index): Ditto.
-	* src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
+	* src/cff/cffobjs.c (CFF_Size_Get_Globals_Funcs, CFF_Size_Init,
 	CFF_GlyphSlot_Init): Ditto.
 	* src/cid/cidobjs.c (CID_GlyphSlot_Init,
 	CID_Size_Get_Globals_Funcs): Ditto.
@@ -9247,7 +9246,7 @@
 	  {
 	  } PS_StructRec, *PS_Struct;
 
-	  typedef PS_StructRec  T1_Struct;  /* backwards-compatibility */
+	  typedef PS_StructRec  T1_Struct;  /* backward compatibility */
 
 	Hence, we increase the coherency of the source code by effectively
 	using the `Rec' prefix for structure types.
@@ -9384,7 +9383,7 @@
 	* src/pcf/pcfread.c (pcf_seek_to_table_type): Ditto.
 	* src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto.
 	(pcf_get_bitmaps): The same for `sizebitmaps'.
-	* src/psaux/t1decode.c (T1_Decode_Parse_Charstrings): The same for
+	* src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): The same for
 	`orig_y'.
 	(t1operator_seac): Comment out more dead code.
 	* src/pshinter/pshalgo2.c (ps2_hints_apply): Add `DEBUG_HINTER'
@@ -9423,7 +9422,7 @@
 
 ----------------------------------------------------------------------------
 
-Copyright 2002-2015 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.22 b/ChangeLog.22
index 08c5877..4517c32 100644
--- a/ChangeLog.22
+++ b/ChangeLog.22
@@ -189,7 +189,7 @@
 
 	* src/base/ftdbgmem.c (_ft_debug_file, _ft_debug_lineno)
 	[FT_DEBUG_MEMORY]: New global variables, replacing...
-	(FT_MemTable_Rec) [FT_DEBUG_MEMORY]: Remove `filename' and
+	(FT_MemTableRec) [FT_DEBUG_MEMORY]: Remove `filename' and
 	`line_no'.  Update all callers.
 	(ft_mem_debug_alloc) [FT_DEBUG_MEMORY]: Avoid possible integer
 	overflow.
@@ -260,7 +260,7 @@
 2006-04-26  Werner Lemberg  <wl@gnu.org>
 
 	* src/psaux/psobjs.c (shift_elements): Don't use FT_Long but
-	FT_PtrDiff for `delta'.  Reported by Céline PILLET
+	FT_PtrDist for `delta'.  Reported by Céline PILLET
 	<Celine.Pillet@Tagginfo.com>.
 
 2006-04-21  David Turner  <david@freetype.org>
@@ -352,7 +352,7 @@
 	* src/tools/docmaker/sources.py (re_bold, re_italic): Accept "'"
 	also.
 
-2006-03-23  David Turner <david@freetype.org>
+2006-03-23  David Turner  <david@freetype.org>
 
 	Add FT_Get_SubGlyph_Info API to retrieve subglyph data.  Note that
 	we do not expose the FT_SubGlyphRec structure.
@@ -360,7 +360,7 @@
 	* include/freetype/internal/ftgloadr.h (FT_SUBGLYPH_FLAGS_*): Moved
 	to...
 	* include/freetype/freetype.h (FT_SUBGLYPH_FLAGS_*): Here.
-	(FT_Get_SybGlyph_Info): New declaration.
+	(FT_Get_SubGlyph_Info): New declaration.
 
 	* src/base/ftobjs.c (FT_Get_SubGlyph_Info): New function.
 
@@ -387,10 +387,10 @@
 	(FTC_INode_Weight): Commented out.
 	* src/cache/ftcimage.h: Updated.
 
-	* src/cache/ftmanag.c (FTC_Manager_Compress,
+	* src/cache/ftcmanag.c (FTC_Manager_Compress,
 	FTC_Manager_RegisterCache, FTC_Manager_FlushN):
 	s/FT_EXPORT/FT_LOCAL/.
-	* src/cache/ftmanag.h: Updated.
+	* src/cache/ftcmanag.h: Updated.
 
 	* src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
 	FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
@@ -494,7 +494,7 @@
 	FTC_MruList_Init, FTC_MruList_Reset, FTC_MruList_Done,
 	FTC_MruList_New, FTC_MruList_Remove, FTC_MruList_RemoveSelection):
 	Declare as FT_LOCAL_DEF.
-	(FTC_MruListFind, FTC_MruList_Lookup) [!FTC_INLINE]: Compile
+	(FTC_MruList_Find, FTC_MruList_Lookup) [!FTC_INLINE]: Compile
 	conditionally.
 	Declare as FT_LOCAL_DEF.
 
@@ -605,14 +605,14 @@
 
 	* docs/release: Minor additions and clarifications.
 
-	* docs/CHANGES: Updated to reflect many fixes for backwards
+	* docs/CHANGES: Updated to reflect many fixes for backward
 	compatibility.  Still incomplete.
 
 2006-02-26  David Turner  <david@freetype.org>
 
 	* src/base/ftobjs.c (ft_recompute_scaled_metrics): Re-enable
 	conservative rounding of metrics to avoid breaking clients like
-	Pango (see http://bugzilla.gnome.org/show_bug.cgi?id=327852).
+	Pango (see https://bugzilla.gnome.org/show_bug.cgi?id=327852).
 
 2006-02-25  Werner Lemberg  <wl@gnu.org>
 
@@ -814,7 +814,7 @@
 	* include/freetype/ftcache.h (FTC_IMAGE_TYPE_COMPARE,
 	FTC_IMAGE_TYPE_HASH), src/cache/ftcbasic.c (FTC_OldFontRec,
 	FTC_OldImageDescRec, FTC_ImageCache_Lookup, FTC_Image_Cache_New,
-	FTC_OldImage_Desc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx,
+	FTC_OldImageDesc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx,
 	ftc_image_type_from_old_desc, FTC_Image_Cache_Lookup,
 	FTC_SBitCache_Lookup, FTC_SBit_Cache_New, FTC_SBit_Cache_Lookup)
 	[FT_CONFIG_OPTION_OLD_INTERNALS]: Try to revive old functions of the
@@ -934,7 +934,7 @@
 	* include/freetype/freetype.h (FT_GlyphSlotRec): Improve
 	documentation of `outline' field.
 
-	* src/sfnt/sfobjc.s: Inckude FT_INTERNAL_DEBUG_H.
+	* src/sfnt/sfobjs.c: Include FT_INTERNAL_DEBUG_H.
 	* src/sfnt/sfdriver.c: Include ttmtx.h.
 
 	* src/autofit/afcjk.c: Include aftypes.h and aflatin.h.
@@ -1630,8 +1630,8 @@
 
 	* include/freetype/internal/t1types.h (T1_FaceRec): Updated.
 
-	* src/psaux/t1cmap.h (T1_CmapStdRec): Updated.
-	(T1_CmapUnicode, T1_CmapUnicodeRec): Removed.
+	* src/psaux/t1cmap.h (T1_CMapStdRec): Updated.
+	(T1_CMapUnicode, T1_CMapUnicodeRec): Removed.
 
 	* src/psaux/t1cmap.c (t1_get_glyph_name): New callback function.
 	(t1_cmap_unicode_init, t1_cmap_unicode_done,
@@ -1781,7 +1781,7 @@
 	Note that this doesn't force auto-hinting for all fonts, however.
 
 	* src/autofit/afhints.c (af_glyph_hints_reload): Don't set
-	scaler_fiags here but...
+	scaler_flags here but...
 	(af_glyph_hints_rescale): Here.
 
 	* src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal
@@ -1813,7 +1813,7 @@
 	[TT_CONFIG_OPTION_BDF]: New structure.
 	(TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'.
 
-	* include/freetype/ttags.h (TTAG_BDF): New macro.
+	* include/freetype/tttags.h (TTAG_BDF): New macro.
 
 	* src/sfnt/Jamfile (_sources): Add ttbdf.
 
@@ -1835,7 +1835,7 @@
 
 2005-12-07  Werner Lemberg  <wl@gnu.org>
 
-	* src/sfnt/sfobjc.c (sfnt_init_face): Move tag check to...
+	* src/sfnt/sfobjs.c (sfnt_init_face): Move tag check to...
 	* src/sfnt/ttload.c (sfnt_init): Here, before handling TTCs.
 
 2005-12-06  Chia-I Wu  <b90201047@ntu.edu.tw>
@@ -1962,7 +1962,7 @@
 
 	* docs/CHANGES: Mention scaling bug.
 
-2005-11-18  susuzki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+2005-11-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* include/freetype/ftgxval.h, src/base/ftgxval.c
 	(FT_TrueTypeGX_Free, FT_ClassicKern_Free): New functions to free
@@ -2311,16 +2311,16 @@
 	CJK font).  A SING Glyphlet Font is an OpenType font that contains
 	the outline(s), either in a `glyf' or `CFF' table, for a glyph;
 	`cmap', `BASE', and `GSUB' tables are present with the same format
-	and functionaliy as a regular OpenType font; there are no `name',
+	and functionality as a regular OpenType font; there are no `name',
 	`head', `OS/2', and `post' tables; there are two new tables, `SING'
 	which contains details about the glyphlet, and `META' which contains
 	metadata.
 
 	Further information on the SING Glyphlet format can be found at:
 
-	  http://www.adobe.com/products/indesign/sing_gaiji.html
+	  https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf
 
-	* include/freetype/ttags.h (TTAG_SING, TTAG_META): New macros for
+	* include/freetype/tttags.h (TTAG_SING, TTAG_META): New macros for
 	the OpenType tables `SING' and `META'.  These two tables are used in
 	SING Glyphlet Format fonts.
 
@@ -2371,7 +2371,7 @@
 	(gxv_kern_subtable_fmt1_valueTable_load,
 	gxv_kern_subtable_fmt1_subtable_setup,
 	gxv_kern_subtable_fmt1_entry_validate): Fix C++ compiler errors.
-	(gxv_kern_coverage_validate): Use KERN_DIALECT_UNKWOWN.
+	(gxv_kern_coverage_validate): Use KERN_DIALECT_UNKNOWN.
 	Improve trace message.
 	(gxv_kern_validate_generic): Fix C++ compiler error.
 	Improve trace message.
@@ -2458,8 +2458,8 @@
 
 	* src/gxvalid/gxvbsln.c (GXV_BSLN_VALUE_EMPTY): Add `U'.
 
-	* src/gxvalid/gxmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE),
-	src/gxvalid/gxmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix
+	* src/gxvalid/gxvmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE),
+	src/gxvalid/gxvmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix
 	typo.
 
 	* src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c,
@@ -2787,7 +2787,7 @@
 2005-06-15  Kirill Smelkov  <kirr@mns.spb.ru>
 
 	The next release will be 2.2.0, so don't worry about source code
-	backwards compatibility.
+	backward compatibility.
 
 	* include/freetype/ftimage.h (FT_Outline_MoveToFunc,
 	FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
@@ -2821,7 +2821,7 @@
 
 ----------------------------------------------------------------------------
 
-Copyright 2005-2015 by
+Copyright 2005-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.23 b/ChangeLog.23
index 93fd33c..85253f1 100644
--- a/ChangeLog.23
+++ b/ChangeLog.23
@@ -43,7 +43,7 @@
 	* src/base/ftoutln.c (FT_Outline_New_Internal): The length of
 	FT_Outline->points[] should be numPoints, not 2 * numPoints.
 	Found by Paul Messmer, see
-	http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html
+	https://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html
 
 2010-02-10  Ken Sharp  <ken.sharp@artifex.com>
 
@@ -108,7 +108,7 @@
 	Preferred family names should be used for legacy systems that
 	can hold only a few faces (<= 4) for a family name. Suggested by
 	Andreas Heinrich.
-	http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html
+	https://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html
 
 	* include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
 	FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define.
@@ -139,7 +139,7 @@
 	Fix compilation warning.
 
 	* src/base/ftbase.h: s/LOCAL_DEF/LOCAL/.
-	* src/base/ftobjc.s: Include ftbase.h conditionally.
+	* src/base/ftobjs.c: Include ftbase.h conditionally.
 
 2010-01-11  Kwang Yul Seo  <skyul@company100.net>
 
@@ -197,7 +197,7 @@
 	Fix Savannah bug #28395.
 
 	* src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c
-	(T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface
+	(T1_Load_Glyph): Don't check `num_glyphs' if incremental interface
 	is used.
 
 2010-01-05  Ken Sharp  <ken.sharp@artifex.com>
@@ -607,7 +607,7 @@
 	(ft_black_render): Initialize `worker->gray_lines' (problem found by
 	valgrind).
 
-	(FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just
+	(FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Don't #undef, just
 	comment out.
 
 2009-09-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
@@ -631,7 +631,7 @@
 	The issue of incompatible cast between unsigned long and void*
 	on LLP64 platform is reported by NightStrike from MinGW-Win64
 	project.  See
-	http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+	https://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
 
 	* src/bdf/bdf.h: The type of hashnode->data is changed from
 	void* to size_t.
@@ -655,9 +655,9 @@
 	[Win64] Improve the computation of random seed from stack address.
 
 	On LLP64 platform, the conversion from pointer to FT_Fixed need
-	to drop higher 32-bit.  Explict casts are required. Reported by
+	to drop higher 32-bit.  Explicit casts are required. Reported by
 	NightStrike from MinGW-w64 project.  See
-	http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+	https://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
 
 	* src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly.
 
@@ -671,7 +671,7 @@
 	* src/raster/rules.mk: Don't handle ftmisc.h.  It is needed for
 	stand-alone mode only.
 
-	* src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func,
+	* src/raster/ftmisc.h (FT_MemoryRec, FT_Alloc_Func, FT_Free_Func,
 	FT_Realloc_Func): Copy declarations from ftsystem.h.
 
 2009-09-02  Bram Tassyns  <bramt@enfocus.be>
@@ -864,7 +864,7 @@
 		LP64 systems: Higher bits are not used.
 		16-bit systems: Drop can occur.
 	See
-	http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html
+	https://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html
 	These functions will be refined to take FT_ULong flags in
 	next bump with incompatible API change.
 
@@ -891,7 +891,7 @@
 	pcf: Fix a comparison between FT_Long and FT_ULong.
 
 	* src/pcf/pcfread.c (pcf_get_bitmaps): Return an error
-	if PCF_Face->nemetrics is negative.
+	if PCF_Face->nmetrics is negative.
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -929,7 +929,7 @@
 	type1: Fix a data type mismatching with its source.
 
 	* include/freetype/internal/t1types.h: The type of
-	T1_Face->buildchar is matched with T1_Decorder->top.
+	T1_Face->buildchar is matched with T1_Decoder->top.
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -944,7 +944,7 @@
 
 	pfr: Fix a data type mismatching with its source.
 
-	* src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset
+	* src/pfr/pfrtypes.h: The type of PFR_PhyFont->chars_offset
 	is extended from FT_UInt32 to FT_Offset, because it is
 	calculated with the pointer difference in pfr_phy_font_load().
 
@@ -975,8 +975,8 @@
 	psaux: Fix a data type mismatching with its source.
 
 	* include/freetype/internal/psaux.h: The type of
-	T1_DecorderRec.buildchar is matched with
-	T1_DecorderRec.top.
+	T1_DecoderRec.buildchar is matched with
+	T1_DecoderRec.top.
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -1150,7 +1150,7 @@
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
-	cache: Insert explict casts for LP64 systems.
+	cache: Insert explicit casts for LP64 systems.
 
 	* src/cache/ftcbasic.c (FTC_ImageCache_Lookup,
 	FTC_SBitCache_Lookup): The type of FTC_ImageType->width
@@ -1409,7 +1409,7 @@
 
 	base: Prevent some overflows on LP64 systems.
 
-	* src/base/ftadvance.c (FT_Get_Advances): Cast the
+	* src/base/ftadvanc.c (FT_Get_Advances): Cast the
 	unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32
 	for LP64 platforms.
 
@@ -1499,7 +1499,7 @@
 
 	bdf: Fix some data types mismatching with their sources.
 
-	* src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type
+	* src/bdf/bdfdrivr.c (bdf_cmap_char_index): The type
 	of `code' is matched with BDF_encoding_el->enc.
 	(bdf_cmap_char_next): The type of `charcode' is
 	matched with BDF_encoding_el->enc.  When *acharcode
@@ -1545,7 +1545,7 @@
 	* src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude
 	the legacy behaviour from 16-bit platform, because the
 	current hack cannot detect the caller uses this function
-	via legacy convension.
+	via legacy convention.
 	(FTC_SBitCache_Lookup): Ditto.
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
@@ -1585,7 +1585,7 @@
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
-	fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly.
+	fttypes.h: Cast FT_MAKE_TAG output to FT_Tag explicitly.
 
 	* include/freetype/fttypes.h (FT_MAKE_TAG):
 	Cast the result to FT_Tag.
@@ -1687,7 +1687,7 @@
 	sfnt: Count the size of the memory object by ptrdiff_t.
 
 	* src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of
-	`peroperty_len' is changed from FT_UInt to FT_Offset,
+	`property_len' is changed from FT_UInt to FT_Offset,
 	to match with size_t, which is appropriate type for the
 	object in the memory buffer.
 
@@ -1765,7 +1765,7 @@
 	ftgzip.c by FT2 are enabled by default.  To use
 	zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC.
 	See discussion:
-	http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html
+	https://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -1904,7 +1904,7 @@
 2009-07-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	Borland C++ compiler patch proposed by Mirco Babin.
-	http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html.
+	https://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html.
 
 	* builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}.
 	Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform
@@ -1929,7 +1929,7 @@
 	* src/tools/chktrcmp.py: A script to check trace_XXXX macros
 	that are used in C source but undefined in fttrace.h, or
 	defined in fttrace.h but unused in C sources.  See
-	http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html.
+	https://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html.
 	* docs/DEBUG: Mention on chktrcmp.py.
 	* docs/release: Ditto.
 
@@ -1961,7 +1961,7 @@
 
 	* include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm )
 	and FT_TRACE_DEF( ttbdf ).  See
-	http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html
+	https://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html
 
 2009-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -1975,8 +1975,8 @@
 
 	Prevent the overflows by a glyph with too many points or contours.
 	The bug is reported by Boris Letocha <b.letocha@gmc.net>.  See
-	http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html
-	http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html	
+	https://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html
+	https://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html	
 
 	* include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX,
 	FT_OUTLINE_POINTS_MAX): New macros to declare the maximum
@@ -2001,7 +2001,7 @@
 2009-06-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	ftpatent: Fix a bug by wrong usage of service->table_info().
-	http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html
+	https://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html
 
 	* include/freetype/internal/services/svsfnt.h: Extend
 	FT_SFNT_TableInfoFunc() to take new argument to obtain the offset
@@ -2069,7 +2069,7 @@
 
 	* builds/unix/configure.raw: Fix a bug in sed script to extract
 	native suffix for binary executables, patch by Peter Breitenlohner.
-	http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html
+	https://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html
 
 2009-06-26  Werner Lemberg  <wl@gnu.org>
 
@@ -2122,10 +2122,10 @@
 	Use 16.16 format everywhere (except for large integers followed by a
 	`div').
 	[CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate
-	code uncoditionally.
+	code unconditionally.
 	Add support for random numbers and update remaining code
 	accordingly; this should work now.
-	(t1_operator_seac): Updated.
+	(t1operator_seac): Updated.
 	* src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H.
 	(ps_hints_t1stem3, t1_hints_stem): Updated.
 
@@ -2479,7 +2479,7 @@
 	af_latin_script_class struct will have function to init it instead of
 	being allocated in the global scope.
 	Change af_latin_blue_chars to be PIC-compatible by being a two
-	dimentional array rather than array of pointers.
+	dimensional array rather than array of pointers.
 
 
 	* src/autofit/aflatin2.h declare af_latin2_script_class
@@ -2489,11 +2489,11 @@
 	af_latin2_script_class struct will have function to init it instead of
 	being allocated in the global scope.
 	Change af_latin2_blue_chars to be PIC-compatible by being a two
-	dimentional array rather than array of pointers.
+	dimensional array rather than array of pointers.
 
 	* src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined
 	af_script_classes array initialization was moved to afpic.c and
-	is later refered using macros defeined in afpic.h.
+	is later referred using macros defined in afpic.h.
 
 	New Files:
 	* src/autofit/afpic.h declare struct to hold PIC globals for autofit
@@ -2573,7 +2573,7 @@
 	Macros will be used from rastpic.h in order to access
 	ft_standard_raster from the pic_container (allocated in ftraster.c).
 	In ft_raster1_render when PIC is enabled, the last letter of
-	module_name is used to verfy the renderer class rather than the
+	module_name is used to verify the renderer class rather than the
 	class pointer.
 
 	* src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined
@@ -2594,14 +2594,14 @@
 	Position Independent Code (PIC) support in smooth renderer.
 
 	* src/smooth/ftsmooth.h declare ft_smooth_renderer_class,
-	ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class
+	ft_smooth_lcd_renderer_class and ft_smooth_lcdv_renderer_class
 	using macros from ftrender.h,
 	when FT_CONFIG_OPTION_PIC is defined create and destroy
 	functions will be declared.
 	* src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined
 	the following structs:
 	ft_smooth_renderer_class, ft_smooth_lcd_renderer_class
-	and ft_smooth_lcd_v_renderer_class
+	and ft_smooth_lcdv_renderer_class
 	will have functions to init or create and destroy them
 	instead of being allocated in the global scope.
 	And macros will be used from ftspic.h in order to access
@@ -2755,7 +2755,7 @@
 	And macros will be used from ttpic.h in order to access them
 	from the pic_container.
 	* src/truetype/ttobjs.c change trick_names array to be
-	PIC-compatible by being a two dimentional array rather than array
+	PIC-compatible by being a two dimensional array rather than array
 	of pointers.
 
 	New Files:
@@ -2784,14 +2784,14 @@
 	Add macros to declare, allocate and initialize drivers
 	(FT_Driver_ClassRec).
 	* include/freetype/internal/ftpic.h new file to declare the
-	FT_PIC_Container struct and the functions to allocate and detroy it.
+	FT_PIC_Container struct and the functions to allocate and destroy it.
 	* include/freetype/internal/ftserv.h add macros to allocate and
-	destory arrays of FT_ServiceDescRec.
+	destroy arrays of FT_ServiceDescRec.
 	* include/freetype/internal/internal.h define macro to include
 	ftpic.h.
 
 	New Files:
-	* src/base/ftpic.c implement functions to allocate and destory the
+	* src/base/ftpic.c implement functions to allocate and destroy the
 	global pic_container.
 	* src/base/basepic.h declare struct to hold PIC globals for base and
 	macros to access them.
@@ -2814,8 +2814,8 @@
 	* src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined
 	ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated
 	in the pic_container instead of the global scope and use macros from
- 	basepic.h to access them.
-	* src/base/ftbbox.c allocate bbox_interface stract on the stack
+	basepic.h to access them.
+	* src/base/ftbbox.c allocate bbox_interface struct on the stack
 	instead of the global scope when FT_CONFIG_OPTION_PIC is defined.
 	* src/base/ftstroke.c access ft_outline_glyph_class allocated in
 	ftglyph.c via macros from basepic.h
@@ -3469,8 +3469,8 @@
 	faces includes broken face which FT_Done_Face() cannot free,
 	FT_Done_Library() retries FT_Done_Face() and it can fall into
 	an endless loop. See the discussion:
-	http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html
-	http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html
+	https://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html
+	https://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html
 
 2009-01-07  Werner Lemberg  <wl@gnu.org>
 
@@ -3492,7 +3492,7 @@
 	* builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and
 	AC_CANONICAL_TARGET and use $host_os only.  A nice explanation for
 	this change can be found at
-	http://blog.flameeyes.eu/s/canonical-target.
+	https://blog.flameeyes.eu/s/canonical-target.
 
 	From Savannah patch #6712.
 
@@ -3519,7 +3519,7 @@
 2008-12-21  Werner Lemberg  <wl@gnu.org>
 
 	* src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c,
-	src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c:
+	src/smooth/ftgrays.c, src/base/ftobjs.c, src/sfobjs.c:
 	s/_Err_Bad_Argument/_Err_Invalid_Argument/.  The former is for
 	errors in the bytecode interpreter only.
 
@@ -3576,7 +3576,7 @@
 
 	* docs/CHANGES: Updated.
 
-2008-12-18  Bevan, David  <dbevan@emtex.com>
+2008-12-18  David Bevan  <dbevan@emtex.com>
 
 	Provide API for accessing embedding and subsetting restriction
 	information.
@@ -3656,12 +3656,12 @@
 	* src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines
 	nor bitmaps is scalable.
 
-2008-12-05  Werner Lemberg  <wl@nu.org>
+2008-12-05  Werner Lemberg  <wl@gnu.org>
 
 	* src/autofit/aflatin.c (af_latin_uniranges): Add more ranges.  This
 	fixes Savannah bug #21190 which also provides a basic patch.
 
-2008-12-05  Werner Lemberg  <wl@nu.org>
+2008-12-05  Werner Lemberg  <wl@gnu.org>
 
 	* include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value
 	0x100 instead of 0x10000; the latter value is already occupied by
@@ -4098,7 +4098,7 @@
 2008-09-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined
-	in ttags.h instead of numerical value 0x4F54544FL.
+	in tttags.h instead of numerical value 0x4F54544FL.
 
 2008-09-16  Werner Lemberg  <wl@gnu.org>
 
@@ -4156,11 +4156,11 @@
 2008-09-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or
-	ApplicationService framework is missing.  Although this value is not
+	ApplicationServices framework is missing.  Although this value is not
 	used in building of FreeType2, it is written in `freetype2.pc' and
 	`freetype-config'.
 
-2008-09-01  david turner  <david@freetype.org>
+2008-09-01  David Turner  <david@freetype.org>
 
 	* src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap
 	index to mean `use default cached FT_Face's charmap'.  This fixes
@@ -4248,7 +4248,7 @@
 2008-08-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in
-	ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ).
+	tttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ).
 
 2008-08-28  Werner Lemberg  <wl@gnu.org>
 
@@ -4258,7 +4258,7 @@
 
 2008-08-23  Werner Lemberg  <wl@gnu.org>
 
-	* src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c
+	* src/type/t1afm.c (compare_kern_pairs), src/psaux/afmparse.c
 	(afm_compare_kern_pairs): Fix comparison.  This fixes Savannah bug
 	#24119.
 
@@ -4387,7 +4387,7 @@
 
 	* src/cff/cffload.c (cff_font_load): Pass `pure_cff'.
 	Invert sids table only if `pure_cff' is set.
-	* src/cff/cffload.h: Udpated.
+	* src/cff/cffload.h: Updated.
 
 	* src/cff/cffobjs.c (cff_face_init): Updated.
 	Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set.
@@ -4516,7 +4516,7 @@
 	recommends to add the option only to CFLAGS, LDFLAGS should include
 	it because libfreetype.la is built with -no-undefined.  This fixes a
 	bug reported by Ryan Schmidt in MacPorts,
-	http://trac.macports.org/ticket/15331.
+	https://trac.macports.org/ticket/15331.
 
 2008-06-21  Werner Lemberg  <wl@gnu.org>
 
@@ -4861,7 +4861,7 @@
 2008-04-14  Werner Lemberg  <wl@gnu.org>
 
 	* src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to
-	`FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'.  From Savannah
+	`FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZW'.  From Savannah
 	bug #22909.
 
 2008-04-13  Werner Lemberg  <wl@gnu.org>
@@ -4931,7 +4931,7 @@
 	tt_cmap14_find_variant): Return correct value.
 	(tt_cmap14_variant_chars): Fix check for `di'.
 
-2008-02-29  Wermer Lemberg  <wl@gnu.org>
+2008-02-29  Werner Lemberg  <wl@gnu.org>
 
 	* docs/CHANGES: Updated.
 
@@ -5243,7 +5243,7 @@
 	functions related to cmap type 14 support to the
 	`FT_Object_ActionName' scheme:
 
-	  FT_Get_Char_Variant_index     -> FT_Face_GetCharVariantIndex
+	  FT_Get_Char_Variant_Index     -> FT_Face_GetCharVariantIndex
 	  FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault
 	  FT_Get_Variant_Selectors      -> FT_Face_GetVariantSelectors
 	  FT_Get_Variants_Of_Char       -> FT_Face_GetVariantsOfChar
@@ -5329,7 +5329,7 @@
 
 2007-08-18  Werner Lemberg  <wl@gnu.org>
 
-	* src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs.  Found
+	* src/otvalid/otvcommn.c (otv_x_y_ux_sy): Skip context glyphs.  Found
 	by Imran Yousaf.  Fixes Savannah bug #20773.
 
 	(otv_Lookup_validate): Correct handling of LookupType.  Found by
@@ -5383,7 +5383,7 @@
 	* include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro.
 	(FT_VALIDATE_OT): Updated.
 
-	* src/otvalid/otmath.c: New file.
+	* src/otvalid/otvmath.c: New file.
 
 	* src/otvalid/otvalid.c: Include otvmath.c.
 	* src/otvalid/otvmod.c (otv_validate): Handle `MATH' table.
@@ -5428,7 +5428,7 @@
 	* include/freetype/config/ftheader.h (FT_CID_H): New macro.
 	* include/freetype/ftcid.h: New file.
 
-	* include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro.
+	* include/freetype/internal/ftserv.h (FT_SERVICE_CID_H): New macro.
 	* include/freetype/internal/services/svcid.h: New file.
 
 	* src/base/ftcid.c: New file.
@@ -5530,7 +5530,7 @@
 	* src/truetype/ttinterp.c (Ins_IUP): Add missing variable
 	initialization.
 
-	* src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Get rid of an
 	infinite loop in the case of degenerate fonts.
 
 2007-06-26  Rahul Bhalerao  <b.rahul.pm@gmail.com>
@@ -5938,7 +5938,7 @@
 
 	Savannah patch #5929.
 
-	* include/freetype/tttables.h, src/base/ftobjcs.c
+	* include/freetype/tttables.h, src/base/ftobjs.c
 	(FT_Get_CMap_Format): New function.
 
 	* include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add
@@ -5965,7 +5965,7 @@
 	* include/freetype/config/ftstdlib.h,
 	include/freetype/internal/ftobjs.h: As suggested by Graham Asher,
 	ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values
-	instead on relying on the locale-dependent functions provided by
+	instead of relying on the locale-dependent functions provided by
 	<ctypes.h>.
 
 2007-05-15  Graham Asher  <graham.asher@btinternet.com>
@@ -6005,7 +6005,7 @@
 
 2007-05-11  David Turner  <david@freetype.org>
 
-	* src/cache/ftbasic.c, include/freetype/ftcache.h
+	* src/cache/ftcbasic.c, include/freetype/ftcache.h
 	(FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new
 	functions that allow us to look up glyphs using an FTC_Scaler object
 	to specify the size, making it possible to use fractional pixel
@@ -6097,8 +6097,8 @@
 
 2007-04-06  David Turner  <david@freetype.org>
 
-	* src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug
-	(Savannah bug #19536).
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite
+	bug (Savannah bug #19536).
 
 2007-04-04  Werner Lemberg  <wl@gnu.org>
 
@@ -6187,13 +6187,13 @@
 	* builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent
 	32bit unsigned long overflow by 64bit filesize on LP64 platform, as
 	proposed by Sean McBride:
-	http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
+	https://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
 
 2007-03-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* builds/unix/ftconfig.in: Suppress SGI compiler's warning against
 	setjmp, proposed by Sean McBride:
-	http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
+	https://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
 
 2007-03-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -6201,14 +6201,14 @@
 	conftest.c, to avoid unexpected shell evaluation.  Possibly it is a
 	bug or undocumented behaviour of autoconf.
 
-2007-03-18  David Turner   <david@freetype.org>
+2007-03-18  David Turner  <david@freetype.org>
 
 	* src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression
 	fix; testing still needed.
 
 	* src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix.
 
-2007-03-17  David Turner   <david@freetype.org>
+2007-03-17  David Turner  <david@freetype.org>
 
 	* src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the
 	(undocumented) twilight zone special case.
@@ -6256,7 +6256,7 @@
 	case FT_Init_FreeType fails for some reason.  Problem reported by
 	Maximilian Schwerin <maximilian.schwerin@buelowssiege.de>.
 
-	* src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem'
+	* src/truetype/ttobjs.c (tt_size_init_bytecode): Clear the `x_ppem'
 	and `y_ppem' fields of the `TT_Size.metrics' structure, not those of
 	`TT_Size.root.metrics'.  Problem reported by Daniel Glöckner
 	<daniel-gl@gmx.net>.
@@ -6335,7 +6335,7 @@
 	* src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New
 	functions.
 
-	* src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init),
+	* src/bdf/bdfdrivr.c (bdf_interpret_style, BDF_Face_Init),
 	src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c
 	(pcf_get_properties, pcf_interpret_style, pcf_load_font),
 	src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c
@@ -6546,7 +6546,7 @@
 2007-01-16  David Turner  <david@freetype.org>
 
 	* src/autofit/aflatin.c (af_latin_hints_compute_segments),
-	src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c
+	src/cff/cffdrivr.c (cff_ps_get_font_info), src/truetype/ttobjs.c
 	(tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler
 	warnings.
 
@@ -6592,7 +6592,7 @@
 	* src/cff/cffload.c: Include FT_TYPE1_TABLES_H.
 	(cff_font_done): Free font->font_info if necessary.
 
-	* src/cff/cffdrvr.c (cff_ps_get_font_info): New function.
+	* src/cff/cffdrivr.c (cff_ps_get_font_info): New function.
 	(cff_service_ps_info): Register cff_ps_get_font_info.
 
 2007-01-13  Werner Lemberg  <wl@gnu.org>
@@ -6734,7 +6734,7 @@
 	files are not used.
 
 	* include/freetype/internal/tttypes.h (TT_FaceRec): Add members
-	`horz_metrics_offset' and `vert_metrics_ofset'.
+	`horz_metrics_offset' and `vert_metrics_offset'.
 	* src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics):
 	Updated.
 
@@ -6852,7 +6852,7 @@
 
 	* include/freetype/internal/services/svotval.h: Add `volatile' to
 	sync with the modification by Jens Claudius on 2006-08-22; cf.
-	  http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5
+	  https://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5
 
 2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -6876,7 +6876,7 @@
 
 	* src/base/ftobjs.c: Improvement of resource fork handler for
 	POSIX, cf.
-	  http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html
 	(Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font
 	format or .dfont, to simulate the face index number counted by ftmac.c.
 	(IsMacResource): Return the number of scalable faces correctly.
@@ -7023,7 +7023,7 @@
 	(_ft_lcd_filter_fir): This.
 	Update parameters.
 	(_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function.
-	(FT_Library_Set_LcdFilter): Update parameters.
+	(FT_Library_SetLcdFilter): Update parameters.
 	Handle new filter modes.
 
 	* include/internal/ftobjs.h: Include FT_LCD_FILTER_H.
@@ -7366,7 +7366,7 @@
 	to recognize a few fonts that require the automatic unpatented
 	loader.
 
-	* src/smooth/ftgrays.c: Optmize the performance of the anti-aliased
+	* src/smooth/ftgrays.c: Optimize the performance of the anti-aliased
 	rasterizer.  The speed improvement is between 15% and 25%, depending
 	on the font data.
 
@@ -7517,14 +7517,14 @@
 2006-08-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	* modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to
-	build ftvalid in ft2demos.  This has been inadvertedly changed
+	build ftvalid in ft2demos.  This has been inadvertently changed
 	2006-08-13.
 
 2006-08-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 	`ft_validator_run' wrapping `setjmp' can cause a crash, as found by
 	Jens:
-	http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm.
+	https://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm.
 
 	* src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'.
 	It reverts the change introduced on 2005-08-20.
@@ -7647,7 +7647,7 @@
 	`len_buildchar'.
 	Remove `keywords_flags'.
 
-	* src/type1/t1load.h (T1_LoaderRect): New field
+	* src/type1/t1load.h (T1_LoaderRec): New field
 	`keywords_encountered'.
 	(T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros.
 
@@ -7721,7 +7721,7 @@
 2006-06-24  Eugeniy Meshcheryakov  <eugen@univ.kiev.ua>
 
 	Fix two hinting bugs as reported in
-	http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html.
+	https://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html.
 
 	* include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add
 	`first_point' member.
@@ -7761,7 +7761,7 @@
 	should return `FT_Err_Unimplemented_Feature' if validation service
 	is unavailable (disabled in `modules.cfg').  It is originally
 	suggested by David Turner, cf.
-	http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html
+	https://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html
 
 	* src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return
 	FT_Err_Unimplemented_Feature if TrueTypeGX validation service is
@@ -7840,7 +7840,7 @@
 	* src/base/ftobjs.c (load_face_in_embedded_rfork): Replace
 	`FT_Stream_Close' by `FT_Stream_Free' to fix memory leak.
 
-	* src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name):
+	* src/base/ftrfork.c (raccess_guess_linux_double_from_file_name):
 	Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak.
 
 2006-05-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
@@ -7857,7 +7857,7 @@
 2006-05-18  Werner Lemberg  <wl@gnu.org>
 
 	* src/truetype/ttgload.c (TT_Load_Composite_Glyph)
-	[FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again.
+	[TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again.
 
 2006-05-17  David Turner  <david@freetype.org>
 
@@ -7902,7 +7902,7 @@
 	(FT_Stream_OpenGzip): Use it to handle small files directly in
 	memory.
 
-	* src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode):
+	* src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode):
 	Improve performance.
 
 	* src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and
@@ -7932,7 +7932,7 @@
 
 ----------------------------------------------------------------------------
 
-Copyright 2006-2015 by
+Copyright 2006-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.24 b/ChangeLog.24
index df2119d..44abc40 100644
--- a/ChangeLog.24
+++ b/ChangeLog.24
@@ -335,7 +335,7 @@
 
 	* include/freetype/ftmoderr.h: Fix commit from 2013-03-11.
 
-	The previous version was not backwards compatible.  Reported by
+	The previous version was not backward compatible.  Reported by
 	Behdad.
 
 2013-03-14  Werner Lemberg  <wl@gnu.org>
@@ -744,7 +744,7 @@
 
 2013-01-16  David 'Digit' Turner  <digit@google.com>
 
-	[truetype] Improve sub-pixel code.
+	[truetype] Improve subpixel code.
 
 	This patches fixes many issues with the ttsubpix implementation.
 
@@ -780,11 +780,11 @@
 
 	Move font tweaking tables to...
 
-	* src/truetype/ttsubpic.c: This file and decorate them with `static'
+	* src/truetype/ttsubpix.c: This file and decorate them with `static'
 	and `const' where appropriate.
 
 	(X_SCALING_Rules, X_SCALING_RULES_SIZE): Renamed to...
-	(spu_X_SCALING_Rules, SPH_X_SCALING_RULES_SIZE): This.
+	(sph_X_SCALING_Rules, SPH_X_SCALING_RULES_SIZE): This.
 	Update all users.
 
 2013-01-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
@@ -978,7 +978,7 @@
 
 	[base] Clean up trigonometric core.
 
-	* src/base/fttrrigon.c (ft_trig_pseudo_polarize): Align algorithm
+	* src/base/fttrigon.c (ft_trig_pseudo_polarize): Align algorithm
 	with `ft_trig_pseudo_rotate'.
 
 2012-12-18  Infinality  <infinality@infinality.net>
@@ -990,7 +990,7 @@
 
 2012-12-17  Infinality  <infinality@infinality.net>
 
-	[truetype] Remove unusued code and variables.
+	[truetype] Remove unused code and variables.
 
 	* src/truetype/ttinterp.c: Updated.
 	(Ins_FDEF): Remove opcode patterns that are not being used.
@@ -1012,7 +1012,7 @@
 
 2012-12-16  Infinality  <infinality@infinality.net>
 
-	[truetype] Remove unusued code and variables.  Add minor fixes.
+	[truetype] Remove unused code and variables.  Add minor fixes.
 
 	* src/truetype/ttsubpix.h: Updated.
 	(SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Trebuchet MS.
@@ -1037,7 +1037,7 @@
 	(Ins_FDEF): Rework code to fix bugs and add more detection.
 	(Ins_CALL): Remove unused code.
 	(Ins_LOOPCALL): Remove unused code.
-	(TT_RunIns): Remove unusued code.
+	(TT_RunIns): Remove unused code.
 	(Ins_SHPIX): Add logic to handle ttfautohinted fonts.
 	(Ins_MIRP): Don't round x in cut-in calculation.  Add logic to handle
 	ttfautohinted fonts.
@@ -1395,7 +1395,7 @@
 
 	[autofit] Minor optimization.
 
-	* src/autofit/afglobals.c (af_face_globals_compute_script_coverage):
+	* src/autofit/afglobal.c (af_face_globals_compute_script_coverage):
 	Add loop condition.
 
 2012-09-29  Werner Lemberg  <wl@gnu.org>
@@ -1859,11 +1859,11 @@
 
 	Fix `checking if gcc static flag -static works' test.
 
-	On my linux build tree, I receive yes answer in in every package I
-	build except freetype for this test checking if gcc static flag
+	On my linux build tree, I receive yes answer in every package I
+	build except FreeType for this test checking if gcc static flag
 	`-static' works
 
-	On freetype, no is received, unless bzip2 and zlib are disabled using
+	In FreeType, no is received, unless bzip2 and zlib are disabled using
 
 	  ./configure --without-bzip2 --without-zlib
 
@@ -1977,7 +1977,7 @@
 	Most of the code is based on the ClearType whitepaper written by
 	Greg Hitchcock
 
-	  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+	  https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
 
 	which gives a detailed overview of the necessary changes to the
 	Microsoft rasterizer so that older fonts are supported.  However, a
@@ -2014,7 +2014,7 @@
 	(compute_glyph_metrics): Handle `compatible widths' option.
 	(tt_loader_init): Handle ClearType GETINFO information bits.
 
-	* src/truetype/rules.mk (TT_DRC_SRC): Updated.
+	* src/truetype/rules.mk (TT_DRV_SRC): Updated.
 
 	* src/truetype/ttinterp.c: Include `ttsubpix.h'.
 	[Where necessary, changes below are guarded by
@@ -2103,7 +2103,7 @@
 	NEC FA family dated in 1996 have different checksum.
 	Reported by Johnson Y. Yan <yinsen_yan@foxitsoftware.com>; see
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2012-06/msg00023.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2012-06/msg00023.html
 
 	* src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): 4 sets
 	of fpgm & prep table checksums for FA-Gothic, FA-Minchou,
@@ -2117,7 +2117,7 @@
 
 	Problem reported by jola <hans-jochen.lau@lhsystems.com>; see
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2012-05/msg00036.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2012-05/msg00036.html
 
 	* src/raster/ftraster.c (SMulDiv_No_Round): New macro.
 	(Line_Up): Use it.
@@ -2141,7 +2141,7 @@
 	* include/freetype/ftoutln.h (FT_Outline_EmboldenXY): Define it.
 
 	* src/base/ftoutln.c (FT_Outline_EmboldenXY): Implement it, using a
-	simplified embolding algorithm.
+	simplified emboldening algorithm.
 	(FT_Outline_Embolden): Make it a special case of
 	`FT_Outline_EmboldenXY'
 
@@ -2546,7 +2546,7 @@
 
 	* src/bdf/bdflib.c (_bdf_is_atom): Fix handling of property value.
 
-2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (6/6).
 
@@ -2556,20 +2556,20 @@
 	s/t1_init_loader/cid_init_loader/.
 	s/t1_done_loader/cid_done_loader/.
 
-	* src/pxaux/t1cmap.c: s/t1_get_glyph_name/psaux_get_glyph_name/.
+	* src/psaux/t1cmap.c: s/t1_get_glyph_name/psaux_get_glyph_name/.
 
 	* src/truetype/ttdriver.c: s/Load_Glyph/tt_glyph_load/.
 
 	* src/type1/t1load.c: s/parse_font_matrix/t1_parse_font_matrix/.
 
-2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (5/6).
 
 	* include/freetype/fterrors.h: Undefine FT_KEEP_ERR_PREFIX after
 	using it.
 
-2012-02-22  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-22  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (4/6).
 
@@ -2581,7 +2581,7 @@
 	* src/raster/ftraster.c: s/TRaster/gray_TRaster/,
 	s/PRaster/gray_PRaster/.
 
-2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (3/6).
 
@@ -2590,20 +2590,20 @@
 	* src/raster/ftraster.c: s/TWorker/gray_TWorker/,
 	s/PWorker/gray_PWorker/.
 
-2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (2/6).
 
 	* src/smooth/ftgrays.c, src/raster/ftraster.c: Undefine FLOOR,
 	CEILING, TRUNC, and SCALED before defining it.
 
-2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
 
 	Prepare source code for amalgamation (1/6).
 
 	See discussion starting at
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00037.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00037.html
 
 	* src/smooth/ftgrays.c: s/TBand/gray_TBand/.
 	* src/raster/ftraster.c: s/TBand/black_TBand/.
@@ -2616,7 +2616,7 @@
 	`outline.flags' so that this information is preserved.  See
 	discussion starting at
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html
 
 2012-02-11  Werner Lemberg  <wl@gnu.org>
 
@@ -2677,7 +2677,7 @@
 	[raccess] Modify for PIC build.
 
 	Based on the patch provided by Erik Dahlstrom <ed@opera.com>,
-	http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00010.html
+	https://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00010.html
 
 	Also `raccess_guess_table[]' and `raccess_rule_by_darwin_vfs()'
 	are renamed with `ft_' suffixes.
@@ -2796,9 +2796,9 @@
 	[base] Fix a dereference of uninitialized variable in PIC mode.
 
 	* src/base/ftglyph.c (FT_Glyph_To_Bitmap): `glyph' must be
-	set before derefering to obtain `library'.  The initialization
+	set before dereferring to obtain `library'.  The initialization
 	of `clazz', `glyph', `library' and NULL pointer check are
-	reordered to minimize PIC conditonals.
+	reordered to minimize PIC conditionals.
 
 2012-01-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -2941,10 +2941,10 @@
 
 	[type42] Remove casts.
 
-	* src/type42/t42driver.c (t42_driver_class): Remove all casts and
+	* src/type42/t42drivr.c (t42_driver_class): Remove all casts and
 	update affected functions.
 
-	* src/type42/t42objs.c, src/type42/t42objs.h: Updated for t42driver
+	* src/type42/t42objs.c, src/type42/t42objs.h: Updated for t42 driver
 	changes.
 
 2011-11-30  Werner Lemberg  <wl@gnu.org>
@@ -3127,7 +3127,7 @@
 
 	According to
 
-	  http://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html
+	  https://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html
 
 	this should be mentioned explicitly.
 
@@ -3261,7 +3261,7 @@
 
 2011-09-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-	[smooth] Slightly optimize conic and cubic flatterners.
+	[smooth] Slightly optimize conic and cubic flatteners.
 
 	* src/smooth/ftgrays.c (gray_render_conic, gray_render_cubic): Move
 	out some code from the main loop to speed it up.
@@ -3456,7 +3456,7 @@
 
 	See
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html
 
 	for some comparison images.
 
@@ -3556,7 +3556,7 @@
 
 	See
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00001.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00001.html
 
 	for example documents.  The FreeType stroker now produces results
 	very similar to that produced by GhostScript and Distiller for these
@@ -3621,7 +3621,7 @@
 	* src/base/ftstroke.c: Revised.
 	* include/freetype/ftstroke.h: Updated.
 
-2011-06-30  İsmail Dönmez <ismail@namtrac.org>
+2011-06-30  İsmail Dönmez  <ismail@namtrac.org>
 
 	* builds/toplevel.mk: We use git, not CVS, thus skip `.gitignore'.
 
@@ -3680,7 +3680,7 @@
 
 	[autogen.sh] Reflect environment variable LIBTOOLIZE.
 
-2011-06-18  Werner Lemberg <wl@gnu.org>
+2011-06-18  Werner Lemberg  <wl@gnu.org>
 
 	Update license documentation.
 
@@ -3776,7 +3776,7 @@
 	[gxvalid] Fix gcc4.6 compiler warnings in gxvtrak.c.
 
 	* src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate):
-	Check different entries pointing same traking value.
+	Check different entries pointing same tracking value.
 	(gxv_trak_validate): Remove unused variable `table_size'.
 
 2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
@@ -3788,12 +3788,12 @@
 	(gxv_morx_chain_validate): Conditionalize unvalidated
 	variable `defaultFlags'.
 
-	* src/gxvalid/gxmorx0.c
+	* src/gxvalid/gxvmorx0.c
 	(gxv_morx_subtable_type0_entry_validate):
 	Conditionalize unvalidated variables; `markFirst',
 	`dontAdvance', `markLast', `verb'.
 
-	* src/gxvalid/gxmorx1.c
+	* src/gxvalid/gxvmorx1.c
 	(gxv_morx_subtable_type1_entry_validate): Conditionalize
 	unvalidated variables; `setMark', `dontAdvance'.
 
@@ -3826,11 +3826,11 @@
 	(gxv_mort_chain_validate): Conditionalize unvalidated
 	variable `defaultFlags'.
 
-	* src/gxvalid/gxmort0.c
+	* src/gxvalid/gxvmort0.c
 	(gxv_mort_subtable_type0_entry_validate): Check the
 	conflict of the marks for the glyphs.
 
-	* src/gxvalid/gxmort1.c
+	* src/gxvalid/gxvmort1.c
 	(gxv_mort_subtable_type1_offset_to_subst_validate):
 	Local variables `min_gid', `max_gid' are replaced by
 	variables in the validator.
@@ -4000,14 +4000,14 @@
 
 	[autofit] Add bluezones for CJK Ideographs.
 
-	To remove extremas of vertical strokes of CJK Ideographs at
+	To remove extrema of vertical strokes of CJK Ideographs at
 	low resolution and make the top and bottom horizontal stems
 	aligned, bluezones for CJK Ideographs are calculated from
 	sample glyphs.  At present, vertical bluezones (bluezones
 	to align vertical stems) are disabled by default.  For detail, see
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00070.html
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00092.html
-	http://lists.gnu.org/archive/html/freetype-devel/2011-05/msg00001.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00070.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00092.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-05/msg00001.html
 
 	* include/freetype/internal/fttrace.h: New trace component `afcjk'.
 	* src/autofit/afcjk.h (AF_CJK{Blue,Axis,Metric}Rec): Add CJK version
@@ -4029,7 +4029,7 @@
 	af_latin_hints_compute_blue_edges.
 	(af_cjk_metrics_init_blues): New function, CJK version of
 	af_latin_metrics_init_blues.
-	(af_cjk_hints_edges): Add code to align the edge stems to blue zones.
+	(af_cjk_hint_edges): Add code to align the edge stems to blue zones.
 
 	* src/autofit/afindic.c (af_indic_metrics_init): Take AF_CJKMetric
 	instead of AF_LatinMetric, and initialize as af_cjk_metrics_init.
@@ -4075,8 +4075,8 @@
 	the TrueType font header.  Some bad PDF generators write
 	wrong values.  For details see examples and benchmark tests
 	of the latency by recalculation:
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00091.html
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00096.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00091.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00096.html
 
 2011-04-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -4109,7 +4109,7 @@
 	Because some PDF generators mangle the family name badly,
 	the trickyness check by the checksum should be invoked always.
 	For sample PDF, see
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00073.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00073.html
 
 	* src/truetype/ttobjs.c (tt_check_trickyness): Even when
 	tt_check_trickyness_family() finds no trickyness,
@@ -4120,7 +4120,7 @@
 	[autofit] Add more Indic scripts with hanging baseline.
 
 	* src/autofit/afindic.c (af_indic_uniranges): Tibetan, Limbu,
-	Sundanese, Meetei Mayak, Syloti Nagri and Sharada scripts are
+	Sundanese, Meetei Mayek, Syloti Nagri and Sharada scripts are
 	added.
 
 2011-04-21  Behdad Esfahbod  <behdad@behdad.org>
@@ -4146,8 +4146,8 @@
 	When there are too many stems to preserve their gaps in the
 	rasterization of CJK Ideographs at a low resolution, blur the
 	stems instead of showing clumped stems.  See
-	http://lists.gnu.org/archive/html/freetype-devel/2011-02/msg00011.html
-	http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00046.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-02/msg00011.html
+	https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00046.html
 	for details.
 
 	* src/autofit/afcjk.c (af_cjk_hint_edges): Store the position of
@@ -4343,7 +4343,7 @@
 	[cache] Fix an off-by-one bug in `FTC_Manager_RemoveFaceID'.
 	Found by <ychen1392001@yahoo.com.cn>, see detail in
 
-	  http://lists.gnu.org/archive/html/freetype/2011-01/msg00023.html
+	  https://lists.gnu.org/archive/html/freetype/2011-01/msg00023.html
 
 	* src/cache/ftccache.c (FTC_Cache_RemoveFaceID): Check the node
 	buckets[cache->p + cache->mask] too.
@@ -4464,7 +4464,7 @@
 	Johnson Y. Yan.  The bug report by Qt developers is
 	considered too.
 
-	http://bugreports.qt.nokia.com/browse/QTBUG-6521
+	https://bugreports.qt.io/browse/QTBUG-6521
 
 2011-01-15  Werner Lemberg  <wl@gnu.org>
 
@@ -4756,7 +4756,7 @@
 	* src/bzip2/*: New files.
 
 	* src/pcf/pcf.h: s/gzip_/comp_/.
-	* src/pcf/pcfdrvr.c: Include FT_BZIP2_H.
+	* src/pcf/pcfdrivr.c: Include FT_BZIP2_H.
 	s/gzip_/comp_/.
 	(PCF_Face_Init): Handle bzip2 compressed files.
 
@@ -4768,7 +4768,7 @@
 
 	If we encounter a space in a string then the sbit buffer is NULL,
 	height and width are 0s.  So the check in ftc_snode_compare will
-	always pass for spaces (comparision with 255).  Here the comments
+	always pass for spaces (comparison with 255).  Here the comments
 	above the condition are proper but the implementation is not.  When
 	we create an snode I think it is the proper way to initialize the
 	width to 255 and then put a check for being equal to 255 in snode
@@ -4923,7 +4923,7 @@
 	Partially undo change from 2010-10-15 by using ONE_PIXEL/4; this has
 	been tested with demo images sent to the mailing list.  See
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html
 
 	and later mails in this thread.
 
@@ -4943,7 +4943,7 @@
 	Problem reported by Tom Bishop <wenlin@wenlin.com>; see
 	thread starting with
 
-	  http://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html
+	  https://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html
 
 	* src/raster/ftraster.c (Line_Up): Replace FMulDiv with SMulDiv
 	since the involved multiplication exceeds 32 bits.
@@ -5007,7 +5007,7 @@
 	normal clients.
 
 	For the history of these macros, see the investigation:
-	http://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html
+	https://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html
 
 2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
@@ -5054,7 +5054,7 @@
 	by Darwin VFS are skipped.  It reduces the warnings of the
 	deprecated resource fork access method by recent Darwin kernel.
 	Fix MacPorts ticket #18859:
-		http://trac.macports.org/ticket/18859
+		https://trac.macports.org/ticket/18859
 
 	* src/base/ftobjs.c (load_face_in_embedded_rfork):
 	When `FT_Stream_New' returns FT_Err_Cannot_Open_Stream, it
@@ -5182,7 +5182,7 @@
 	[smooth] Fix splitting of cubics for negative values.
 
 	Reported by Róbert Márki <gsmiko@gmail.com>; see
-	http://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html.
+	https://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html.
 
 	* src/smooth/ftgrays.c (gray_render_cubic): Fix thinko.
 
@@ -5349,7 +5349,7 @@
 	Ignore the environmental setting of LIBTOOL.
 	Patch is suggested by Adrian Bunk, to prevent unexpected
 	reflection of environmental LIBTOOL.  See:
-	http://savannah.nongnu.org/patch/?7290
+	https://savannah.nongnu.org/patch/?7290
 
 	* builds/unix/unix-cc.in: LIBTOOL is unconditionally set to
 	$(FT_LIBTOOL_DIR)/libtool.  FT_LIBTOOL_DIR is set to $(BUILD_DIR)
@@ -5406,8 +5406,8 @@
 	for nameless fonts is safer for PDFs including embedded Chinese
 	fonts.  Written by David Bevan, see:
 
-	http://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html
-	http://lists.freedesktop.org/archives/poppler/2010-August/006310.html
+	https://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html
+	https://lists.freedesktop.org/archives/poppler/2010-August/006310.html
 
 	* src/truetype/ttobjs.c (tt_check_trickyness): If a NULL pointer by
 	nameless font is given, TRUE is returned to enable hinting.
@@ -5420,7 +5420,7 @@
 	a Kaishu typeface paired with `HuaTianSongTi?' by Huatian
 	Information Industry.
 
-2010-08-17  Teijo Kinnunen <Teijo.Kinnunen@nuance.com>
+2010-08-17  Teijo Kinnunen  <Teijo.Kinnunen@nuance.com>
 
 	[cache] Fix Savannah bug #30788.
 
@@ -5548,7 +5548,7 @@
 	Add reference counters and to FT_Library and FT_Face objects.
 
 	* include/freetype/freetype.h (FT_Reference_Face): New function.
-	* include/freetype/ftmodapi.h (FT_Rererence_Library): New function.
+	* include/freetype/ftmodapi.h (FT_Reference_Library): New function.
 
 	* include/freetype/internal/ftobjs.h (FT_Face_InternalRec,
 	FT_LibraryRec): New field `refcount'.
@@ -5669,7 +5669,7 @@
 	Use defined macros to set {platform,encoding}_id.
 
 	* src/bdf/bdfdrivr.c: Include ttnameid.h and use macros to
-	set charmap.{platfom,encoding}_id.
+	set charmap.{platform,encoding}_id.
 	* src/pcf/pcfdrivr.c: Ditto.
 	* src/winfonts/winfnt.c: Ditto.
 	* src/type1/t1objs.c: Ditto.
@@ -5792,8 +5792,8 @@
 	* src/cff/cffobjs.c (cff_face_init): Check error value by
 	`FT_CMap_New'.
 	* src/pfr/pfrobjs.c (pfr_face_init): Ditto.
-	* src/type1/t1jobjs.c (T1_Face_Init): Ditto.
-	* src/type42/t42jobjs.c (T42_Face_Init): Ditto.
+	* src/type1/t1objs.c (T1_Face_Init): Ditto.
+	* src/type42/t42objs.c (T42_Face_Init): Ditto.
 
 2010-07-03  Werner Lemberg  <wl@gnu.org>
 
@@ -5968,7 +5968,7 @@
 
 	* src/smooth/ftgrays.c (gray_render_cubic): Fix algorithm.
 	The previous version was too aggressive, as demonstrated in
-	http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html.
+	https://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html.
 
 2010-06-24  Werner Lemberg  <wl@gnu.org>
 
@@ -6065,7 +6065,7 @@
 	simplified algorithm to find out whether the spline can be replaced
 	with two straight lines.  See this thread for more:
 
-	  http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html
+	  https://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html
 
 2010-06-09  Werner Lemberg  <wl@gnu.org>
 
@@ -6220,7 +6220,7 @@
 	Add new function `FT_Library_SetLcdFilterWeights'.
 
 	This is based on code written by Lifter
-	<http://unixforum.org/index.php?showuser=11691>.  It fixes
+	<https://unixforum.org/index.php?showuser=11691>.  It fixes
 	FreeDesktop bug #27386.
 
 	* src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): New
@@ -6278,8 +6278,8 @@
 	Use real types instead of `void' for `pshinter' and `psnames' fields.
 
 	* src/cff/cffload.c: Don't include PS cmaps service.
-	(cff_index_get_pointers): Add `pool' parameter which allows to
-	insert an extra NUL character for each String INDEX entry.
+	(cff_index_get_pointers): Add `pool' parameter which allows inserting
+	an extra NUL character for each String INDEX entry.
 	(cff_index_get_name): Make it a local function.
 	(cff_index_get_string): New function.
 	(cff_subfont_load): Updated.
@@ -6344,7 +6344,7 @@
 
 ----------------------------------------------------------------------------
 
-Copyright 2010-2015 by
+Copyright 2010-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.25 b/ChangeLog.25
new file mode 100644
index 0000000..59cf2bf
--- /dev/null
+++ b/ChangeLog.25
@@ -0,0 +1,5161 @@
+2014-12-30  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.5 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-5'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.5.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.4/2.5.5/, s/254/255/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
+
+	* builds/unix/configure.raw (version_info): Set to 17:4:11.
+	* CMakeLists.txt (VERSION_PATCH): Set to 5.
+	* docs/CHANGES: Updated.
+
+	* builds/toplevel.mk (dist): Fix typos.
+
+2014-12-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Formatting and nanooptimizations.
+
+	* src/base/ftcalc.c,
+	* src/base/fttrigon.c: Revise sign restoration.
+
+2014-12-13  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Improve fix from 2014-12-08.
+
+2014-12-11  Werner Lemberg  <wl@gnu.org>
+
+	* builds/toplevel.mk (dist): Use older POSIX standard for `tar'.
+
+	Apparently, BSD tar isn't capable yet of handling POSIX-1.2001
+	(contrary to GNU tar), so force the POSIX-1.1988 format.
+
+	Problem reported by Stephen Fisher <sfisher@SDF.ORG>.
+
+2014-12-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Reject invalid TTF size.
+
+2014-12-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (FT_Get_Glyph_Name): Fix off-by-one check.
+
+	Problem reported by Dennis Felsing <dennis@felsin9.de>.
+
+2014-12-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Check `string_size'.
+
+	Problem reported by Dennis Felsing <dennis@felsin9.de>.
+
+2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[gxvalid] Fix a naming convention conflicting with ftvalid.
+
+	See previous changeset for otvalid.
+
+	* src/gxvalid/{gxvcommn.h, gxvmort.h, gxvmorx.h}: Replace
+	`valid' by `gxvalid'.
+	* src/gxvalid/{gxvbsln.c, gxvcommn.c, gxvfeat.c, gxvjust.c,
+	gxvkern.c, gxvlcar.c, gxvmort.c, gxvmort0.c, gxvmort1.c,
+	gxvmort2.c, gxvmort4.c, gxvmort5.c, gxvmorx.c, gxvmorx0.c,
+	gxvmorx1.c, gxvmorx2.c, gxvmorx4.c, gxvmorx5.c, gxvopbd.c,
+	gxvprop.c, gxvtrak.c}: Replace `valid' by `gxvalid' if
+	it is typed as GXV_Validator.
+
+2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[otvalid] Fix a naming convention conflicting with ftvalid.
+
+	Some prototypes in ftvalid.h use `valid' for the variables
+	typed as FT_Validator.  Their implementations in src/base/
+	ftobjs.c and utilizations in src/sfnt/ttcmap.c do similar.
+
+	Some macros in otvcommn.h assume the exist of the variable
+	`valid' typed as OTV_Validator in the caller.
+
+	Mixing these two conventions cause invalid pointer conversion
+	and unexpected SEGV in longjmp.  To prevent it, all variables
+	typed as OTV_Validator are renamed to `otvalid'.
+
+	* src/otvalid/otvcommn.h: Replace `valid' by `otvalid'.
+	* src/otvalid/{otvcommn.c, otvbase.c, otvgdef.c, otvgpos.c,
+	otvgsub.c, otvjstf.c, otvmath.c}: Replace `valid' by `otvalid'
+	if it is typed as OTV_Validator.
+
+2014-12-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[ftvalid] Introduce FT_THROW() in FT_INVALID_XXX macros.
+
+	Original patch is designed by Werner Lemberg.  Extra part
+	for otvalid and gxvalid are added by suzuki toshiya, see
+	discussion:
+	https://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00002.html
+	https://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00007.html
+
+	* include/internal/ftvalid.h: Introduce FT_THROW() in FT_INVALID_().
+	* src/gxvalid/gxvcommn.h: Ditto.
+	* src/otvalid/otvcommn.h: Ditto.
+
+2014-12-08  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Fix Savannah bug #43774.
+
+	Work around `features' of X11's `pcfWriteFont' and `pcfReadFont'
+	functions.  Since the PCF format doesn't have an official
+	specification, we have to exactly follow these functions' behaviour.
+
+	The problem was unveiled with a patch from 2014-11-06, fixing issue
+	#43547.
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Don't check table size for last
+	element.  Instead, assign real size.
+
+2014-12-07  Werner Lemberg  <wl@gnu.org>
+
+	Work around a bug in Borland's C++ compiler.
+
+	See
+
+	  http://qc.embarcadero.com/wc/qcmain.aspx?d=118998
+
+	for Borland's bug tracker entry.
+
+	Reported by Yuliana Zigangirova <zigangirova@inbox.ru>,
+	https://lists.gnu.org/archive/html/freetype-devel/2014-04/msg00001.html.
+
+	* include/internal/ftvalid.h (FT_ValidatorRec), src/smooth/ftgrays.c
+	(gray_TWorker_): Move `ft_jmp_buf' field to be the first element.
+
+2014-12-07  Werner Lemberg  <wl@gnu.org>
+
+	*/*: Decorate hex constants with `U' and `L' where appropriate.
+
+2014-12-07  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Prevent memory leak for buggy fonts.
+
+	* src/truetype/ttobjs.c (tt_size_done): Unconditionally call
+	`tt_size_done_bytecode'.
+
+2014-12-06  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.4 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-4'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.4.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.3/2.5.4/, s/253/254/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
+
+	* builds/unix/configure.raw (version_info): Set to 17:3:11.
+	* CMakeLists.txt (VERSION_PATCH): Set to 4.
+	* docs/CHANGES: Updated.
+
+2014-12-04  Werner Lemberg  <wl@gnu.org>
+
+	docs/CHANGES: Updated, formatted.
+
+2014-12-04  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Modify an FT_ASSERT.
+
+	* src/cff/cf2hints.c (cf2_hintmap_map): After the fix for Savannah
+	bug #43661, the test font `...aspartam.otf' still triggers an
+	FT_ASSERT.  Since hintmap still works with count==0, ...
+	(cf2_glyphpath_lineTo, cf2_glyphpath_curveTo): ... add that term to
+	suppress the assert.
+
+2014-12-04  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix Savannah bug #43661.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
+	cf2_cmdVSTEM, cf2_cmdHINTMASK>: Don't append to stem arrays after
+	hintmask is constructed.
+
+	* src/cff/cf2hints.c (cf2_hintmap_build): Add defensive code to
+	avoid reading past end of hintmask.
+
+2014-12-03  Werner Lemberg  <wl@gnu.org>
+
+	docs/CHANGES: Updated.
+
+2014-12-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Better fix for conversion specifiers in debug messages.
+
+	Using `%ld' for pointer differences causes warnings on 32bit
+	platforms.  The correct type would be (the relatively new) `%td',
+	however, this is missing on some important platforms.
+
+	This patch improves the change from 2014-11-28.
+
+	* src/autofit/afhints.c (AF_INDEX_NUM): Use `int' typecast.  Our
+	pointer differences are always sufficiently small.
+	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
+	af_glyph_hints_dump_edge): Revert to `%d' and use `AF_INDEX_NUM'.
+
+2014-12-03  Werner Lemberg  <wl@gnu.org>
+
+	FT_Sfnt_Tag: s/ft_sfnt_xxx/FT_SFNT_XXX/ for orthogonality.
+
+	All public FreeType enumeration and flag values are uppercase...
+
+	* include/tttables.h (FT_Sfnt_Tag): Implement it.  For backward
+	compatibility, retain the old values as macros.
+
+	* src/base/ftfstype.c (FT_Get_FSType_Flags), src/sfnt/sfdriver.c
+	(get_sfnt_table): Updated.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	* include/*: Improve structure of documentation.
+
+	. Add and update many `<Order>' tags.
+	. Apply various documentation fixes.
+	. Remove details to deprecated (or never implemented) data.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Always handle `<Order>' section elements.
+
+	Previously, those elements were handled only for sections present in
+	a `<Sections>' chapter element.
+
+	* src/tools/docmaker/content.py (ContentProcessor::finish):
+	Implement it.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Properly handle empty rows in Synopsis.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit
+	`&nbsp;' for empty fields.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Thinko.
+
+	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
+	Emit `/empty/' string for first element also.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Honour empty lines in `<Order>' section element.
+
+	This greatly improves the readability of the `Synopsis' links.
+
+	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
+	Insert string `/empty/' between items.
+
+	* src/tools/docmaker/formatter.py (Formatter::section_dump): Make it
+	robust against nonexistent keys.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Emit
+	empty <td> elements for `/empty/'.
+
+2014-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Ensure Python 3 compatibility.
+
+	* src/tools/docmaker/content.py (ContentProcessor::set_section,
+	ContentProcessor::finish): Replace `has_key' function with `in'
+	keyword.
+
+	* src/tools/docmaker/formatter.py (Formatter::__init__): Replace
+	sorting function with a key generator.
+	(Formatter::add_identifier): Replace `has_key' function with `in'
+	keyword.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::html_source_quote):
+	Replace `has_key' function with `in' keyword.
+	(HtmlFormatter::index_exit, HtmlFormatter::section_enter): Use
+	integer division.
+	s/<>/>/.
+
+	* src/tools/docmaker/utils.py: Import `itertools'.
+	(index_sort): Replaced by...
+	(index_key): ... this new key generator (doing exactly the same).
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Don't output a block multiple times.
+
+	This bug was hidden by not processing all lines of `<Order>' blocks.
+
+	* src/tools/docmaker/formatter.py (Formatter::section_dump): Filter
+	out field names.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Use field values as HTML link targets where possible.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_block_url):
+	Accept second, optional argument to specify a name.
+	(HtmlFormatter::html_source_quote): Link to field ID if possible.
+	(HtmlFormatter::print_html_field_list): Emit `id' attribute.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Allow empty lines in `<Order>' blocks.
+
+	Before this patch, the suggested order of entries stopped at the
+	first empty line.
+
+	Obviously, nobody noticed that this problem caused a much reduced
+	set of links in the `Synopsis' sections; in particular, the
+	`<Order>' blocks contain a lot of entries that wouldn't be listed
+	otherwise...
+
+	* src/tools/docmaker/content.py (DocBlock::get_markup_words_all):
+	New function to iterate over all items.
+	(DocSection::process): Use it.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/sources.py (column) [Format 2]: Fix regexp.
+
+	After the single asterisk there must be no other immediately following
+	asterisk.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Improve CSS for vertical spacing.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Improve HTML code for table of contents.
+
+	* src/tools/docmaker/tohtml.py: Introduce a new table class `toc',
+	together with proper CSS.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Provide higher-level markup and simplify HTML.
+
+	* src/tools/docmaker/tohtml.py: Instead of using extraneous `<div>'
+	elements, use CSS descendants (of class `section') to format the
+	data.
+
+	Also remove redundant <p> and <br> elements, replacing them with
+	proper CSS.
+
+	Globally reduce page width to 75%.
+
+	(block_header): Rename <div> class to `section'.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Add `top' links after blocks.
+
+	* src/tools/docmaker/tohtml.py (block_footer_middle): Implement it.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Improve CSS for fields.
+
+	Make fields align horizontally relative to full line width.
+
+2014-11-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Fix index and TOC templates.
+
+	This thinko was introduced 2014-11-27.
+
+2014-11-28  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Format field lists with CSS.
+
+	This also simplifies the inserted HTML code.
+
+	* src/tools/docmaker/tohtml.py
+	(HtmlFormatter::print_html_field_list): Do it.
+
+2014-11-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix compiler warning to the comparison between signed and
+	unsigned variable.
+
+	* src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix the comparison
+	between `ypos + ysize' and FT_INT_{MAX,MIN}.
+
+2014-11-28  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Replace empty `<td>' with CSS.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::section_enter): Do
+	it.
+
+2014-11-28  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Replace some `<table>' tags with `<h4>' and `<div>'.
+
+	* src/tools/docmaker/tohtml.py (marker_*): Use `<h4>'.
+	(source_*): Use `<div>'.
+	(HtmlFormatter::block_enter): s/<h4>/<h3>/.
+
+2014-11-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix compiler warning to conversion specifiers in debug messages.
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_points): Add length
+	modifier to dump long integers.
+	(af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Ditto.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Use more CSS for index.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Replace `name' attribute of `<a>' with `id'.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::block_enter): Do it.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Remove remaining `width' attributes.
+
+	For `Index' and `TOC' links, we now simply use the `text-align' CSS
+	property of `<td>' to enforce flush-left and flush-right,
+	eliminating the hack with an empty, full-width `<td>' element
+	inbetween.
+
+	The change also enforces the same (smaller) size for all index and
+	TOC links.
+
+2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/cff/cf2font.c: Include `ftcalc.h' to use FT_MSB(),
+	cf2font.c could not find it under `make multi' build.
+
+2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove
+	unrequired negative value check for `width' and `height'.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: More HTML table refactoring.
+
+	Replace some `<table>' tags with `<div>' to simplify structure.
+
+	Move `bgcolor' attribute to CSS.
+
+	Replace most `width' attributes with CSS.  The remaining instances
+	(providing a similar effect as LaTeX's `\hfill' command) are removed
+	in a later patch.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Replace <font> with CSS.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Center <table> with CSS.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Replace `<center>' with `<div>'.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/tohtml.py: Remove redundant `<center>' tags.
+
+	This starts a series of commits into the direction of generating
+	valid HTML 5 code, especially using much more CSS.
+
+2014-11-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Prevent too negative values (< FT_INT_MIN) in bitmap metrics,
+	suggested by Alexei.
+
+	* src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Prevent too
+	negative values in `xpos' and `ypos + ysize'.
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Prevent
+	too negative values in `x_left' and `y_top'.  Either negative
+	values in `width' and `height' are checked.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Produce better HTML code.
+
+	* src/tools/docmaker/tohtml.py: Always use double quotes for
+	attribute values.
+	(source_footer): Close `td' and `tr' groups.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	Use better way to disable creation of .pyc files for `make refdoc'.
+
+	Python 2.6 was released in 2008...
+
+	* builds/freetype.mk (refdoc): Use python's `-B' option.
+
+	* builds/detect.mk (std_setup, dos_setup): Mention required python
+	version for `refdoc' target.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/sources.py (re_bold, re_italic): Use
+	non-grouping parentheses.
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word):
+	Updated.
+
+2014-11-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (FT_Get_Glyph_Name): Fix compiler warning.
+
+	Introduced in previous change.  Reported by Alexei.
+
+2014-11-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/*: Add checks for parameters of API functions where missing.
+
+	`API functions' are functions tagged with `FT_EXPORT_DEF'.
+
+	Besides trivial fixes, the following changes are included, too.
+
+	* src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Set
+	error code if no service is available.
+
+	* src/base/ftinit.c (FT_Done_FreeType): Change return value for
+	invalid `library' parameter to `Invalid_Library_Handle'.
+
+	* src/base/ftobjs.c (FT_New_Size): Change return value for invalid
+	`asize' parameter to `Invalid_Argument'.
+
+	* src/base/ftoutln.c (FT_Outline_Copy): Change return value for
+	invalid `source' and `target' parameters to `Invalid_Outline'.
+	(FT_Outline_Done_Internal): Change return value for invalid
+	`outline' parameter to `Invalid_Outline'.
+
+2014-11-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/cache/ftcbasic.c: Use single calls to `FT_TRACE'.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Additional
+	overflow check in the summation of POST fragment lengths,
+	suggested by Mateusz Jurczyk <mjurczyk@google.com>.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Insert comments
+	and fold too long tracing messages.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix Savannah bug #43540.
+
+	* src/base/ftmac.c (parse_fond): Prevent a buffer overrun
+	caused by a font including too many (> 63) strings to store
+	names[] table.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Use unsigned long
+	variables to read the lengths in POST fragments.  Suggested by
+	Mateusz Jurczyk <mjurczyk@google.com>.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix Savannah bug #43539.
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow
+	by a broken POST table in resource-fork.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix Savannah bug #43538.
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Fix integer overflow
+	by a broken POST table in resource-fork.
+
+2014-11-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): Avoid memory leak
+	by a broken POST table in resource-fork.  Return after freeing
+	the buffered POST table when it is found to be broken.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/Invalid_Argument/Invalid_Size_Handle/ where appropriate.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/Invalid_Argument/Invalid_Stream_Handle/ where appropriate.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/Invalid_Argument/Invalid_Library_Handle/ where appropriate.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/Invalid_Argument/Invalid_Outline/ where appropriate.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/Invalid_Argument/Invalid_Face_Handle/ where appropriate.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[Savannah bug #43682] Adjust some renderer callbacks.
+
+	* src/raster/ftraster.c (ft_black_set_mode): Change return type to
+	`int' to stay in sync with `FT_Renderer_SetModeFunc' prototype.
+
+	* src/smooth/ftgrays.c (gray_raster_set_mode): New dummy function
+	for orthogonality.
+	(ft_grays_raster): Use it.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	[Savannah bug #43682] Properly handle missing return errors.
+
+	The functions in this patch *do* return non-trivial errors that must
+	be taken care of.
+
+	* src/autofit/afloader.c (af_loader_load_g), src/base/ftobjs.c
+	(FT_Render_Glyph_Internal), src/base/ftoutln.c (FT_Outline_Render),
+	src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_endchar>,
+	src/psaux/psobjs.c (ps_parser_load_field_table), src/psaux/t1decode
+	(t1_decoder_parse_charstrings) <op_endchar>, src/truetype/ttgload.c
+	(load_truetype_glyph <subglyph loop>, tt_loader_init,
+	TT_Load_Glyph), src/truetype/ttgxvar.c (TT_Set_MM_Blend),
+	src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Do it.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	[Savannah bug #43682] Add/remove `void' casts to some functions.
+
+	We use a cast to indicate that we intentionally ignore a function's
+	return value.  However, this doesn't apply to API functions where
+	errors can only happen for trivially invalid input.
+
+	* src/base/ftstroke.c (FT_Glyph_Stroke, FT_Glyph_StrokeBorder),
+	src/base/ftsynth.c (FT_GlyphSlot_Embolden), src/cff/cffgload.c
+	(cff_slot_load), src/pfr/pfrdrivr.c (pfr_get_kerning),
+	src/type1/t1load.c (parse_encoding), src/type42/t42parse.c
+	(t42_parse_encoding): Do it.
+
+2014-11-25  Werner Lemberg  <wl@gnu.org>
+
+	[Savannah bug #43682] Change some signatures to `void' return type.
+
+	* include/internal/pshints.h (PSH_Globals_SetScaleFunc),
+	include/internal/sfnt.h (TT_Get_Metrics_Func),
+	src/pshinter/pshglob.c (psh_globals_set_scale),
+	src/pshinter/pshrec.c (ps_hints_init), src/sfnt/ttmtx.c
+	(tt_face_get_metrics), src/truetype/ttinterp.c (TT_Goto_CodeRange,
+	TT_Set_CodeRange, TT_Clear_CodeRange, TT_Done_Context,
+	TT_Save_Context): Do it.
+
+	* src/pshinter/pshglob.h, src/pshinter/pshrec.h, src/sfnt/ttmtx.h,
+	src/truetype/ttgload.c (TT_Hint_Glyph), src/truetype/ttinterp.c
+	(TT_Run_Context), src/truetype/ttinterp.h, src/truetype/ttobjs.c
+	(tt_size_run_fpgm, tt_size_run_prep): Updated.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	Remove all code related to FT_MAX_CHARMAP_CACHEABLE.
+
+	This is no longer used.
+
+	* src/base/ftobjs.c, src/cache/ftccmap.c, src/cff/cffobjs.c,
+	src/sfnt/ttcmap.c: Do it.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43680.
+
+	This adds an additional constraint to make the fix from 2013-01-25
+	really work.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_image) <index_format==4>:
+	Check `p' before `num_glyphs'.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix Savannah bug #43679.
+
+	* src/truetype/ttpload.c (tt_face_load_hdmx): Check minimum size of
+	`record_size'.
+
+2014-11-24  Jarkko Pöyry  <jarkko.poyry@gmail.com>
+
+	[cff, pfr, psaux, winfonts] Fix Savannah bug #43676.
+
+	Don't cast cmap init function pointers to an incompatible type.
+
+	Without this patch, the number of parameters between declaration and
+	the real signature differs.  Calling such a function results in
+	undefined behavior.
+
+	  ISO/IEC 9899:TC3 (Committee Draft September 7, 2007)
+	    6.5.2.2 Function calls
+	      9 If the function is defined with a type that is not
+	        compatible with the type (of the expression) pointed to by
+	        the expression that denotes the called function, the
+	        behavior is undefined.
+
+	On certain platforms (c -> js with emscripten) this causes
+	termination of execution or invalid calls because in the emscripten
+	implementation, function pointers of different types are stored in
+	different pointer arrays.  Incorrect pointer type here results in
+	indexing of an incorrect array.
+
+	* src/cff/cffcmap.c (cff_cmap_encoding_init, cff_cmap_unicode_init),
+	src/pfr/pfrcmap.c (pfr_cmap_init), src/psaux/t1cmap.c
+	t1_cmap_standard_init, t1_cmap_expert_init, t1_cmap_custom_init,
+	t1_cmap_unicode_init), src/winfonts/winfnt.c (fnt_cmap_init): Fix
+	signature.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43672.
+
+	* src/sfnt/ttkern.c (tt_face_load_kern): Use correct value for
+	minimum table length test.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[type1, type42] Another fix for Savannah bug #43655.
+
+	* src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c
+	(t42_parse_charstrings): Add another boundary testing.
+
+2014-11-24  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Formatting, copyright, improved documentation.
+
+	* src/tools/docmaker/*: No code changes besides trivial
+	modifications.
+
+2014-11-22  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Fix Savannah bug #43660.
+
+	* src/bdf/bdflib.c (_bdf_parse_glyphs) <"ENDFONT">: Check
+	`_BDF_GLYPH_BITS'.
+
+2014-11-22  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Allow only embedded TrueType fonts.
+
+	This is a follow-up to Savannah bug #43659.
+
+	* src/type42/t42objs.c (T42_Face_Init): Exclusively use the
+	`truetype' font driver for loading the font contained in the `sfnts'
+	array.
+
+2014-11-22  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Fix Savannah bug #43659.
+
+	* src/type42/t42objs.c (T42_Open_Face): Initialize `face->ttf_size'.
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Always set
+	`face->ttf_size' directly.  This ensures a correct stream size in
+	the call to `FT_Open_Face', which follows after parsing, even for
+	buggy input data.
+	Fix error messages.
+
+2014-11-22  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix Savannah bug #43658.
+
+	* src/cff/cf2ft.c (cf2_builder_lineTo, cf2_builder_cubeTo): Handle
+	return values of point allocation routines.
+
+2014-11-22  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43656.
+
+	* src/sfnt/ttcmap.c (tt_cmap4_validate): Fix order of validity
+	tests.
+
+2014-11-21  Werner Lemberg  <wl@gnu.org>
+
+	[type1, type42] Fix Savannah bug #43655.
+
+	* src/type1/t1load.c (parse_charstrings), src/type42/t42parse.c
+	(t42_parse_charstrings): Fix boundary testing.
+
+2014-11-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfread.c (pcf_get_metrics): Sanitize invalid metrics.
+
+2014-11-21  Werner Lemberg  <wl@gnu.org>
+
+	[ftlcdfil] Obey flow direction.
+
+	* src/base/ftlcdfil.c (_ft_lcd_filter_fir, _ft_lcd_filter_legacy):
+	Handle `up' flow.
+
+2014-11-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftbitmap.c (FT_Bitmap_Convert): Improve.
+
+	This commit completes argument checks and adds support for different
+	flow directions.
+
+2014-11-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftbitmap.c (FT_Bitmap_Copy): Improve.
+
+	This commit adds argument checks and support for different flow
+	directions.
+
+2014-11-20  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftbitmap.c (FT_Bitmap_New): Check argument.
+
+2014-11-19  Werner Lemberg  <wl@gnu.org>
+
+	Change some fields in `FT_Bitmap' to unsigned type.
+
+	This doesn't break ABI.
+
+	* include/ftimage.h (FT_Bitmap): Make `rows', `width', `num_grays',
+	`pixel_mode', and `palette_mode' unsigned types.
+
+	* src/base/ftbitmap.c: Updated.
+	(FT_Bitmap_Copy): Fix casts.
+
+	* src/cache/ftcsbits.c, src/raster/ftraster.c, src/sfnt/pngshim.c:
+	Updated.
+
+2014-11-19  Werner Lemberg  <wl@gnu.org>
+
+	Make `FT_Bitmap_Convert' correctly handle negative `pitch' values.
+
+	* src/base/ftbitmap.c (FT_Bitmap_Convert): Always use positive value
+	for the pitch while copying data.
+	Correctly set pitch sign in target bitmap.
+
+2014-11-19  Werner Lemberg  <wl@gnu.org>
+
+	Minor code improvement in `FT_Bitmap_Embolden'.
+
+	* src/base/ftbitmap.c (FT_Bitmap_Embolden) <FT_PIXEL_MODE_GRAY[24]>:
+	Fix thinko.
+
+2014-11-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/fttrigon.c: Use dedicated `FT_Angle' for arctan table.
+
+2014-11-19  Behdad Esfahbod  <behdad@behdad.org>
+
+	Avoid compiler warnings on x86-64 for `FT_MulFix'.
+
+	`FT_MulFix' takes `FT_Long' parameters as defined in `freetype.h',
+	but several inline implementations of it in `ftcalc.h' take
+	`FT_Int32' arguments.  This is causing compiler warnings on x86-64:
+	If parameters of type `FT_Fixed' (= `FT_Long') are passed to the
+	inline implementation of this function, integer values are truncated
+	from 64bit to 32bit.
+
+	* include/internal/ftcalc.h (FT_MulFix) [FT_MULFIX_ASSEMBLER]: Add
+	casts.
+
+2014-11-15  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43597.
+
+	* src/sfnt/pngshim.c (Load_SBit_Png): Protect against too large
+	bitmaps.
+
+2014-11-12  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43591.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_init): Protect against addition
+	and multiplication overflow.
+
+2014-11-12  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43590.
+
+	* src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir):
+	Protect against addition overflow.
+
+2014-11-12  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43589.
+
+	* src/sfnt/sfobjs.c (woff_open_font): Protect against addition
+	overflow.
+
+2014-11-12  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43588.
+
+	* src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate,
+	tt_cmap12_validate, tt_cmap13_validate, tt_cmap14_validate): Protect
+	against overflow in additions and multiplications.
+
+2014-11-10  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] CORDIC improvements.
+
+	The scaling between the hypotenuse and its CORDIC approximation is
+	based on regression analysis. The smaller padding for `theta' is
+	justified by its maximum error of less than 6.
+
+	* src/base/fttrigon.c (ft_trig_downscale): Borrow code from
+	./ftcalc.c (ft_multo64), change linear intercept.
+	(ft_trig_pseudo_polarize): Decrease `theta' padding.
+
+2014-11-09  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftstroke.c (ft_stroker_inside): Fix border intersections.
+
+	One more place to check whether `radius' is zero.
+
+	Problem reported by Marco Wertz <marco.wertz@gmx.de>.
+
+2014-11-07  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Fix Savannah bug #43535.
+
+	* src/bdf/bdflib.c (_bdf_strncmp): New macro that checks one
+	character more than `strncmp'.
+	s/ft_strncmp/_bdf_strncmp/ everywhere.
+
+2014-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Fix Savannah bug #43548.
+
+	* src/pcf/pcfread.c (pcf_get_encodings): Add sanity checks for row
+	and column values.
+
+2014-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Fix Savannah bug #43547.
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Check `size' and `offset'
+	values.
+
+2014-11-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Avoid memory leak.
+
+2014-11-03  Infinality  <infinality@infinality.net>
+
+	* src/truetype/ttsubpix.c (COMPATIBILITY_MODE_Rules): Updated.
+
+	The previous commit deteriorates rendering of DejaVu and similar
+	fonts; this gets compensated with this rule.
+
+2014-11-03  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (Ins_DELTAP): Fix subpixel hinting.
+
+	Before this patch, it was impossible to ever call DELTAP[123] in
+	subpixel hinting mode as described in the ClearType whitepaper; it
+	only worked if in `compatibility mode'.  However, compatibility mode
+	essentially disables SHPIX, completely ruining hinting of
+	ttfautohint output, for example.
+
+	We now follow the whitepaper more closely so that DELTAP[123]
+	instructions for touched points in the non-subpixel direction are
+	executed.
+
+2014-10-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Improve code readability.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code.
+
+2014-10-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Reduce outline translations during rendering.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Translate origin
+	virtually by modifying cbox, actually translate outline if cumulative
+	shift is not zero.
+
+2014-10-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Fix Savannah bug #35604 (cont'd).
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove checks and
+	casts that became unnecessary after the variable type upgrades.
+
+2014-10-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Improve code readability.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Rearrange code.
+
+2014-10-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Unify hypotenuse approximations.
+
+	* include/internal/ftcalc.h (FT_HYPOT): Move macro from here...
+	* include/internal/ftobjs.h: ... to here, next to required `FT_ABS'.
+	* src/smooth/ftgrays.c (gray_render_cubic): Use it here.
+
+2014-10-25  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Test valid darkening parameter macros in `ftoption.h'.
+
+	We no longer need an otherwise unused typedef that can cause a gcc
+	warning.
+	Problem reported by Alexei.
+
+	* src/cff/cffobjs.c (cff_driver_init): Use
+	`CFF_CONFIG_OPTION_DARKENING_PARAMETER_XXX' macros directly.
+	(SET_DARKENING_PARAMETERS): Removed.
+	Compile time tests are now ...
+
+	* devel/ftoption.h, include/config/ftoption.h: ... here.
+
+2014-10-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Improve flat corner definition.
+
+	* include/internal/ftcalc.h (FT_HYPOT): Macro to approximate Euclidean
+	distance with the alpha max plus beta min algorithm.
+	* src/base/ftcalc.c (ft_corner_is_flat): Use it instead of Taxicab
+	metric.
+
+2014-10-23  David Weiß  <David.Weiss@ptvgroup.com>
+
+	[build] Improve property file for vc2010.
+
+	User-defined properties should be empty by default to prevent linker
+	failures.
+
+	* builds/windows/vc2010/freetype.user.props,
+	builds/windows/vc2010/freetype.vcxproj:
+	s/OptionsDirectory/UserOptionDirectory/.
+	Comment out all user options.
+
+2014-10-23  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Work around bug in preprocessor of MSVC 2010.
+
+	We have been hit by
+
+	  https://connect.microsoft.com/VisualStudio/feedback/details/718976/msvc-pr
+
+	* devel/ftoption.h, include/config/ftoption.h: Replace
+	`CFF_CONFIG_OPTION_DARKENING_PARAMETERS' with eight macros
+	`CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}'.
+
+	* src/cff/cffobjs.c (SET_DARKENING_PARAMETERS): Removed.  We no
+	longer need double expansion.
+	(SET_DARKENING_PARAMETERS_0): Renamed to ...
+	(SET_DARKENING_PARAMETERS): ... this.
+	Update call.
+
+2014-10-20  Werner Lemberg  <wl@gnu.org>
+
+	[sbit] Minor fixes.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]:
+	Accept overlay format also, but emit warning message in that case.
+	(tt_sbit_decoder_load_metrics): Add missing newline to error
+	message.
+	(tt_sbit_load_sbix_image): Add `rgbl' graphic type (as used on iOS
+	7.1) to the list of unsupported formats.
+
+2014-10-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Clean up bytecode rounding.
+
+	Zero distance does not have to be treated specially if you follow
+	specifications and check the sign as the very last step of rounding.
+
+	* src/truetype/ttinterp.c (Round_None, Round_To_Grid,
+	Round_Down_To_Grid, Round_Up_To_Grid, Round_To_Double_Grid): Use
+	macros when available, do not check for non-zero distance.
+	(Round_To_Half_Grid, Round_Super, Round_Super_45): Ditto, return phase
+	if sign changed.
+
+2014-10-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Unwrap engine compensation settings.
+
+	* src/truetype/ttobjs.c (tt_size_init_bytecode): Updated.
+
+2014-10-18  David Weiß  <David.Weiss@ptvgroup.com>
+
+	[build] Add property file to vc2010 project.
+
+	This simplifies custom build configurations, especially for
+	automated build environments.
+
+	* builds/windows/vc2010/freetype.user.props: New configuration file.
+
+	* builds/windows/vc2010/freetype.vcxproj: Include
+	`freetype.user.props' and use its data fields.
+
+	* builds/windows/vc2010/index.html: Updated.
+
+2014-10-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Telugu.
+
+	This essentially moves the Telugu script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	Note that this is a first shot and quite certainly needs
+	refinements.
+
+	* src/autofit/afblue.dat: Add blue zone data for Telugu.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Telugu standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Telugu data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Telugu data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2014-10-18  David Wimsey  <david@wimsey.us>
+
+	[cmake] Add iOS build support.
+	From Savannah patch #8497.
+
+	* builds/cmake/iOS.cmake: New file.  Universal binaries are built
+	with both 32 and 64 bit arm architectures.
+
+	* CMakeLists.txt (IOS_PLATFORM): New variable for running the iOS
+	toolchain.  Possible values are `OS' to build on iOS, or
+	`SIMULATOR' to build on APPLE.
+
+2014-10-16  Behdad Esfahbod  <behdad@behdad.org>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Add `CFF_CONFIG_OPTION_DARKENING_PARAMETERS' config macro.
+
+	* devel/ftoption.h, include/config/ftoption.h
+	(CFF_CONFIG_OPTION_DARKENING_PARAMETERS): New macro.
+
+	* src/cff/cffobjs.c (SET_DARKENING_PARAMETERS,
+	SET_DARKENING_PARAMETERS_0): New macros.
+	(cff_driver_init): Use new macros.
+
+2014-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Limit delta shift range.
+
+	The valid range for delta shift is zero through six.  Negative values
+	are invalid according to
+
+	  https://developer.apple.com/fonts/TrueType-Reference-Manual/RM04/Chap4.html#delta%20shift
+
+	* src/truetype/ttobjs.h (delta_shift, delta_base): Make unsigned.
+	* src/truetype/ttinterp.h (DO_SDS): Throw an error if `delta_shift'
+	is out of range.
+	(Ins_DELTAP, Ins_DELTAC): Optimize for valid `delta_shift'.
+
+2014-10-16  Werner Lemberg  <wl@gnu.org>
+
+	A better fix for Savannah bug #43392.
+	Suggested by Doug Felt <dougfelt@gmail.com>.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Set
+	`vertAdvance' to zero...
+
+	* src/truetype/ttgload.c (TT_Load_Glyph): ... and set here a default
+	value for `vertAdvance' based on `linearVertAdvance' in case
+	`vertAdvance' is zero.  Note that the previous computed ad-hoc value
+	for `linearVertAdvance' was apparently not tested in a real-life
+	situation.
+
+2014-10-14  David Weiß  <David.Weiss@ptvgroup.com>
+
+	[build] Better optimization settings for vc2010 solution file.
+
+	* builds/windows/vc2010/freetype.sln,
+	builds/windows/vc2010/freetype.vcxproj: Updated.
+
+2014-10-14  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Adjust Devanagari character range.
+
+	* src/autofit/afranges.c (af_deva_uniranges): Omit characters that
+	are common to all other Indic scripts.
+
+2014-10-12  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #43392.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics): Don't let
+	vertical metrics uninitialized.
+
+2014-10-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Small bbox correction.
+
+	* src/base/ftbbox.c (FT_Outline_Get_BBox): Start from nonsense bbox
+	instead of initial point that could be `off' in conic outlines.
+
+2014-10-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Fix Savannah bug #43356.
+
+	* src/base/ftbbox.c (BBox_Move_To, BBox_Conic_To): Update bbox in case
+	of implicit `to'.
+	(BBox_Line_To): New emitter that does not update bbox.
+
+2014-10-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Introduce and use new macro `FT_UPDATE_BBOX'
+
+	* src/base/ftbbox.c (FT_UPDATE_BBOX): New macro.
+	(FT_Outline_Get_BBox): Use it here.
+
+2014-10-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Significant optimization of `ft_div64by32'
+
+	We shift as many bits as we can into the high register, perform
+	32-bit division with modulo there, then work through the remaining
+	bits with long division. This optimization is especially noticeable
+	for smaller dividends that barely use the high register.
+
+	* src/base/ftcalc.c (ft_div64by32): Updated.
+
+2014-10-02  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix Savannah bug #43271.
+
+	* src/cff/cf2font.c (cf2_computeDarkening): Change overflow
+	detection to use logarithms and clamp `scaledStem'.
+
+2014-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c: Remove miscellaneous type casts.
+
+2014-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Use more common `FT_MSB' implementation with masks.
+
+	* src/base/ftcalc.c (FT_MSB): Updated.
+
+2014-09-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Clean up.
+
+	* src/base/ftcalc.c (FT_MOVE_SIGN): New macro for frequently used
+	code.
+
+2014-09-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Avoid unnecessary long division.
+
+	This applies to `FT_MulDiv' but not to `FT_DivFix', where overflows or
+	lack thereof are predicted accurately.
+
+	* src/base/ftcalc.c (ft_div64by32): Improve readability.
+	(FT_MulDiv, FT_MulDiv_No_Round) [!FT_LONG64]: Use straight division
+	when multiplication stayed within 32 bits.
+
+2014-09-24  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor clean-ups.
+
+	* src/autofit/afhints.c (AF_FLAGS): Remove obsolete values.
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_points,
+	af_glyph_hints_align_strong_points): Updated.
+
+	* src/autofit/aflatin.c (af_latin_hints_link_segments,
+	af_latin_hints_compute_segments), src/autofit/afcjk.c
+	(af_cjk_hints_link_segments), src/autofit/aflatin2.c
+	(af_latin2_hints_link_segments, af_latin2_hints_compute_segments):
+	There are no longer fake segments since more than 10 years...
+
+2014-09-22  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor code streamlining.
+
+	* src/autofit/afhints.c (af_axis_hints_new_edge): Remove redundant
+	initialization.
+
+2014-09-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c: Harmonize code.
+
+2014-09-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Tighten the overflow check in `FT_MulDiv'.
+
+	* src/base/ftcalc.c (FT_MulDiv) [!FT_LONG64]: Updated.
+
+2014-09-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Fix Savannah bug #43153.
+
+	* src/psaux/psconv.c (PS_Conv_ToFixed): Add protection against
+	overflow in `divider'.
+
+2014-09-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Tighten the overflow check in `FT_DivFix'.
+
+	This fixes a 13-year old bug. The original overflow check should have
+	been updated when rounding was introduced into this function
+	(c2cd00443b).
+
+	* src/base/ftcalc.c (FT_DivFix) [!FT_LONG64]: Updated.
+	* include/freetype.h (FT_DivFix): Updated documentation.
+
+2014-09-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Tighten the overflow check in `FT_MulFix'.
+
+	* src/base/ftcalc.c (FT_MulFix) [!FT_LONG64]: Updated.
+
+2014-09-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Shortcut ppem calculations for square pixels.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): New field
+	`cur_ppem_func' with a function pointer.
+	* src/truetype/ttinterp.c (TT_RunIns): Initialize `cur_ppem_func'
+	depending on the pixel geometry to either...
+	(Current_Ppem_Stretched): ... this for stretched pixels.
+	(Current_Ppem): ... or this for square pixels.
+	(DO_MPPEM, DO_MPS, Ins_DELTAP, Ins_DELTAC): Use `cur_ppem_func'.
+
+2014-08-31  Behdad Esfahbod  <behdad@behdad.org>
+
+	Don't use `register' keyword.  Fixes compiler warnings.
+
+	* src/base/ftcalc.c (FT_Add64) [!FT_LONG64]: Do it.
+	* src/gzip/inftrees.c (huft_build): Ditto.
+	* src/truetype/ttinterp.c (TT_MulFix14_arm): Ditto.
+
+2014-08-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Optimize DELTAP and DELTAC.
+
+	* src/truetype/ttinterp.c (Ins_DELTAP, Ins_DELTAC): Move ppem
+	calculations outside of the loop.
+
+2014-08-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Fix Savannah bug #43033.
+
+	* include/config/ftconfig.h, builds/unix/ftconfig.in,
+	builds/vms/ftconfig.h [FT_LONG64]: Do not disable the macro when
+	64-bit type is `long'.
+
+2014-08-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Small optimization of `FT_MulFix'.
+
+	* src/base/ftcalc.c (FT_MulFix): Loosen up the condition for direct
+	32-bit calculations.
+
+2014-08-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Use unsigned calculation in `FT_MulDiv'.
+
+	* src/base/ftcalc.c (FT_MulDiv): Updated to expand 32-bit range.
+
+2014-08-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Remove truncation in `FT_DivFix'.
+
+	* src/base/ftcalc.c (FT_DivFix): Updated.
+
+2014-08-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Minor refactoring.
+
+	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Updated.
+
+2014-08-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Turn FT_MSB into a macro when using gcc builtins.
+
+	* src/base/ftcalc.c, include/internal/ftcalc.h: Updated.
+
+2014-08-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Avoid undefined FT_MSB in `BBox_Cubic_Check'.
+
+	* src/base/ftbbox.c (BBox_Cubic_Check): Update.
+	(update_cubic_max): Replace with...
+	(cubic_peak): ... this, which now handles upscaling.
+
+2014-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Handle collapsed outlines to avoid undefined FT_MSB.
+
+	* src/base/ftoutln.c (FT_Outline_Get_Orientation): Update.
+
+2014-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Restore FT_MulFix inlining.
+
+	* include/freetype.h (FT_MulFix): Unconditionally defined.
+
+	* src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: Move code from here...
+
+	* include/internal/ftcalc.h [FT_MULFIX_ASSEMBLER]: ... to here,
+	which conditionally replaces the function with an inline version
+	through the macro.
+
+2014-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Refactor.
+
+2014-07-26  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix typo.
+
+	* src/cff/cf2hints.c (cf2_glyphpath_computeOffset): Use correct
+	offsets in third quadrant.
+
+	Reported by maks <maksqwe1@ukr.net>.
+
+2014-07-17  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #42788.
+
+	* src/pfr/pfrobjs.c: Include `ftcalc.h'.
+
+2014-07-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Replace `ft_highpow2' function.
+
+	* src/pfr/pfrobjs.c (pfr_face_get_kerning): Use `FT_MSB' instead of
+	`ft_highpow2'.
+
+	* src/base/ftutil.c, include/internal/ftobjs.h (ft_highpow2): Remove
+	it.
+
+2014-07-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c (FT_MSB): Utilize gcc builtins.
+
+2014-07-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Move assembler code back in the source file.
+
+	FT_MulFix assembler used to reside in ftcalc.c before f47d263f1b.
+
+	* include/config/ftconfig.h, builds/unix/ftconfig.in,
+	builds/vms/ftconfig.h [FT_MULFIX_ASSEMBLER]: Move code from here...
+
+	* src/base/ftcalc.c [FT_MULFIX_ASSEMBLER]: ... to here.
+
+2014-07-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Further clean up color bitmap conversion.
+
+	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Stop
+	using FT_MulFix and FT_DivFix since all calculations fit into 32 bits.
+
+2014-07-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve handling of buggy `prep' tables.
+
+	In case of an error in the `prep' table, no longer try to execute it
+	again and again.  This makes FreeType handle endless loops in buggy
+	fonts much faster.
+
+	* src/truetype/ttobjs.h (TT_SizeRec): The fields `bytecode_ready'
+	and `cvt_ready' are now negative if not initialized yet, otherwise
+	they indicate the error code of the last run.
+
+	* src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep,
+	tt_size_done_bytecode, tt_size_init_bytecode,
+	tt_size_ready_bytecode, tt_size_init, tt_size_done, tt_size_reset):
+	Updated.
+
+	* src/truetype/ttgload.c (tt_loader_init): Updated.
+	* src/truetype/ttinterp.c (TT_RunIns): Force reexecution of `fpgm'
+	and `prep' only if we are in the `glyf' table.
+
+2014-07-12  Werner Lemberg  <wl@gnu.org>
+
+	* builds/vms/ftconfig.h: Synchronize.
+	Problem reported by Alexei.
+
+2014-07-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Clean up bitmap conversion.
+
+	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use
+	appropriate FT_DivFix and remove superfluous upscaling.
+
+2014-07-04  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Small optimization of the ancient code.
+
+	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round): Loosen up the
+	condition for direct 32-bit calculations.
+
+2014-06-27  Werner Lemberg  <wl@gnu.org>
+
+	Fix Apple standard glyph names.
+
+	* src/sfnt/ttpost.c (tt_post_default_names): Synchronize with
+	`tools/glnames.py'
+
+	Problem reported by Adam Twardoch <adam@fontlab.com>.
+
+2014-06-17  Werner Lemberg  <wl@gnu.org>
+
+	Partially revert commit from 2014-06-13.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Move
+	declaration of `p_first' and `p_last' out of the loop.
+
+2014-06-17  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/freetype2.m4: s/AC_PATH_PROG/AC_PATH_TOOL/.
+
+	This simplifies cross-compiling.
+
+2014-06-13  Werner Lemberg  <wl@gnu.org>
+
+	Fix more compiler warnings.
+	Reported by Wojciech Mamrak <wmamrak@gmail.com>.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	Make integer constant unsigned.
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
+	<TT_SBIT_TABLE_TYPE_SBIX>: Fix types.
+	(tt_sbit_decoder_load_compound, tt_face_load_sbix_image): Add proper
+	casts.
+
+2014-06-13  Werner Lemberg  <wl@gnu.org>
+
+	Fix compiler warnings.
+	Reported by Wojciech Mamrak <wmamrak@gmail.com>.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage),
+	src/autofit/afmodule.c (af_property_set): Fix `signed' vs.
+	`unsigned' issues.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Make compiler
+	happy.
+
+	* src/base/ftlcdfil.c (_ft_lcd_filter_fir): Use only four elements
+	for `fir'.
+	Fix `signed' vs. `unsigned' issues.
+
+	* src/sfnt/sfobjs.c (WRITE_BYTE): Removed, unused.
+	(WRITE_USHORT, WRITE_ULONG): Add proper casts.
+
+	* src/truetype/ttgload.c (TT_Get_VMetrics): Add proper casts.
+
+	* src/truetype/ttinterp.c (Ins_DELTAP): Add proper casts for `B1'
+	and `B2'.
+
+2014-05-16  Alexey Petruchik  <alexey.petruchik@gmail.com>
+
+	[cmake] Add option to build OS X framework.
+
+	* CMakeLists.txt: Update accordingly.
+
+	* builds/mac/freetype-Info.plist: New file.
+
+2014-05-13  Pavel Koshevoy  <pkoshevoy@gmail.com>
+
+	* CMakeLists.txt (BASE_SRCS): Add missing `ftbdf.c'.
+
+2014-05-11  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix variable initializations.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Assign default
+	values to `in_dir' and `out_dir' for all points.
+
+2014-05-11  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix crash with font `CabinSketch-Bold.ttf'.
+
+	Problem reported by Ralf S. Engelschall <rse@engelschall.com>.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Fix threshold for
+	finding first non-near point.
+	Properly initialize non-near point deltas.
+
+2014-05-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Devanagari.
+
+	This essentially moves the Devanagari script from the `Indic' hinter
+	to the `Latin' hinter.  Thanks to Girish Dalvi
+	<girish.dalvi@gmail.com> for guidance with blue zone characters!
+
+	* src/autofit/afblue.dat: Add blue zone data for Devanagari.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Devanagari standard characters and
+	move data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Devanagari data out of
+	AF_CONFIG_OPTION_INDIC block.
+	Move U+20B9, (new) Rupee sign, from Latin to Devanagari.
+
+	* src/autofit/afstyles.h: Update Devanagari data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2014-05-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix handling of neutral blue zones in stems.
+
+	* src/autofit/afhints.h (AF_Edge_Flags): New value
+	`AF_EDGE_NEUTRAL'.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_blue_edges): Trace
+	neutral blue zones with AF_EDGE_NEUTRAL.
+	(af_latin_hint_edges): Skip neutral blue zones if necessary.
+
+2014-04-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce neutral blue zones to the latin module.
+
+	Such blue zones match either the top or the bottom of a contour.  We
+	need them for scripts where accent-like elements directly touch the
+	base character (for example, some vowel signs in Devanagari, cf.
+	U+0913 or U+0914).
+
+	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_NEUTRAL): New
+	property.
+
+	* src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/aflatin.h (AF_LATIN_IS_NEUTRAL_BLUE): New macro.
+	(AF_LATIN_BLUE_NEUTRAL): New enumeration value.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues,
+	af_latin_hints_compute_blue_edges): Handle neutral blue zones.
+
+2014-04-25  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/hbshim.c: Partially revert commit from 2014-04-17.
+
+	Using input glyph coverage data is simply wrong.
+
+	Problem reported by Nikolaus Waxweiler <madigens@gmail.com> and
+	Mantas Mikulėnas <grawity@gmail.com>.
+
+2014-04-23  Werner Lemberg  <wl@gnu.org>
+
+	* src/raster/ftraster.c (Vertical_Sweep_Span): Use drop-out mode.
+
+	This spot has been missed while introducing support for various
+	drop-out modes years ago (including no drop-out mode, which this
+	commit fixes).
+
+	Problem reported by Patrick Thomas <pthomas505@gmail.com>.
+
+2014-04-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/pngshim.c (error_callback): s/longjmp/ft_longjmp/.
+
+2014-04-20  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix Savannah bug #42148.
+
+	The adaptation of the cjk auto-hinter module to blue stringsets in
+	2013-08-25 had three severe bugs.  Mea culpa.
+
+	1. Contrary to the latin auto-hinter, characters for reference and
+	   overshoot values of a blue zone are specified separately.  Due to
+	   the screwed-up change it didn't work at all.
+
+	2. A boolean comparison was erroneously replaced with a cast,
+	   causing invalid results with the `^' operator later on.  The
+	   visual artifact caused by this problem is the topic of the bug
+	   report.
+
+	3. Two flag values were inverted, causing incorrect assignment of
+	   reference and overshoot values.
+
+	* src/autofit/afblue.dat: Fix CJK bluestrings, introducing a new
+	syntax to have both reference and overshoot characters in a single
+	string.  This is error #1.
+	Add extensive comments.
+
+	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_CJK_FILL): Removed, no
+	longer used.
+	(AF_BLUE_PROPERTY_CJK_TOP, AF_BLUE_PROPERTY_CJK_HORIZ): Fix values.
+	This is error #3.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_blues): Correct error #1.
+	Use character `|' to separate characters for reference and overshoot
+	values.
+	Improve tracing messages, synchronizing them with the latin
+	auto-hinter.
+	(af_cjk_hints_compute_blue_edges): Fix value of `is_top_right_blue'.
+	This is error #2.
+	(af_cjk_align_linked_edge): Add tracing message.
+
+	* src/autofit/afcjk.h (AF_CJK_IS_FILLED_BLUE): Removed, no longer
+	used.
+
+2014-04-17  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] More coverage fixes for complex scripts.
+
+	* src/autofit/hbshim.c (af_get_coverage): Merge input glyph coverage
+	of GSUB lookups into output coverage.  Otherwise, ligatures are not
+	handled properly.
+	Don't check blue zone characters for default coverage.
+
+2014-04-17  Werner Lemberg  <wl@gnu.org>
+
+	Make `FT_Get_SubGlyph_Info' actually work.
+
+	* src/base/ftobjs.c (FT_Get_SubGlyph_Info): Return FT_Err_Ok
+	if there is no error.
+
+2014-04-15  Werner Lemberg  <wl@gnu.org>
+
+	[afblue.pl]: Minor improvements.
+
+	* src/tools/afblue.pl: Allow whitespace before comments.
+	Ignore whitespace in strings.
+
+2014-04-14  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve coverage handling.
+
+	* src/autofit/hbshim.c (af_get_coverage): Don't exclude glyphs
+	appearing in the GPOS table if we are processing the default
+	coverage.
+
+2014-04-13  David Weber  <weber.aulendorf@googlemail.com>
+
+	[smooth] Fix stand-alone compilation.
+
+	* src/smooth/ftgrays.c (FT_BEGIN_STMNT, FT_END_STMNT): Define.
+
+2014-04-12  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Redesign the recognition algorithm of strong points.
+
+	In particular, local extrema without horizontal or vertical segments
+	are better recognized:
+
+	  + A                + D
+	   \                /
+	    \              /
+	     \            /
+	      \          /
+	       \        + C
+	        \    /
+	       B +/
+
+	If the distances AB and CD are large, point B wasn't previously
+	detected as an extremum since the `ft_corner_is_flat' function
+	`swallowed' BC regardless of its direction, tagging point B as weak.
+	The next iteration started at B and made `ft_corner_is_flat' swallow
+	point C, tagging it as weak also, et voilà.
+
+	To improve that, another pass gets now performed before calling
+	`ft_corner_is_flat' to improve the `topology' of an outline: A
+	sequence of non-horizontal or non-vertical vectors that point into
+	the same quadrant are handled as a single, large vector.
+
+	Additionally, distances of near points are now accumulated, which
+	makes the auto-hinter handle them as if they were prepended to the
+	next non-near vector.
+
+	This generally improves the auto-hinter's rendering results.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Implement it.
+
+	* src/autofit/afhints.h (AF_FLAGS): Remove no longer used flag
+	`AF_FLAG_NEAR'.
+
+2014-04-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve scoring algorithm for identifying stems.
+
+	Problem reported by Karsten Lücke <karsten.luecke@kltf.de>.
+
+	The new algorithm takes care of the width of stems: If the distance
+	between two segments is larger than the largest stem width, the
+	demerits quickly increase for larger distances.  This improves
+	hinting of slanted fonts (especially if the inner parts of serifs
+	have non-horizontal `shoulders'), avoiding false stem links.
+
+	* src/autofit/aflatin.c (af_latin_hints_link_segments): Use largest
+	stem width (if available) to compute better demerits for distances
+	between stems.
+	(af_latin_hints_detect_features): Pass stem width array and array
+	size.
+	(af_latin_metrics_init_widths): Updated to use original algorithm.
+	(af_latin_hints_apply): Updated to use new algorithm.
+
+	* src/autofit/aflatin.h: Updated.
+	* src/autofit/afcjk.c: Updated.
+
+2014-04-03  Werner Lemberg  <wl@gnu.org>
+
+	Don't require `gzip' module for `sfnt'.
+
+	Reported by Preet <prismatic.project@gmail.com>.
+
+	* src/sfnt/sfobjs.c (woff_open_font): Guard use of
+	FT_Gzip_Uncompress with FT_CONFIG_OPTION_USE_ZLIB.
+
+2014-03-27  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #38235.
+
+	Work around a bug in pkg-config version 0.28 and earlier: If a
+	variable value gets surrounded by doublequotes (in particular values
+	for the `prefix' variable), the prefix override mechanism fails.
+
+	* builds/unix/freetype2.in: Don't use doublequotes.
+	* builds/unix/unix-def.in (freetype.pc): Escape spaces in directory
+	names with backslashes.
+
+2014-03-24  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41946.
+
+	Based on a patch from Marek Kašík <mkasik@redhat.com>.
+
+	* builds/unix/configure.raw (LIBS_CONFIG): Remove.
+	* builds/unix/freetype-config.in (libs): Hard-code value.
+	* builds/unix/unix-def.in: Updated.
+
+2014-03-22  Werner Lemberg  <wl@gnu.org>
+
+	Another revert for the change from 2014-03-18.
+
+	Problem reported by Nikolaus Waxweiler <madigens@gmail.com>.
+
+	* src/base/ftcalc.c (FT_MulFix): Ensure that an `FT_MulFix' symbol
+	gets always exported.
+
+2014-03-20  Werner Lemberg  <wl@gnu.org>
+
+	CMakeLists.txt: Another fix for include directories.
+
+	Problem reported by Taylor Holberton <taylorcholberton@gmail.com>.
+
+2014-03-19  Werner Lemberg  <wl@gnu.org>
+
+	CMakeLists.txt: Fix include directories.
+
+	Problem reported by Taylor Holberton <taylorcholberton@gmail.com>.
+
+2014-03-19  Werner Lemberg  <wl@gnu.org>
+
+	Partially revert last commit.
+
+	Found by Alexei.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Initializing
+	those variables is plain wrong, since we are in a loop.
+
+2014-03-18  Sean McBride  <sean@rogue-research.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Fix clang warnings.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize
+	some variables.
+
+	* src/base/ftcalc.c (FT_MulFix): Only use code if
+	`FT_MULFIX_INLINED' is not defined.
+
+	* src/bdf/bdfdrivr.c (bdf_cmap_class), src/cache/ftcbasic.c
+	(ftc_basic_image_family_class, ftc_basic_image_cache_class,
+	ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class),
+	src/cache/ftccmap.c (ftc_cmap_cache_class), src/cache/ftcmanag.c
+	(ftc_size_list_class, ftc_face_list_class), src/pcf/pcfdrivr.c
+	(pcf_cmap_class), src/pfr/pfrdrivr.c (pfr_metrics_service_rec): Make
+	function static.
+
+	* src/type1/t1driver.c (t1_ps_get_font_value): Remove redundant
+	code.
+
+2014-03-17  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41869.
+
+	This works around a problem with HarfBuzz (<= 0.9.26), which doesn't
+	validate glyph indices returned by
+	`hb_ot_layout_lookup_collect_glyphs'.
+
+	* src/autofit/hbshim.c (af_get_coverage): Guard `idx'.
+
+	* docs/CHANGES: Updated.
+
+2014-03-14  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/configure.raw: Don't show error messages of `which'.
+
+2014-03-09  Alan Coopersmith  <alan.coopersmith@oracle.com>
+
+	Fix cppcheck 1.64 warning.
+
+	* src/autofit/afglobal.c (af_face_globals_new): Catch NULL pointer
+	dereference in case of error.
+
+2014-03-09  Sean McBride  <sean@rogue-research.com>
+
+	* src/sfnt/ttcmap.c (tt_face_build_cmaps): Remove clang warning.
+
+2014-03-06  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.3 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-3'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.3.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.2/2.5.3/, s/252/253/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
+
+	* builds/unix/configure.raw (version_info): Set to 17:2:11.
+	* CMakeLists.txt (VERSION_PATCH): Set to 3.
+	* docs/CHANGES: Updated.
+
+2014-03-06  Werner Lemberg  <wl@gnu.org>
+
+	Fixes for compilation with C++.
+
+	* src/autofit/hbshim.c (scripts): Change type to `hb_script_t'.
+	(af_get_coverage): Updated.
+	(COVERAGE): Add cast.
+
+2014-03-06  Sean McBride  <sean@rogue-research.com>
+
+	Remove more clang analyzer warnings.
+
+	* src/bdf/bdflib.c (_bdf_readstream), src/truetype/ttgload.c
+	(TT_Load_Glyph): Remove dead stores.
+
+2014-03-05  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/configure.raw: Simplify.
+
+2014-03-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Fix a bug in configure in library dependency setting
+	Reported in https://bugs.freedesktop.org/show_bug.cgi?id=75652.
+
+	* builds/unix/configure.raw: Use `x"${xxx}" != xno' style.
+
+2014-03-04  Werner Lemberg  <wl@gnu.org>
+
+	Minor fix for `make devel'.
+
+	* builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Don't use
+	pkg-config for bzip2 since not all GNU/Linux distributions have
+	`bzip2.pc' (and the header file `bzlib.h' is located in /usr/include
+	normally).
+
+2014-03-04  Sean McBride  <sean@rogue-research.com>
+
+	Fix several clang static analyzer dead store warnings.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload,
+	af_glyph_hints_align_weak_points): Remove unnecessary assignments.
+
+	* src/bdf/bdflib.c (bdf_font_load): Ditto.
+
+	* src/pshinter/pshalgo.c (psh_glyph_compute_extrema,
+	psh_glyph_interpolate_other_points): Ditto.
+
+	* src/type1/t1load.c (T1_Set_MM_Blend): Ditto.
+
+2014-03-03  Werner Lemberg  <wl@gnu.org>
+
+	Rewrite library option handling in `configure'.
+
+	o Introduce `auto' value for `--with-XXX' library options; this is
+	  now the default.
+
+	o First use `pkg-config' for library detection, then fall back to
+	  other tests.
+
+	* builds/unix/configure.raw (--with-zlib, --with-bzip2, --with-png,
+	--with-harfbuzz): Rewrite.
+	Use new `xxx_reqpriv', `xxx_libpriv', and `xxx_libstaticconf'
+	variables to collect data for `freetype2.pc' and `freetype-config'.
+	(FT2_EXTRA_LIBS): Renamed to ...
+	(ft2_extra_libs): This since it gets no longer substituted.
+	(REQUIRES_PRIVATE, LIBS_PRIVATE, LIBS_CONFIG, LIBSSTATIC_CONFIG):
+	New output variables, replacing `XXX_PKG' and `LIBXXX'.
+	Add notice at the end of `configure' showing the library
+	configuration.
+
+	* builds/unix/freetype-config.in (--static): New command line
+	option.
+	(libs): Updated.
+	(staticlibs): New variable, to be used if `--static' is given.
+	* docs/freetype-config.1: Document `--static'.
+
+	* builds/unix/freetype2.in, builds/unix/unix-def.in: Updated.
+
+2014-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Avoid `long long' warnings with older gcc compilers.
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* builds/unix/configure.raw: Don't use gcc's `-pedantic' flag for
+	versions < 4.6.  This is especially needed for Max OS X since this
+	OS runs a gcc variant (or emulation) based on version 4.2.1.
+
+2014-03-01  Werner Lemberg  <wl@gnu.org>
+
+	* docs/INSTALL.CROSS: Revised and updated.
+
+2014-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Make `make clean' remove `freetype2.pc'.
+
+	This is a generated file at build time, not configure time.
+
+	* builds/unix/unix-def.in (DISTCLEAN): Move `freetype2.pc' to ...
+	(CLEAN): This variable.
+
+2014-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Use pkg-config for detecting libpng and libbz2 also.
+
+	* builds/unix/configure.raw (HAVE_PKG): New variable.
+	Search for libbz2 using `pkg-config'; s/BZ2/BZIP2/.
+	Search for libpng using `pkg-config'.
+	Fix definition of `LIBHARFBUZZ' variable.
+	* builds/unix/freetype-config.in ($libs): Updated.
+	* builds/unix/freetype2.in: Add `URL' field.
+	Update `Requires.private' and `Libs.private'.
+	* builds/unix/unix-def.in: Updated.
+
+2014-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Add configure support for HarfBuzz.
+
+	* builds/unix/pkg.m4: New file.
+	* builds/unix/configure.raw: Search for libharfbuzz using
+	`pkg-config'.
+	Add `--without-harfbuzz' option.
+	* builds/unix/freetype-config.in, builds/unix/freetype2.in,
+	builds/unix/unix-def.in (freetype-config, freetype2.pc): Handle
+	HarfBuzz.
+
+	* docs/INSTALL.UNIX: Document interdependency of FreeType with
+	HarfBuzz.
+
+2014-02-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[cff] Math simplifications.
+
+	* src/cf2blues.c (cf2_blues_init): Use `FT_MulDiv'.
+	* src/cf2ft.c (cf2_getScaleAndHintFlag): Use simple division.
+
+2014-02-28  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix Savannah bug #41697, part 2.
+
+	* src/cff/cf2ft.c (cf2_initLocalRegionBuffer,
+	cf2_initGlobalRegionBuffer): It is possible for a charstring to call
+	a subroutine if no subroutines exist.  This is an error but should
+	not trigger an assert.  Split the assert to account for this.
+
+2014-02-28  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix Savannah bug #41697, part 1.
+
+	* src/cff/cf2hints.c (cf2_hintmap_build): Return when `hintMask' is
+	invalid.  In this case, it is not safe to use the length of
+	`hStemHintArray'; the exception has already been recorded in
+	`hintMask'.
+
+2014-02-26  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #41696.
+
+	* src/sfnt/ttcmap.c (tt_cmap0_validate, tt_cmap2_validate,
+	tt_cmap4_validate, tt_cmap14_validate): Fix limit tests.
+
+2014-02-26  Werner Lemberg  <wl@gnu.org>
+
+	[winfnt] Fix Savannah bug #41694.
+
+	* src/winfonts/winfnt.c (FNT_Load_Glyph): Check glyph offset.
+
+2014-02-26  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix Savannah bug #41693.
+
+	* src/cff/cffload.c (CFF_Load_FD_Select): Reject empty array.
+
+2014-02-26  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Fix Savannah bug #41692.
+
+	bdflib puts data from the input stream into a buffer in chunks of
+	1024 bytes.  The data itself gets then parsed line by line, simply
+	increasing the current pointer into the buffer; if the search for
+	the final newline character exceeds the buffer size, more data gets
+	read.
+
+	However, in case the current line's end is very near to the buffer
+	end, and the keyword to compare with is longer than the current
+	line's length, an out-of-bounds read might happen since `memcmp'
+	doesn't stop properly at the string end.
+
+	* src/bdf/bdflib.c: s/ft_memcmp/ft_strncmp/ to make comparisons
+	stop at string ends.
+
+2014-02-17  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[autofit] Fix `make multi' compilation.
+
+	* src/autofit/hbshim.c: Include `afglobal.h' and `aftypes.h'.
+
+2014-02-19  Werner Lemberg  <wl@gnu.org>
+	    Simon Bünzli  <zeniko@gmail.com>
+
+	Fix Savannah bug #32902.
+
+	Patch taken from
+
+	  https://code.google.com/p/sumatrapdf/source/browse/trunk/ext/_patches/freetype2.patch?spec=svn8620&r=8620#87
+
+	with slight modifications.
+
+	* src/type1/t1parse.c (T1_Get_Private_Dict): Add heuristic test to
+	handle fonts that incorrectly use \r at the beginning of an eexec
+	block.
+
+2014-02-19  Simon Bünzli  <zeniko@gmail.com>
+
+	Fix Savannah bug #41590.
+
+	* src/type1/t1load.c (parse_encoding): Protect against invalid
+	number.
+
+2014-02-12  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Optimize by using `FT_MulDiv'.
+	Suggested by Alexei.
+
+	* src/cff/cf2font.c (cf2_computeDarkening): Do it.
+
+2014-02-12  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41465.
+
+	* builds/unix/unix-def.in (CLEAN): Add `freetype-config'.
+	(DISTCLEAN): Remove `freetype-config'.
+
+2014-02-08  Sean McBride  <sean@rogue-research.com>
+
+	Fix clang static analyzer and compiler warnings.
+
+	* src/autofit/afhints.c (af_glyph_hints_align_weak_points),
+	src/autofit/afloader (af_loader_load_g) <FT_GLYPH_FORMAT_COMPOSITE>,
+	src/base/ftcalc.c (FT_MSB), src/base/ftoutln.c
+	(FT_Outline_Decompose), src/bdf/bdfdrivr.c (bdf_interpret_style),
+	src/cff/cffparse.c (cff_parse_integer), src/cid/cidparse.c
+	(cid_parser_new), src/pfr/pfrload.c (pfr_phy_font_load),
+	src/raster/ftraster.c (Decompose_Curve), src/sfnt/sfdriver.c
+	(sfnt_get_ps_name), src/sfnt/ttcmap.c (tt_cmap12_next,
+	tt_cmap13_next), src/smooth/ftgrays.c (gray_hline): Remove dead
+	code.
+
+	* src/autofit/afmodule.c (af_property_get_face_globals,
+	af_property_set, af_property_get), src/base/ftbitmap.c
+	(ft_gray_for_premultiplied_srgb_bgra): Make functions static.
+
+	* src/base/ftobjs.c (ft_remove_renderer): Protect against
+	library == NULL.
+	(ft_property_do): Make function static.
+
+	* src/base/ftrfork.c: Include `ftbase.h'.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbix_image)
+	[!FT_CONFIG_OPTION_USE_PNG], src/type1/t1gload.c
+	(T1_Compute_Max_Advance): Avoid compiler warning.
+
+	* src/truetype/ttinterp.c (TT_New_Context): Reduce scope of
+	variable.
+
+2014-02-08  Werner Lemberg  <wl@gnu.org>
+
+	Fix Windows build directories.
+
+	The build target is now `windows' instead of `win32'.
+
+	Problem reported by Nickolas George <darknova.clan@gmail.com>.
+
+	* builds/modules.mk: Don't use `win32' and `win16' (!) but
+	`windows'.
+
+	* builds/windows/detect.mk, builds/windows/win32-def.mk:
+	s/win32/windows/.
+
+2014-02-08  Eugen Sawin  <esawin@mozilla.com>
+
+	Fix Savannah bug #41507.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap)
+	[!FT_CONFIG_OPTION_USE_PNG] <17, 17, 19>: Fix error handling.
+
+2014-02-08  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix minor performance bug.
+
+	* src/cff/cf2font.c (cf2_font_setup): Darkening amount and blue zone
+	calculations are now cached and not recomputed on each glyph.
+
+2014-02-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix problems with perl 5.8.8 as distributed with current MinGW.
+
+	* src/tools/afblue.pl: Work-around for Perl bug #63402.
+	(string_re): Avoid `possessive quantifiers', which have been
+	introduced in Perl version 5.10.
+
+2014-02-04  Werner Lemberg  <wl@gnu.org>
+
+	Fix compilation with MinGW.
+
+	Right now, compilation out of the box with latest MinGW is broken
+	due to bugs in header files of mingwrt 4.0.3 in strict ANSI mode,
+	cf.
+
+	  https://sourceforge.net/p/mingw/bugs/2024/
+	  https://sourceforge.net/p/mingw/bugs/2046/
+
+	* builds/unix/configure.raw: Don't set `-ansi' flag for MinGW.
+
+2014-02-04  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor fix.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
+	src/autofit/aflatin.c (af_latin_metrics_init_widths): Fix handling
+	of alternative standard characters.
+	This also fixes a compilation warning in non-debug mode.
+
+2014-02-03  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix Savannah bug #41363.
+
+	* src/cff/cf2ft.c (cf2_checkTransform): Convert assertion into
+	parameter check.
+	(cf2_decoder_parse_charstrings): Call `cf2_checkTransform' only if
+	we are scaling the outline.
+	(cf2_getPpemY): Remove problematic assertion.
+
+2014-01-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce two more slots for standard characters.
+
+	This is useful for OpenType features like `c2sc' (caps to small
+	caps) that don't have lowercase letters by definition, or other
+	features that mainly operate on numerals.
+
+	* src/autofit/afscript.h: Add more standard characters.
+
+	* src/autofit/aftypes.h: Update use of `SCRIPT' macro.
+	(AF_ScriptClassRec): Add members to hold two more standard
+	characters.
+	(AF_DEFINE_SCRIPT_CLASS): Updated.
+
+	* src/autofit/afglobal.c, src/autofit/afglobal.h,
+	* src/autofit/afpic.c, src/autofit/afranges.h, src/autofit/hbshim.c:
+	Update use of `SCRIPT' macro.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
+	src/autofit/aflatin.c (af_latin_metrics_init_widths): Scan two more
+	standard characters.
+
+2014-01-24  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41320.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues)
+	<AF_LATIN_IS_LONG_BLUE>: Avoid negative index of `last'.
+
+2014-01-23  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41310.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap) <glyph_format==5>:
+	Don't check metrics, which this format doesn't have.
+	This is another correction to the commit from 2013-11-21.
+
+2014-01-23  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41309.
+
+	* src/type1/t1load.c (t1_parse_font_matrix): Properly handle result
+	of `T1_ToFixedArray'.
+
+	* src/cid/cidload.c (cid_parse_font_matrix): Synchronize with
+	`t1_parse_font_matrix'.
+
+	* src/type42/t42parse.c (t42_parse_font_matrix): Synchronize with
+	`t1_parse_font_matrix'.
+	(t42_parse_encoding): Synchronize with `t1_parse_encoding'.
+
+	* src/psaux/psobjs.c (ps_parser_load_field) <T1_FIELD_TYPE_BBOX>,
+	<T1_FIELD_TYPE_MMOX>: Properly handle result of `ps_tofixedarray'.
+
+2014-01-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/hbshim.c (af_get_coverage): Fix memory leaks.
+
+2014-01-16  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve tracing of style coverages.
+
+	* include/internal/fttrace.h: Add `afglobal' for tracing style
+	coverages.
+
+	* src/autofit/afglobal.c: Include FT_INTERNAL_DEBUG_H.
+	(FT_COMPONENT): Define.
+	(af_face_globals_compute_style_coverage): Trace `gstyles' array
+	data.
+
+2014-01-09  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #41158.
+
+	* builds/unix/install.mk (install): Create man page directory.
+
+2014-01-08  Chongyu Zhu  <lembacon@gmail.com>
+
+	[arm] Fix Savannah bug #41138, part 2.
+
+	* builds/unix/ftconfig.in (FT_MulFix_arm), include/config/ftconfig.h
+	(FT_MulFix_arm), src/truetype/ttinterp.c (TT_MulFix14_arm): Fix
+	preprocessor conditionals for `add.w'.
+
+2014-01-08  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix Savannah bug #41138, part 1.
+
+	* src/tools/afblue.pl <Handling #endif>: Produce correct auxiliary
+	enumeration names for generated `#else'.
+
+	* src/autofit/afblue.h: Regenerated.
+
+2014-01-06  Werner Lemberg  <wl@gnu.org>
+
+	Add manual page for `freetype-config'.
+	Contributed by Nis Martensen <nis.martensen@web.de>.
+
+	* docs/freetype-config.1: New file.
+
+	* builds/unix/unix-def.in (mandir): Define.
+	* builds/unix/install.mk (install, uninstall): Handle manpage.
+
+2014-01-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor fixes for `afblue.pl'.
+
+	* src/tools/afblue.pl (aux_name): Don't use `reverse'.
+	<Handling #endif>: Use proper indentation for generated `#else'.
+
+	* src/autofit/afblue.h: Regenerated.
+
+2014-01-04  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix Indic scripts.
+
+	Split the single, incorrect Indic entry into separate scripts so
+	that the covered ranges are the same: Bengali, Devanagari, Gujarati,
+	Gurmukhi, Kannada, Limbu, Malayalam, Oriya, Sinhala, Sundanese,
+	Syloti Nagri, Tamil, Telugu, and Tibetan.  At the same time, remove
+	entries for Meetei Mayek and Sharada – the Unicode ranges were
+	incorrect (and nobody has complained about that), fonts are scarce
+	for those scripts, and the Indic auto-hinter support is rudimentary
+	anyways.
+
+	* src/autofit/afscript.h: Updated, using AF_CONFIG_OPTION_INDIC and
+	AF_CONFIG_OPTION_CJK.
+
+	* src/autofit/afstyles.h (STYLE_DEFAULT_INDIC): New auxiliary macro.
+	Use it, together with AF_CONFIG_OPTION_INDIC and
+	AF_CONFIG_OPTION_CJK, to update.
+
+	* src/autofit/afranges.c [AF_CONFIG_OPTION_INDIC]: Updated.
+	[!AF_CONFIG_OPTION_INDIC, !AF_CONFIG_OPTION_CJK]: Removed.
+	Sort entries by tags.
+
+2014-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Thinko.
+
+	* src/autofit/hbshim.c (af_get_char_index): Similar to
+	`af_get_coverage', reject glyphs which are not substituted.
+
+2014-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix handling of default coverages.
+
+	With this commit, the implementation of coverage handling is
+	completed.
+
+	* src/autofit/hbshim.c (af_get_coverage): Exit early if nothing to
+	do.
+	Reject coverages which don't contain appropriate glyphs for blue
+	zones.
+
+2014-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix handling of default coverages.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	First handle non-default coverages, then the default coverage of the
+	default script, and finally the other default coverages.
+
+2014-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix scaling of HarfBuzz shaping.
+
+	* src/autofit/hbshim.c (af_get_char_index): Scale to units per EM.
+
+2014-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Better ftgrid support.
+
+	* src/autofit/afhints.c (af_glyph_hints_get_segment_offset): Add
+	parameters `is_blue' and `blue_offset'.
+
+2014-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Remove some styles.
+
+	* src/autofit/afcover.h: Remove coverages for alternative fractions,
+	denominators, numerators, and fractions.
+
+	* src/autofit/afstyles.h (META_STYLE_LATIN): Updated.
+
+2014-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add more styles.
+
+	* src/autofit/afstyles.h (STYLE_LATIN, META_STYLE_LATIN): New
+	auxiliary macros; use them to define styles for Cyrillic, Greek, and
+	Latin.
+
+	* src/autofit/afcover.h: Remove coverage for oldstyle figures.
+	Since those digits are used in combination with ordinary letters, it
+	makes no sense to handle them separately.
+
+	* src/autofit/afglobal.c (af_face_globals_get_metrics): Don't limit
+	`options' parameter to 4 bits.
+
+2014-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix style assignments to glyphs.
+
+	* src/autofit/hbshim.c (af_get_coverage)
+	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Scan GPOS coverage of features also
+	so that we can skip glyphs that have both GSUB and GPOS data.
+
+2014-01-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/hbshim.c: s/{lookups,glyphs}/gsub_{lookups,glyphs}/.
+
+2014-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Implement and use `af_get_char_index' with HarfBuzz.
+
+	* src/autofit/hbshim.c (COVERAGE) [FT_CONFIG_OPTION_USE_HARFBUZZ]:
+	Redefine to construct HarfBuzz features.
+	(af_get_char_index) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Rewritten.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Use
+	`y_offset' to adjust `best_y'.
+
+2013-12-31  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/AF_STYLE_...._DEFAULT/AF_STYLE_...._DFLT/i.
+
+2013-12-31  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix interface of `af_get_char_index'.
+
+	* src/autofit/hbshim.c (af_get_char_index): Return error value.
+	Add argument for y offset (to be used in a yet-to-come patch).
+
+	* src/autofit/hbshim.h, src/autofit/afcjk.c,
+	src/autofit/aflatin.c: Updated.
+
+2013-12-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Don't combine multiple features into one set.
+
+	Combining them, as originally envisioned, would lead to much more
+	complicated code, as investigations have shown meanwhile.  The major
+	drawback is that we run out of available style slots much earlier.
+	However, this is only a theoretical issue since we don't support a
+	large number of scripts currently.
+
+	* src/autofit/afcover.h: Replace `COVERAGE_{1,2,3}' macros with
+	a single-element `COVERAGE' macro, sort the elements by the feature
+	tags, and add entry for `ruby'.
+
+	* src/autofit/aftypes.h: Updated.
+	* src/autofit/hbshim.c: Updated.
+
+2013-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Code shuffling to reduce use of cpp macros.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	Call `af_get_coverage' unconditionally.
+
+	* src/autofit/autofit.c: Include `hbshim.c' unconditionally.
+
+	* src/autofit/hbshim.c (af_get_coverage)
+	[!FT_CONFIG_OPTION_USE_HARFBUZZ]: Provide dummy function.
+
+	* src/autofit/hbshim.h: Provide function declarations
+	unconditionally.
+
+2013-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add wrapper function for `FT_Get_Char_Index'.
+
+	Yet-to-come changes will provide HarfBuzz functionality for the new
+	function.
+
+	* src/autofit/hbshim.c (af_get_char_index): New function.
+	* src/autofit/hbshim.h: Updated.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
+	af_cjk_metrics_init_blues, af_cjk_metrics_check_digits): Updated.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
+	af_latin_metrics_init_blues, af_latin_metrics_check_digits):
+	Updated.
+
+2013-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Use `global' HarfBuzz font object.
+
+	We now use `hb_font' instead of `hb_face' since yet-to-come changes
+	need this.
+
+	* src/autofit/afglobal.h: Include `hbshim.h'.
+	(AF_FaceGlobalsRec) [FT_CONFIG_OPTION_USE_HARFBUZZ]: New member
+	`hb_font'.
+
+	* src/autofit/afglobal.c (af_face_globals_new)
+	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Create `hb_font'.
+	(af_face_globals_free) [FT_CONFIG_OPTION_USE_HARFBUZZ]: Destroy
+	`hb_font'.
+
+	* src/autofit/hbshim.h: Include HarfBuzz headers.
+
+	* src/autofit/hbshim.c: Include `hbshim.h' instead of HarfBuzz
+	headers.
+	(af_get_coverage): Updated.
+
+2013-12-27  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Handle `DFLT' OpenType script for coverages.
+
+	* include/ftautoh.h: Document new `default-script' property.
+
+	* src/autofit/hbshim.c (af_get_coverage): Use `AF_FaceGlobals' for
+	type of first parameter.
+	(script_tags): Add one more element.
+	(af_get_coverage): Adjust `script_tags' to handle `DFLT' script tag.
+
+	* src/autofit/hbshim.h: Updated.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	Updated.
+
+	* src/autofit/afglobal.h (AF_SCRIPT_DEFAULT): New macro.
+
+	* src/autofit/afmodule.h (AF_ModuleRec): New `default_script'
+	member.
+
+	* src/autofit/afmodule.c (af_property_set, af_property_get): Handle
+	`default-script' property.
+	(af_autofitter_init): Updated.
+
+2013-12-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[ftrfork] Fix the face order difference between POSIX and Carbon.
+
+	The fragmented resources in Suitcase and .dfont should be reordered
+	when `POST' resource for Type1 is being restored, but reordering of
+	sfnt resources induces the different face order.  Now the ordering
+	is restricted to `POST' resource only, to prevent the different
+	order issue (e.g. the face index in the fontconfig cache generated
+	with Carbon framework is incompatible with that by FreeType 2
+	without Carbon framework.)  Found by Khaled Hosny and Hin-Tak Leung.
+
+	https://lists.gnu.org/archive/html/freetype-devel/2013-02/msg00035.html
+	https://lists.gnu.org/archive/html/freetype-devel/2013-12/msg00027.html
+
+	* src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Add a switch
+	`sort_by_res_id' to control the fragmented resource ordering.
+	* include/internal/ftrfork.h: Declare new switch.
+	* src/base/ftobjs.c (IsMacResource): Enable the sorting for `POST'
+	resource, and disable the sorting for `sfnt' resource.
+
+2013-12-25  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #40997.
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Only use OR operator to
+	adjust face flags since FT_FACE_FLAG_EXTERNAL_STREAM might already
+	be set.
+	* src/cff/cffobjs.c (cff_face_init): Ditto.
+	* src/cid/cidobjs.c (cid_face_init): Ditto.
+	* src/pcf/pcfread.c (pcf_load_font): Ditto.
+	* src/pfr/pfrobjs.c (pfr_face_init): Ditto.
+	* src/type1/t1objs.c (T1_Face_Init): Ditto.
+	* src/type42/t42objs.c (T42_Face_Init): Ditto.
+	* src/winfonts/winfnt.c (FNT_Face_Init): Ditto.
+
+2013-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce `coverages'.
+
+	Coverages are the interface to the HarfBuzz library to access
+	OpenType features for handling glyphs not addressable by the cmap.
+
+	Right now, compilation of HarfBuzz is only added to the development
+	build.  A solution for standard build mode will be delayed until
+	HarfBuzz gets split into two libraries to avoid mutual dependencies
+	between FreeType and HarfBuzz.
+
+	Note that this is only a first step in handling coverages, basically
+	providing the framework only.  Code for handling selected OpenType
+	features (this is, actually using the data in `afcover.h') will
+	follow.
+
+	* devel/ftoption.h, include/config/ftoption.h
+	(FT_CONFIG_OPTION_USE_HARFBUZZ): New macro.
+
+	* src/autofit/hbshim.c, src/autofit/hbshim.h, src/autofit/afcover.h:
+	New files.
+
+	* src/autofit/afscript.h: Add HarfBuzz script name tags.
+
+	* src/autofit/afstyles.h: Add default coverage enumeration values.
+
+	* src/autofit/aftypes.h: Update use of `SCRIPT' and `STYLE' macros.
+	(AF_Coverage): New enumeration (generated by `afcover.h').
+	(AF_StyleClassRec): New member `coverage'.
+	(AF_DEFINE_STYLE_CLASS): Updated.
+
+	* include/internal/fttrace.h: Add `afharfbuzz' for tracing coverage
+	data.
+
+	* src/autofit/afglobal.h: Update use of `SCRIPT' and `STYLE' macros.
+	(AF_SCRIPT_FALLBACK): Renamed to ...
+	(AF_STYLE_FALLBACK): ... this.
+
+	* src/autofit/afglobal.c: Include `hbshim.c'.
+	Update use of `SCRIPT' and `STYLE' macros.
+	(af_face_globals_compute_style_coverage)
+	[FT_CONFIG_OPTION_USE_HARFBUZZ]: Call `af_get_coverage'.
+	Update.
+
+	* src/autofit/afmodule.h (AF_ModuleRec):
+	s/fallback_script/fallback_style/.
+
+	* src/autofit/afmodule.c (af_property_set): Adapt handling of
+	`fallback-script' property to set a fallback style.
+	(af_property_get, af_autofitter_init): Updated.
+
+	* src/autofit/afpic.c: Update use of `SCRIPT' and `STYLE' macros.
+
+	* src/autofit/afranges.h: Update use of `SCRIPT' macro.
+
+	* src/autofit/autofit.c [FT_CONFIG_OPTION_USE_HARFBUZZ]: Include
+	`hbshim.c'.
+
+	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `hbshim.c'.
+	(AUTOF_DRV_H): Add `afcover.h'.
+
+	* builds/freetype.mk (INCLUDE_FLAGS) [DEVEL_DIR]: Use pkg-config for
+	all libraries needed by FreeType.
+
+2013-12-21  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #40975 (sort of).
+
+	* src/truetype/ttinterp.c (Ins_IP): Fix sign typo to make FreeType
+	behave the same as the Windows TrueType engine for the invalid case.
+
+2013-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make PIC mode work actually.
+
+	* src/autofit/afpic.h (AFModulePIC): Fix array sizes to fit the
+	enumeration values automatically generated by including `afscript.h'
+	and friends.
+
+	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated.
+
+2013-12-21  Werner Lemberg  <wl@gnu.org>
+
+	Fix PIC linking.
+
+	* include/internal/ftrfork.h (CONST_FT_RFORK_RULE_ARRAY_BEGIN): Fix
+	generated function name.
+
+	* src/base/basepic.c (FT_Init_Table_raccess_guess_table): Rename
+	to ...
+	(FT_Init_Table_ft_raccess_guess_table): ... this so that the
+	function name correctly corresponds to what the macro framework
+	expects.
+
+	* src/psnames/rules.mk (PSNAMES_DRV_SRC_S): Use correct file name so
+	that PIC functions are compiled also.
+
+2013-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[base] Add missing dependencies to Makefile.
+
+	* src/base/rules.mk (BASE_SRC): Add `basepic.c' and `ftpic.c'.
+	(BASE_H): Add `basepic.h'.
+
+2013-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix PIC compilation.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
+	src/autofit/aflatin.c (af_latin_metrics_init_widths)
+	[FT_CONFIG_OPTION_PIC]: Declare `globals'.
+
+	* src/autofit/afglobal.c: Always call AF_DEFINE_SCRIPT_CLASS, and
+	AF_DEFINE_STYLE_CLASS.
+
+	* src/autofit/afpic.c: Include `afglobal.h'.
+	(autofit_module_class_pic_init): Typo.
+
+	* src/autofit/aftypes.h (AF_DEFINE_SCRIPT_CLASS,
+	AF_DEFINE_STYLE_CLASS): Don't use the same identifier for macro
+	parameter and structure member.
+
+2013-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce `styles'.
+
+	This is the new top-level structure for handling glyph input data;
+	scripts are now defined separately.
+
+	* src/autofit/aftypes.h (SCRIPT): Updated.
+	(AF_ScriptClassRec): Move `blue_stringset' and `writing_system'
+	members to ...
+	(AF_Style_ClassRec): ... this new structure.
+	(AF_Style): New enumeration.
+	(AF_StyleMetricsRec): Replace `script' enumeration with
+	`style_class' pointer.
+	(AF_DEFINE_SCRIPT_CLASS, AF_DECLARE_SCRIPT_CLASS): Updated.
+	(AF_DEFINE_STYLE_CLASS, AF_DECLARE_STYLE_CLASS): New macros.
+
+	* src/autofit/afstyles.h: New file, using data from `afscript.h'.
+	* src/autofit/afscript.h: Updated.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
+	af_cjk_metrics_init_blues, af_cjk_hint_edges): Updated.
+
+	* src/autofit/afglobal.c (SCRIPT): Updated.
+	(STYLE): Redefine macro to load `afstyles.h'.
+	(af_script_names) [FT_DEBUG_LEVEL_TRACE]: Replace with...
+	(af_style_names): ... this array.
+	(af_face_globals_compute_script_coverage): Renamed to...
+	(af_face_globals_compute_style_coverage): ... this.
+	Updated.
+	(af_face_globals_new, af_face_globals_free,
+	af_face_globals_get_metrics): Updated.
+
+	* src/autofit/afglobal.h (SCRIPT): Updated.
+	(STYLE): Redefine macro to load `afstyles.h'.
+	(AF_SCRIPT_FALLBACK): Update definition.  This will get more
+	refinements with later on.
+	(AF_SCRIPT_UNASSIGNED): Replace with...
+	(AF_STYLE_UNASSIGNED): ... this macro.
+	(AF_FaceGlobalsRec): Updated.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
+	af_latin_metrics_init_blues, af_latin_metrics_scale_dim,
+	af_latin_hint_edges): Updated.
+
+	* src/autofit/aflatin2.c (af_latin2_metrics_init_widths): Updated.
+	(af_ltn2_uniranges): Removed.
+
+	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
+	Updated.
+
+	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated.
+	* src/autofit/afpic.h (AF_STYLE_CLASSES_GET): New macro.
+	(AFModulePIC): Add `af_style_classes' and `af_style_classes_rec'
+	members.
+
+	* src/autofit/afranges.h: Updated.
+
+	* src/autofit/rules.mk (AUTOF_DRV_H): Add `afstyles.h'.
+
+2013-12-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Factor scripts and uniranges out of writing system files.
+
+	* src/autofit/afranges.c, src/autofit/afranges.h: New files.
+
+	* src/autofit/afscript.h: Extend `SCRIPT' macro with more
+	parameters, taking data from the writing system files.
+
+	* src/autofit/aftypes.h: Updated.
+
+	* src/autofit/afglobal.c: Include `afranges.h'.
+	Load `afscript.h' to call AF_DEFINE_SCRIPT_CLASS.
+	* src/autofit/afglobal.c: Include `afranges.h'.
+	Load `afscript.h' to call AF_DECLARE_SCRIPT_CLASS.
+
+	* src/autofit/afcjk.c, src/autofit/afcjk.h: Updated.
+	* src/autofit/afdummy.c, src/autofit/afdummy.h: Updated.
+	* src/autofit/afindic.c, src/autofit/afindic.h: Updated.
+	* src/autofit/aflatin.c, src/autofit/aflatin.h: Updated.
+	* src/autofit/aflatin2.c, src/autofit/aflatin2.h: Updated.
+
+	* src/autofit/afpic.c: Updated.
+
+	* src/autofit/autofit.c: Include `afranges.c'.
+	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afranges.c'.
+
+2013-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] More code orthogonality.
+
+	* src/autofit/aftypes.h (AF_StyleMetrics): Replace `script_class'
+	pointer to an `AF_ScriptClass' structure with `script' index of type
+	`AF_Script'.
+	Move some code around.
+
+	* src/autofit/afcjk.c: Include `afpic.h'.
+	(af_cjk_metrics_init_widths, af_cjk_metrics_init_blues,
+	af_cjk_hint_edges): Updated.
+
+	* src/autofit/aflatin.c: Include `afpic.h'.
+	(af_latin_metrics_init_widths, af_latin_metrics_init_blues,
+	af_latin_metrics_scale_dim, af_latin_hint_edges): Updated.
+
+	* src/autofit/afglobal.c (af_face_globals_get_metrics): Updated.
+
+	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
+	Updated.
+
+2013-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/ScriptMetrics/StyleMetrics/.
+
+2013-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/script_{metrics,hints}/style_{metrics,hints}/
+
+2013-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/gscripts/gstyles/.
+
+2013-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/glyph_scripts/glyph_styles/.
+
+	This is the first commit of a series to create a new top-level
+	structure (a `style') for handling scripts, writing_systems, and
+	soon-to-be-added coverages.
+
+2013-12-17  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/AF_Script_/AF_WritingSystem_/ where appropriate.
+
+2013-12-11  Infinality  <infinality@infinality.net>
+
+	[truetype] Simplify logic of rendering modes.
+
+	This patch unifies the subpixel and non-subpixel cases.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): Remove
+	`grayscale_hinting'; all code should refer to `grayscale' instead.
+	Remove unused `native_hinting' member.
+	Rename `subpixel_hinting' member to `subpixel.
+
+	* src/truetype/ttgload.c (TT_LOADER_SET_PP): Updated.
+	(tt_loader_init): Updated.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO): Simplify.
+	Updated.
+
+2013-12-11  Werner Lemberg  <wl@gnu.org>
+
+	[documentation] Add section how to include FreeType header files.
+	Problem reported by David Kastrup <dak@gnu.org>.
+
+	Surprisingly, a description how to do that was completely missing in
+	the API reference.
+
+	* include/freetype.h, include/ftchapters.h: New documentation
+	section `header_inclusion'.
+
+2013-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/DFLT/NONE/, s/dflt/none/.
+
+2013-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/AF_SCRIPT_NONE/AF_SCRIPT_UNASSIGNED/.
+
+2013-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix scaling of vertical phantom points.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Scale pp3.x and
+	pp4.x also.
+
+2013-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix positioning of composite glyphs.
+	Problem reported by Nigel Tao <nigeltao@golang.org>.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph): Remove code that shifts
+	the glyph (component) by a fractional value computed from the LSB
+	phantom point.  This is wrong, since the horizontal phantom points
+	get rounded horizontally later on.
+
+2013-12-08  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.2 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-2'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.2.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.1/2.5.2/, s/251/252/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 2.
+
+	* builds/unix/configure.raw (version_info): Set to 17:1:11.
+	* CMakeLists.txt (VERSION_PATCH): Set to 2.
+	* docs/CHANGES: Updated.
+
+2013-12-07  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Next round in phantom point handling.
+
+	Greg Hitchcock provided very interesting insights into the
+	complicated history of the horizontal positions of the TSB and BSB
+	phantom points.
+
+	* src/truetype/ttgload.c (TT_LOADER_SET_PP)
+	[TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Use `subpixel_hinting' and
+	`grayscale_hinting' flags as conditionals for the x position of TSB
+	and BSB.
+
+2013-12-05  Werner Lemberg  <wl@gnu.org>
+
+	* builds/freetype.mk (FT_CC): Removed.  Unused.
+
+2013-12-04  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix handling of embedded bitmap strikes.
+
+	This corrects the commit from 2013-11-21.  Problem reported by
+	Andrey Panov <panov@canopus.iacp.dvo.ru>.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Fix logic to
+	detect excessive bytes for bit-aligned bitmaps.
+
+2013-12-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Remove dead code.
+
+	Reported by Nigel Tao <nigeltao@golang.org>.
+
+	* include/internal/tttypes.h (TT_LoaderRec): Remove unused
+	`preserve_pps' field.
+	* src/truetype/ttgload.c (TT_Hint_Glyph): Updated.
+
+2013-12-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix phantom point handling.
+
+	This is a further improvement to the changes from 2013-11-06.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph): Horizontal phantom points
+	are rounded horizontally, vertical ones are rounded vertically.
+	(TT_LOADER_SET_PP): The horizontal position of vertical phantom
+	points in pre-ClearType mode is zero, as shown in the OpenType
+	specification.
+
+2013-12-02  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix change from 2013-11-20.
+
+	Problem reported by Akira Kakuto <kakuto@fuk.kindai.ac.jp>.
+
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Protect call to
+	`Update_Max' with both a TT_USE_BYTECODE_INTERPRETER guard and a
+	`IS_HINTED' clause.
+	Also remove redundant check using `maxSizeOfInstructions' – in
+	simple glyphs, the bytecode data comes before the outline data, and
+	a validity test for this is already present.
+
+2013-11-27  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix use of dumping functions in `ftgrid' demo program.
+
+	* src/autofit/afhints.c (AF_DUMP) [FT_DEBUG_AUTOFIT]: New macro.
+	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
+	af_glyph_hints_dump_edges) [FT_DEBUG_AUTOFIT]: Add parameter to
+	handle output to stdout.
+	Use AF_DUMP.
+	(af_glyph_hints_dump_points, af_glyph_hints_dump_segments,
+	af_glyph_hints_dump_edges) [!FT_DEBUG_AUTOFIT]: Removed.
+
+2013-11-25  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.1 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-1'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.1.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.0/2.5.1/, s/250/251/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+	* builds/unix/configure.raw (version_info): Set to 17:0:11.
+	* CMakeLists.txt (VERSION_PATCH): Set to 1.
+	* docs/CHANGES, docs/release: Updated.
+
+2013-11-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype]: Add tricky font names `hkscsiic.ttf' and `iicore.ttf'.
+
+	* src/truetype/ttobjs.c (TRICK_NAMES_MAX_CHARACTERS,
+	TRICK_NAMES_COUNT): Updated.
+	(trick_names): Add family name for the two fonts.
+
+2013-11-23  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Typo.
+
+2013-11-21  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Typo.
+
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Return correct `bsize->width'
+	value if the font lacks an `OS/2' table.
+
+2013-11-21  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve handling of buggy embedded bitmap strikes.
+
+	We are now able to successfully load `AppleMyoungJo.ttf'.
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Don't trust glyph
+	format.
+
+2013-11-20  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Don't trust `maxp's `maxSizeOfInstructions'.
+
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>; see
+
+	  https://lists.nongnu.org/archive/html/freetype-devel/2013-08/msg00005.html
+
+	for details.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Check size of `fpgm' and `prep'
+	tables also for setting `autohint'.
+
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Use code from
+	`TT_Process_Composite_Glyph' for handling unreliable values of
+	`maxSizeOfInstructions'.
+
+2013-11-16  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix `OS/2' table version 5 support.
+
+	We now follow the `official' announcement from Microsoft (on the
+	OpenType mailing list, which unfortunately hasn't a public archive).
+
+	* include/freetype/tttables.h (TT_OS2):
+	s/usLowerPointSize/usLowerOpticalPointSize/,
+	s/usUpperPointSize/usUpperOpticalPointSize/.
+
+	* src/sfnt/ttload.c (tt_face_load_os2): Update, and set correct
+	default values.
+
+2013-11-13  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/ft2unix.h: Remove.  No longer necessary.
+
+	* builds/unix/install.mk (install): Updated.
+
+2013-11-13  Werner Lemberg  <wl@gnu.org>
+
+	Simplify header file hierarchy.
+
+	This large patch changes the header file directory layout from
+	`include/freetype/...' to `include/...', effectively removing one
+	level.  Since the file `ft2build.h' is also located in `include'
+	(and it stays there even after installation), all FreeType header
+	files are now in a single directory.
+
+	Applications that use (a) `freetype-config' or FreeType's
+	`pkg-config' file to get the include directory for the compiler, and
+	(b) the documented way for header inclusion like
+
+	  #include <ft2build.h>
+	  #include FT_FREETYPE_H
+	  ...
+
+	don't need any change to the source code.
+
+	* include/freetype/*: Move up to...
+	* include/*: ... this directory.
+
+	* builds/amiga/include/freetype/*: Move up to...
+	* builds/amiga/include/*: ... this directory.
+
+	*/*: Essentially do `s@/freetype/@/@' where appropriate.
+
+	* CMakeLists.txt: Simplify.
+	* builds/unix/freetype-config.in, builds/unix/freetype2.in: For
+	`--cflags', return a single directory.
+	* builds/unix/install.mk (install): No longer try to remove `cache'
+	and `internal' subdirectories; instead, remove the `freetype'
+	subdirectory.
+
+2013-11-12  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix last `truetype' commit.
+
+	* src/truetype/ttgload.c (tt_get_metrics): Preserve stream position.
+	Return error value.
+	(load_truetype_glyph): Updated.
+
+2013-11-10  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CMAKE: New dummy file.
+
+2013-11-08  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix for hints that touch.
+
+	* src/cff/cf2hints.c (cf2_hintmap_insertHint): Fix condition for
+	finding index value of insertion point.
+
+2013-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix handling of phantom points in composite glyphs.
+	Problem reported by Nigel Tao <nigeltao@golang.org>.
+
+	This is a follow-up commit to the previous one.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Call
+	`tt_get_metrics' after loading the glyph header.
+
+2013-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve emulation of vertical metrics.
+
+	This commit also improves the start values of vertical phantom
+	points.  Kudos to Greg Hitchcock for help.
+
+	* src/truetype/ttgload.c (TT_Get_VMetrics): Add parameter to pass
+	`yMax' value.  Replace code with fixed Microsoft definition.
+	(tt_get_metrics): Updated.
+	(TT_LOADER_SET_PP): Add explanation how to initialize phantom
+	points, taken from both the OpenType specification and private
+	communication with Greg (which will eventually be added to the
+	standard).
+	Fix horizontal position of `pp3' and `pp4'.
+
+	* src/truetype/ttgload.h: Updated.
+
+	* src/truetype/ttdriver.c (tt_get_advances): Updated.
+
+	* docs/CHANGES: Updated.
+
+2013-11-05  Werner Lemberg  <wl@gnu.org>
+
+	* builds/windows/vc2010/freetype.vcxproj: s/v110/v100/.
+	PlatformToolSet version 110 is for VC2012.
+
+	Problem reported (with solution) by Dave Arnold <darnold@adobe.com>.
+
+2013-11-05  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Correctly reset point tags for glyph components.
+	Problem reported by Nigel Tao <nigeltao@golang.org>.
+
+	* src/truetype/ttgload.c (TT_Process_Composite_Glyph): Fix loop.
+
+2013-11-02  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix GETINFO opcode handling of subpixel hinting bits.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO): Don't request bit 6 set to
+	get info on subpixel hinting.
+
+	* docs/CHANGES: Updated.
+
+2013-11-02  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #40451.
+
+	Simply apply the patch from the bug report.
+
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+	include/freetype/config/ftconfig.h: The used #pragma directives only
+	work with gcc versions 4.6 and higher.
+
+2013-11-01  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Updated.
+
+2013-11-01  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Minor code refactoring.
+
+	Two benefits: The allocated FDEF (and IDEF) array gets slightly
+	smaller, and the `ttdebug' demo program has access to function
+	numbers without additional costs.
+
+	Fortunately, no changes to FontForge are necessary – this is the
+	only external TrueType debugger I know of, but others may exist and
+	should check the code accordingly.
+
+	* src/truetype/ttinterp.h (TT_CallRec): Replace `Cur_Restart' and
+	`Cur_End' with a pointer to the corresponding `TT_DefRecord'
+	structure.
+
+	* src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF, Ins_ENDF,
+	Ins_CALL, Ins_LOOPCALL, Ins_UNKNOWN, TT_RunIns <Invalid_Opcode>):
+	Updated.
+
+2013-10-27  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Implement support for `OS/2' table version 5.
+
+	See
+
+	  http://typedrawers.com/discussion/470/new-microsoft-size-specific-design-selection-mechanism
+
+	for the announcement.
+
+	* include/freetype/tttables.h (TT_OS2): Add fields
+	`usLowerPointSize' and `usUpperPointSize'.  Since FreeType returns
+	this structure only as a pointer through `FT_Get_Sfnt_Table', there
+	shouldn't be any ABI problems.
+
+	* src/sfnt/ttload.c (tt_face_load_os2): Implement it.
+
+	* docs/CHANGES: Updated.
+
+2013-10-24  Werner Lemberg  <wl@gnu.org>
+
+	* README.git, docs/CHANGES, docs/INSTALL: Updated.
+
+2013-10-24  John Cary  <cary@txcorp.com>
+
+	Provide cmake support.
+
+	* CMakeLists.txt: New file.
+
+2013-10-23  Kenneth Miller  <kennethadammiller@yahoo.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Provide support for x64 builds in Visual C++ project files.
+
+	* src/builds/win32: Renamed to...
+	* src/builds/windows: This.
+
+	* src/builds/windows/vc2010/*: Updated to handle x64 target.
+
+	* src/builds/windows/*.mk, docs/INSTALL.GNU: s/win32/windows/ where
+	appropriate.
+
+2013-10-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/md5.c, src/base/md5.h: Updated to recent version.
+
+	* src/base/ftobjs.c: Updated; `md5.c' no longer uses `free'.
+
+	The canonical URL to get updates for this file is
+
+	  http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/popa3d/popa3d/md5/
+
+	as the author told me in private communication.
+
+2013-10-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] s/SMALL_TOP/X_HEIGHT/.
+
+	* src/autofit/afblue.dat: Updated.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/aflatin.c, src/autofit/aflatin.h,
+	src/autofit/aflatin2.c: Updated.
+
+2013-10-19  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afblue.dat: s/MINOR/DESCENDER/.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+2013-10-16  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add description strings to script entries.
+
+	Currently, this is unused.
+
+	* src/autofit/afscript.h: Do it.
+	* src/autofit/afglobal.c, src/autofit/afpic.c,
+	src/autofit/aftypes.h: Updated.
+
+2013-10-16  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve tracing message for extra light flag.
+
+	* src/autofit/aflatin.c (af_latin_metrics_scale_dim): Do it.
+
+2013-10-15  Chongyu Zhu  <lembacon@gmail.com>
+
+	[arm] Fix thumb2 inline assembly under LLVM.
+
+	When using `ADD' with an immediate operand, the instruction is
+	actually `ADD Rd, Rn, #<imm12>', that is, the maximum of the
+	immediate operand cannot exceed 4095.  It will fail to compile with
+	LLVM.
+
+	However, in GCC, due to some legacy compatibility considerations,
+	`ADD.W' will be automatically emitted when the immediate operand is
+	larger than 4095.
+
+	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
+	(FT_MulFix_arm) [__GNUC__]: Support clang compiler.
+
+	* src/truetype/ttinterp.c (TT_MulFix14_arm) [__GNUC__]: Ditto.
+
+2013-10-12  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve tracing of `latin' hinter.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Report blue
+	zone types.
+	(af_latin_metrics_scale_dim): Report scaling changes due to x height
+	alignment.
+	Report scaled stroke width and blue zone values.
+
+2013-10-03  Dave Arnold  <darnold@adobe.com>
+
+	* src/cff/cf2font.c (cf2_computeDarkening): Avoid division by zero.
+
+	Note that the old code avoided using a region of the piecewise
+	linear function where the slope was zero.  The recovery was to use a
+	different section of the function, which produced a different,
+	incorrect amount of darkening.
+
+2013-10-02  Darrell Bellert  <darrell.bellert@hl.konicaminolta.us>
+
+	* src/sfnt/ttload.c (tt_face_load_pclt): Fix `pclt_fields'.
+
+2013-10-02  Dave Arnold  <darnold@adobe.com>
+
+	* src/cff/cf2font.c (cf2_computeDarkening): Initialize darkenAmount.
+
+	This line was lost in commit 89ca1fd6 (from 2013-06-25).  The effect
+	is to use a previous darkening amount when producing an unhinted,
+	unscaled outline.  This can cause autohint samples in ftgrid and
+	ftview to be based on darkened CFF outlines instead of unhinted,
+	undarkened ones.
+
+2013-09-29  Dave Arnold  <darnold@adobe.com>
+
+	Fix Savannah bug #39295.
+
+	The bug was caused by switching to the initial hintmap (the one in
+	effect when `moveto' executes) just before drawing the final element
+	in the charstring.  This ensured that the path was closed (in both
+	Character Space and Device Space).  But if the final element was a
+	curve and if the final hintmap was different enough from the initial
+	one, then the curve was visibly distorted.
+
+	The first part of the fix is to draw the final curve using the final
+	hintmap as specified by the charstring.  This corrects the
+	distortion but does not ensure closing in Device Space.  It may
+	require the rasterizer to automatically generate an extra closing
+	line.  Depending on the hintmap differences, this line could be from
+	zero to a couple pixels in length.
+
+	The second part of the fix covers the case where the charstring
+	subpath is closed with an explicit line.  We now modify that line's
+	end point to avoid the distortion.
+
+	Some glyphs in the bug report font (TexGyreHeros-Regular) that show
+	the change are:
+
+	  25ppem    S (98)
+	  24ppem    eight (52)
+	  25.5ppem  p (85)
+
+	Curves at the *end* of a subpath are no longer distorted.  However,
+	some of these glyphs have bad hint substitutions in the middle of a
+	subpath, and these are not affected.
+
+	The patch has been tested with a set of 106 fonts that shipped with
+	Adobe Creative Suite 4, together with 756 Open Source CFF fonts from
+	Google Fonts.  There are 1.5 million glyphs, of which some 20k are
+	changed with the fix.  A sampling of a few hundred of these changes
+	have been examined more closely, and the changes look good (or at
+	least acceptable).
+
+	* src/cff/cf2hints.h (CF2_GlyphPathRec): New element `pathIsClosing'
+	to indicate that we synthesize a closepath line.
+
+	* src/cff/cf2hints.c (cf2_glyphpath_init): Updated.
+	(cf2_glyphpath_pushPrevElem): If closing, use first hint map (for
+	`lineto' operator) and adjust hint zone.
+	For synthesized closing lines, use end point in first hint zone.
+	(cf2_glyphpath_lineTo): Take care of synthesized closing lines.  In
+	particular, shift the detection of zero-length lines from character
+	space to device space.
+	(cf2_glyphpath_closeOpenPath): Remove assertion.
+	Updated.
+
+2013-09-25  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_{grek,cyrl}_uniranges): Fix arrays.
+
+2013-09-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[bdf, pcf] Refuse non-zero face_index.
+
+	Suggested by Akira Tagoh, see
+
+	  https://lists.gnu.org/archive/html/freetype/2013-09/msg00030.html
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Return `Invalid_Argument'
+	error if the font could be opened but non-zero `face_index' is
+	given.
+	* src/pcf/pcfdrivr.c (PCF_Face_Init): Ditto.
+
+	* src/type42/t42objs.c (T42_Face_Init): Remove unrequired FT_UNUSED
+	macro for `face_index' because it is validated later.
+
+2013-09-23  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #40090.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_scale): Revert commit
+	306f8c5d (from 2013-08-25) affecting this function.
+
+2013-09-22  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Disunify Cyrillic and Greek handling from Latin.
+
+	* src/autofit/afscript.h: Add Cyrillic and Greek.
+
+	* src/autofit/afblue.dat (AF_BLUE_STRINGSET_GREK,
+	AF_BLUE_STRINGSET_CYRL): Add blue zones for Greek and Cyrillic.
+	(AF_BLUE_STRINGSET_LATN): Fix typo.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/aflatin.c (af_grek_uniranges, af_cyrl_uniranges): New
+	arrays.
+	(af_grek_script_class, af_cyrl_script_class): New scripts.
+	* src/autofit/aflatin.h: Updated.
+
+2013-09-20  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Updated.
+
+2013-09-20  Behdad Esfahbod  <behdad@behdad.org>
+
+	Fix vertical size of emboldened glyphs.
+
+	Cf. https://bugzilla.gnome.org/show_bug.cgi?id=686709
+
+	* src/base/ftsynth.c (FT_GlyphSlot_Embolden): Adjust `horiBearingY'
+	also.
+
+2013-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* include/freetype/ftoutln.h: Correct FT_Outline_Get_Orientation
+	algorithm description.
+
+2013-09-11  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve Hebrew rendering.
+
+	This change introduces a new blue zone property
+	`AF_BLUE_PROPERTY_LATIN_LONG' to make the auto-hinter ignore short
+	top segments.
+
+	* src/autofit/afblue.dat: Fix Hebrew blue strings.
+	Use AF_BLUE_PROPERTY_LATIN_LONG for AF_BLUE_STRING_HEBREW_TOP.
+
+	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_LONG): New macro.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Updated.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Handle
+	`AF_LATIN_IS_LONG_BLUE'.
+
+	* src/autofit/aflatin.h (AF_LATIN_IS_LONG_BLUE): New macro.
+
+2013-08-28  Behdad Esfahbod  <behdad@google.com>
+
+	[sfnt] Fix frame access while reading WOFF table directory.
+
+	* src/sfnt/sfobjs.c (woff_open_font): Using single memory frame
+	while reading the directory entries for the whole loop.
+
+2013-08-29  Werner Lemberg  <wl@gnu.org>
+            Behdad Esfahbod  <behdad@google.com>
+
+	Implement support for WOFF containers.
+
+	We simply synthesize a SFNT from the WOFF, create a memory stream
+	for the new data, and load the SFNT as usual.
+
+	Does NOT add any API to access WOFF metadata or private blocks.
+
+	* include/freetype/internal/tttypes.h (WOFF_HeaderRec,
+	WOFF_TableRec): New structures.
+
+	* include/freetype/tttags.h (TTAG_wOFF): New macro.
+
+	* src/base/ftobjs.c (FT_Open_Face): Set `stream' after calling
+	`open_face'.
+
+	* src/sfnt/sfobjs.c [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Include
+	`FT_GZIP_H'.
+	(WRITE_BYTE, WRITE_USHORT, WRITE_ULONG): New temporary macros for
+	writing to a stream.
+	(sfnt_stream_close, compare_offsets, woff_open_font): New functions.
+	(sfnt_open_font): Handle `TTAG_wOFF'.
+	(sfnt_init_face): Set `stream' after calling `sfnt_open_font'.
+
+	* src/truetype/ttobjs.c (tt_face_init): Set `stream' after calling
+	`sfnt->init_face'.
+
+	* src/base/ftobjs.c (open_face): Use a pointer to FT_Stream as an
+	argument so that a changed stream survives.
+	Update callers.
+
+2013-08-28  Werner Lemberg  <wl@gnu.org>
+
+	[gzip] New function `FT_Gzip_Uncompress'.
+
+	This is modeled after zlib's `uncompress' function.  We need this
+	for WOFF support.
+
+	* include/freetype/ftgzip.h, src/gzip/ftgzip.c (FT_Gzip_Uncompress):
+	New function.
+
+	* src/gzip/rules.mk: Rewrite to better reflect dependencies.
+
+2013-08-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix `make multi' compilation.
+
+	* src/autofit/afblue.cin, src/autofit/afblue.c: Don't include
+	`afblue.h' but `aftypes.h'.
+	* src/autofit/afcjk.c: Don't include `aftypes.h' but `afglobal.h'.
+
+2013-08-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix C++ compilation.
+
+	* src/autofit/afglobal.c (af_face_globals_get_metrics),
+	src/autofit/afdummy.c (af_dflt_script_class), src/autofit/afindic.c
+	(af_deva_script_class): Use proper casts.
+
+2013-08-27  Behdad Esfahbod  <behdad@google.com>
+
+	* src/sfnt/ttload.c (tt_face_load_font_dir): Fix sign typos.
+
+2013-08-27  Behdad Esfahbod  <behdad@google.com>
+
+	FT_Open_Face: Improve external stream handling.
+
+	If the font's `clazz->init_face' function wants to swap to new
+	stream, handling of whether original stream was external could
+	result to either memory leak or double free.  Mark externality into
+	face flags before calling `init_face' such that the clazz can handle
+	external streams properly.
+
+	* src/base/ftobjs.c (FT_Open_Face): Move code to set
+	FT_FACE_FLAG_EXTERNAL_STREAM to...
+	(open_face): This function.
+
+2013-08-27  Werner Lemberg  <wl@gnu.org>
+
+	Remove `FT_SqrtFixed' function.
+
+	It's no longer used.
+
+	* include/freetype/internal/ftcalc.h, src/base/ftcalc.c: Do it.
+
+2013-08-27  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] While tracing, report script names instead of ID values.
+
+	* src/autofit/afglobal.c (af_script_names) [FT_DEBUG_LEVEL_TRACE]:
+	New array.
+	* src/autofit/afglobal.h: Updated.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
+	af_cjk_hint_edges): Use `af_script_names'.
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
+	af_latin_hint_edges): Ditto.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Report used script while hinting a glyph.
+
+	* src/autofit/afcjk.c (af_cjk_hint_edges), src/autofit/aflatin.c
+	(af_latin_hint_edges): Implement it.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Hebrew script.
+
+	* src/autofit/afblue.dat: Add blue strings for Hebrew.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/aflatin.c (af_hebr_uniranges): New array.
+	(af_hebr_script_class): New script.
+	* src/autofit/aflatin.h, src/autofit/afscript.h: Updated.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve tracing messages.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths): Mention script
+	ID in tracing message.
+	(af_cjk_metrics_init_blues): Initialize `axis' outside of the inner
+	loop.
+	Improve tracing messages.
+	(af_cjk_hint_edges) [FT_DEBUG_LEVEL_TRACE]: New variable
+	`num_actions' to count hinting actions.
+	Improve tracing messages.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths): Mention
+	script ID in tracing message.
+	(af_latin_metrics_init_blues, af_latin_hint_edges): Improve tracing
+	messages.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	Better tracing of loaded glyphs.
+
+	Previously, the loading of a glyph was traced at level 4, if at all.
+	With this change, all font loading routines emit a tracing message
+	at level 1, making it easier to select tracing output (for example
+	using F2_DEBUG="any:1 afhints:7 aflatin:7").
+
+	* src/bdf/bdfdrivr.c (BDF_Glyph_Load): Add tracing message.
+	* src/cff/cffdrivr.c (cff_glyph_load): Ditto.
+	* src/cff/cffgload.c (cff_decoder_prepare): Improve tracing
+	messages.
+	* src/cid/cidgload.c (cid_load_glyph): Use level 1 for tracing
+	message.
+	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Ditto.
+	* src/pfr/pfrobjs.c (pfr_slot_load): Add tracing message.
+	* src/truetype/ttgload.c (TT_Load_Glyph): Ditto.
+	* src/type1/t1gload.c (T1_Load_Glyph): Ditto.
+	* src/type42/t42objs.c (T42_GlyphSlot_Load): Ditto.
+	* src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix script selection.
+
+	* src/autofit/afglobal.c (af_face_globals_get_metrics): Use
+	`AF_SCRIPT_DFLT', not value 0.
+	Simplify code.
+
+	* src/autofit/afscript.h: Sort by script name.
+
+2013-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make `dummy' hinter work as expected.
+
+	* src/autofit/afdummy.c (af_dummy_hints_init): Properly set scaling
+	information.
+	(af_dummy_hints_apply): Scale the glyphs.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make `cjk' module use blue stringsets.
+
+	* src/autofit/afcjk.c (AF_CJK_MAX_TEST_CHARACTERS): Removed.
+	(af_cjk_hani_blue_chars): Removed.
+	(AF_CJK_BLUE_TYPE_*): Removed.
+	(af_cjk_metrics_init_blues): Replace AF_CJK_MAX_TEST_CHARACTERS with
+	AF_BLUE_STRING_MAX_LEN.
+	Change loops to use offsets (in file `afblue.h') into the new arrays
+	`af_blue_stringsets' and `af_blue_strings' (in file `afblue.c').
+	Instead of three dimensions (as used in the old blue string array)
+	we now use properties to do the same, saving one loop nesting level.
+
+	* src/autofit/afcjk.h: Remove old enumeration values superseded by
+	the new data in `afblue.h'.
+	(AF_CJK_IS_TOP_BLUE, AF_CJK_IS_HORIZ_BLUE, AF_CJK_IS_FILLED_BLUE,
+	AF_CJK_IS_RIGHT_BLUE): New macros, to be used in
+	`af_cjk_metrics_init_blues'.
+	(AF_CJK_BLUE_IS_RIGHT): Remove this now redundant enum value.
+	(AF_CJK_BLUE_IS_TOP): Renamed to...
+	(AF_CJK_BLUE_TOP): This.
+	(AF_CJK_MAX_BLUES): Remove.
+	(AF_CJKAxisRec): Updated.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Typo.
+
+	* src/autofit/afblue.hin, src/autofit/afblue.c (GET_UTF8_CHAR): Use
+	cast.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Synchronize `cjk' with `latin' module (and vice versa).
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths): Add tracing
+	messages.
+	(af_cjk_metrics_init_blues): Don't pass blue string array as
+	argument but use the global array directly.
+	Use `outline' directly.
+	Update and add tracing messages.
+	(af_cjk_metrics_init): Simplify code.
+	(af_cjk_metrics_scale_dim): Improve tracing message.
+	(af_cjk_metrics_scale): Synchronize.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
+	af_latin_metrics_init_blues): Improve and add tracing messages.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make `latin' module use blue stringsets.
+
+	* src/autofit/aflatin.c (AF_LATIN_MAX_TEST_CHARACTERS): Removed.
+	(af_latin_blue_chars): Removed.
+	(af_latin_metrics_init_blues): Replace AF_LATIN_MAX_TEST_CHARACTERS
+	with AF_BLUE_STRING_MAX_LEN.
+	Change loops to use offsets (in file `afblue.h') into the new arrays
+	`af_blue_stringsets' and `af_blue_strings' (in file `afblue.c').
+	Use `AF_LATIN_IS_SMALL_TOP_BLUE' macro.
+
+	* src/autofit/aflatin.h: Remove old enumeration values superseded by
+	the new data in `afblue.h'.
+	(AF_LATIN_IS_TOP_BLUE): Updated definition.
+	(AF_LATIN_IS_SMALL_TOP_BLUE): New macro.
+	(AF_LATIN_MAX_BLUES): Remove.
+	(AF_LatinAxisRec): Updated.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue stringsets.
+
+	* src/autofit/aftypes.h: Include `afblue.h'.
+	(AF_ScriptClassRec): Add `blue_stringset' field.
+	(AF_DEFINE_SCRIPT_CLASS): Updated.
+
+	* src/autofit/autofit.c: Include `afblue.c'.
+
+	* src/autofit/afcjk.c (af_hani_script_class), src/autofit/afdummy.c
+	(af_dflt_script_class), src/autofit/afindic.c
+	(af_deva_script_class), src/autofit/aflatin.c
+	(af_latn_script_class), src/autofit/aflatin2.c
+	(af_ltn2_script_class): Updated.
+
+	* src/autofit/rules.mk (AUTOF_DRV_SRC): Add `afblue.c'.
+
+2013-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce data file for blue strings.
+
+	The idea is to have a central file which gets processed by a Perl
+	script to create proper `.c' and `.h' files using templates.  There
+	are two other reasons to do that:
+
+	  . The data file should be easily readable.  We use UTF-8 encoding
+	    which then gets converted to single bytes.
+
+	  . Since the number of supported scripts will increase soon, the
+	    current usage of blue string arrays is a waste of space.  Using
+	    the Perl script it is possible to imitate jagged arrays,
+	    defining enumeration constants as offsets into the arrays.
+
+	This commit only adds files without changing any functionality.
+
+	* src/autofit/afblue.dat: New data file.
+	* src/tools/afblue.pl: New Perl script for processing `afblue.dat'.
+
+	* src/autofit/afblue.cin, src/autofit/afblue.hin: New template files
+	for...
+	* src/autofit/afblue.c, src/autofit/afblue.c: New source files.
+	To avoid a dependency on Perl, we add them too.
+
+2013-08-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Enable new algorithm for `BBox_Cubic_Check'.
+
+	* src/base/ftbbox.c: Enable new BBox_Cubic_Check algorithm, remove
+	the old one.
+	Improve comments.
+
+2013-08-18  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/unix-def.in (freetype2.pc): Don't set executable bit.
+
+2013-08-18  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #39804.
+
+	* builds/unix/configure.raw (LIBPNG): Define and export.
+	* builds/unix/freetype-config.in, builds/unix/freetype2.in: Handle
+	libpng.
+
+2013-08-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Clean up BBox_Conic_Check.
+
+	* src/base/ftbbox.c (BBox_Conic_Check): Remove redundant checks for
+	extremum at the segment ends, which are already within the bbox.
+	Slightly modify calculations.
+
+2013-08-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Finish experimental (disabled) BBox_Cubic_Check implementation.
+
+	* src/base/ftbbox.c (BBox_Cubic_Check): Scale arguments to improve
+	accuracy and avoid overflows.
+
+2013-08-13  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Refactor experimental (disabled) BBox_Cubic_Check.
+
+	* src/base/ftbbox.c (BBox_Cubic_Check): Implement the minimum search
+	as the mirror image of the maximum search implemented here...
+	(update_max): New function.
+
+2013-08-06  John Tytgat  <John.Tytgat@esko.com>
+
+	Fix Savannah bug #39702.
+
+	* src/cff/cffload.c (cff_index_get_pointers): Check for `cur_offset
+	!= 0'; this stronger test is mandated by the CFF specification.
+	Fix test for INDEX structures which have one or more empty entries
+	at the end.
+
+2013-08-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix gcc pragmas, part 2.
+
+	* src/truetype/ttinterp.c (TT_MulFix14_long_long,
+	TT_DotFix14_long_long): `#pragma gcc diagnostic {push,pop}' has been
+	introduced with gcc version 4.6.
+
+2013-08-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix gcc pragmas.
+
+	* src/truetype/ttinterp.c (TT_MulFix14_long_long,
+	TT_DotFix14_long_long): Older gcc versions don't accept diagnostic
+	pragmas within a function body.
+
+2013-08-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #39700.
+
+	* builds/unix/ftconfig.h: Synchronize with
+	`include/freetype/config/ftconfig.h'.
+
+	* builds/vms/ftconfig.h: Ditto.
+	Make the differences to the master `ftconfig.h' file as small as
+	possible for easier maintenance.
+
+2013-08-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve handling of `near' points.
+
+	Points which are very near to each other are now marked as such.
+	The `weak' flag is then computed by using the `in' vector of the
+	first and the `out' vector of the last point of a group of near
+	points.
+
+	For example, this fixes the rendering of glyph `Oslash' in
+	`Roboto-Thin.ttf'.
+
+	* src/autofit/afhints.h (AF_Flags): New value `AF_FLAGS_NEAR'.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Introduce
+	the heuristic value `near_limit' to decide whether the current point
+	is near to the previous one, then set `AF_FLAG_NEAR' accordingly.
+	Store good `in' vector (of last non-near point) in
+	`last_good_in_{x,y}' and use it as an argument to
+	`ft_corner_is_flat' if necessary.
+
+2013-08-02  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/ftcffdrv.h: Improve documentation.
+	This is based on blog entries from David Lemon and Dave Arnold (both
+	from Adobe) with kind permission.  Dave also helped in
+	proof-reading.
+
+2013-08-02  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Move declaration of scripts into separate file.
+
+	This has the benefit that we don't need to duplicate the data at
+	different places.
+
+	* src/autofit/afscript.h: New file.
+
+	* src/autofit/aftypes.h (AF_Script): Include `afscript.h' to define
+	the enumeration values.
+
+	* src/autofit/afglobal.c: Include `afscript.h' to get the script
+	specific header files.
+	(af_script_classes): Include `afscript.h' to fill this array.
+
+	* src/autofit/afpic.c: Include `afscript.h' to get the script
+	specific header files.
+	(autofit_module_class_pic_init): Include `afscript.h' for
+	initialization.
+	* src/autofit/afpic.h (AF_SCRIPT_CLASSES_COUNT,
+	AF_SCRIPT_CLASSES_REC_COUNT): Removed.  Use `AF_SCRIPT_MAX' instead.
+
+	* src/autofit/rules.mk (AUTOF_DRV_H): Updated.
+
+2013-08-02  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Move declaration of writing systems into separate file.
+
+	This has the benefit that we don't need to duplicate the data at
+	different places.
+
+	* src/autofit/afwrtsys.h: New file.
+
+	* src/autofit/aftypes.h (AF_WritingSystem): Include `afwrtsys.h' to
+	define the enumeration values.
+
+	* src/autofit/afglobal.c: Include `afwrtsys.h' to get the writing
+	system specific header files.
+	Include `afpic.h'.
+	(af_writing_system_classes): Include `afwrtsys.h' to fill this
+	array.
+
+	* src/autofit/afpic.c: Include `afwrtsys.h' to get the writing
+	system specific header files.
+	(autofit_module_class_pic_init): Include `afwrtsys.h' for
+	initialization.
+	* src/autofit/afpic.h (AF_WRITING_SYSTEM_CLASSES_COUNT,
+	AF_WRITING_SYSTEM_CLASSES_REC_COUNT): Removed.  Use
+	`AF_WRITING_SYSTEM_MAX' instead.
+
+2013-08-02  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix compilation with g++.
+
+	* src/sfnt/pngshim.c (error_callback, read_data_from_FT_stream): Use
+	cast.
+	(Load_SBit_Png): Pacify compiler.
+
+2013-08-02  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+            Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix `make multi'.
+
+	* include/freetype/config/ftconfig.h (FT_LOCAL_ARRAY,
+	FT_LOCAL_ARRAY_DEF): New macros.
+
+	* src/autofit/afglobal.c (af_writing_system_classes,
+	af_script_classes): Use FT_LOCAL_ARRAY_DEF.
+	* src/autofit/afglobal.h: Declare `af_writing_system_classes' and
+	`af_script_classes'.
+	* src/autofit/afloader.c: Include `afpic.h'.
+
+2013-08-01  Werner Lemberg  <wl@gnu.org>
+
+	Another round of cppcheck nitpicks.
+
+	The call was (from the top-level of the FreeType tree):
+
+	  cppcheck --force \
+	           --enable=all \
+	           -I /usr/include \
+	           -I /usr/local/include \
+	           -I /usr/lib/gcc/i586-suse-linux/4.7/include \
+	           -I include \
+	           -I include/freetype \
+	           -I include/freetype/config \
+	           -I include/freetype/internal \
+	           -DFT2_BUILD_LIBRARY \
+	           . &> cppcheck.log
+
+	using cppcheck git commit f7e93f99.
+
+	Note that cppcheck still can't handle `#include FOO' (with `FOO' a
+	macro).
+
+	*/* Improve variable scopes.
+	*/* Remove redundant initializations which get overwritten.
+
+	* src/gxvalid/*: Comment out redundant code or guard it with
+	FT_DEBUG_LEVEL_TRACE.
+
+2013-07-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce `writing systems'.
+
+	This patch adds a new top level to the auto-hinter's script class
+	hierarchy.  It defines `writing systems' which can contain multiple
+	scripts.
+
+	For example, the `latin' writing system (in file `aflatin.c') is
+	able to support scripts like Latin, Cyrillic, Armenian, etc., which
+	can be handled similarly.
+
+	Scripts are now named using four-letter OpenType tags.
+
+	* src/autofit/aftypes.h (AF_ScriptClassRec): Move relevant members
+	to...
+	(AF_WritingSystemClassRec): This new structure.  It holds pointers
+	to functions which can be shared among related scripts.
+	(AF_WritingSystem): New enumeration.
+	(AF_Script): Revised values using four-letter tags.
+	(AF_DEFINE_WRITING_SYSTEM_CLASS): New macro.
+	(AF_DEFINE_SCRIPT_CLASS): Updated.
+
+	* src/autofit/afglobal.c (af_writing_system_classes): New global,
+	constant array.
+	(af_script_classes): Updated.
+	(af_face_globals_free): Updated.
+	Remove assertion.
+	(af_face_globals_get_metrics): Updated.
+
+	* src/autofit/afglobal.h (AF_SCRIPT_FALLBACK)
+	[!AF_CONFIG_OPTION_CJK]: Handle this case.
+
+	* src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
+	Updated.
+
+	* src/autofit/afpic.c (autofit_module_class_pic_init): Updated;
+	initialize structures for both writing systems and scripts.
+	* src/autofit/afpic.h: Updated.
+	(AF_WRITING_SYSTEM_CLASSES_GET): New macro.
+
+	* src/autofit/afcjk.c (af_cjk_writing_system_class): New writing
+	system.
+	(af_cjk_uniranges): Renamed to...
+	(af_hani_uniranges): This.
+	(af_cjk_script_class): Reduced and renamed to...
+	(af_hani_script_class): This.
+	* src/autofit/afcjk.h: Updated.
+
+	* src/autofit/afdummy.c (af_dummy_writing_system_class): New writing
+	system.
+	(af_dummy_script_class): Reduced and renamed to...
+	(af_dflt_script_class): This.
+	* src/autofit/afdummy.h: Updated.
+
+	* src/autofit/afindic.c (af_indic_writing_system_class): New writing
+	system.
+	(af_indic_uniranges): Renamed to...
+	(af_deva_uniranges): This.
+	(af_indic_script_class): Reduced and renamed to...
+	(af_deva_script_class): This.
+	* src/autofit/afcjk.h: Updated.
+
+	* src/autofit/aflatin.c (af_latin_writing_system_class): New writing
+	system.
+	(af_latin_uniranges): Renamed to...
+	(af_latn_uniranges): This.
+	(af_latin_script_class): Reduced and renamed to...
+	(af_latn_script_class): This.
+	* src/autofit/aflatin.h: Updated.
+
+	* src/autofit/aflatin2.c (af_latin2_writing_system_class): New
+	writing system.
+	(af_latin2_uniranges): Renamed to...
+	(af_ltn2_uniranges): This.
+	Synchronize ranges with `latin'.
+	(af_latin2_script_class): Reduced and renamed to...
+	(af_ltn2_script_class): This.
+	* src/autofit/aflatin2.h: Updated.
+
+2013-07-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Variable renaming.
+
+	* src/autofit/aftypes.h (AF_ScriptMetricsRec):
+	s/clazz/script_class/.
+	Update all users.
+
+2013-07-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	Ignore libpng-config under cross-building configuration,
+	because it will return the flags for the hosting environment.
+
+	* builds/unix/configure.raw: Ignore libpng-config when
+	`cross_compiling' == yes.
+
+2013-07-30  Behdad Esfahbod  <behdad@google.com>
+
+	Prevent division by zero by a transparent color.
+
+	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra):
+	Return 0 immediately, when alpha channel is zero.
+
+2013-07-25  Behdad Esfahbod  <behdad@google.com>
+
+	Add FT_FACE_FLAG_COLOR and FT_HAS_COLOR.
+
+	Also disambiguate Google's color bitmap tables.
+
+	* include/freetype/freetype.h (FT_FACE_FLAG_COLOR, FT_HAS_COLOR):
+	New macros.
+
+	* include/freetype/internal/tttypes.h (TT_SbitTableType): Add
+	TT_SBIT_TABLE_TYPE_CBLC.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Handle FT_FACE_FLAG_COLOR.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit,
+	tt_face_load_strike_metrics, tt_face_load_sbit_image): Handle
+	TT_SBIT_TABLE_TYPE_CBLC.
+
+2013-07-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[sfnt] Fix for `make multi' target.
+
+	* src/sfnt/pngshim.c (Load_SBit_Png): Use FT_LOCAL_DEF().
+
+2013-07-20  Werner Lemberg  <wl@gnu.org>
+
+	* docs/INSTALL.GNU: Updated.
+
+2013-07-20  Behdad Esfahbod  <behdad@google.com>
+
+	[sfnt] Fix `sbix' table version handling.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit) [TT_SBIT_TABLE_TYPE_SBIX]:
+	USHORT version numbers are to be considered as `minor'.
+
+2013-07-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix segment classification for blue zones.
+
+	The old code (essentially unchanged since the very beginning)
+	incorrectly handled this configuration
+
+	               x -o- x
+	                /   \
+	               /     \
+	              /       \
+	             o         o
+
+	as flat and this
+
+	                o               o
+	               /               /
+	             x|              x|
+	              |               |
+	              o---------------o
+
+	as round.  (`o' and `x' are on and off points, respectively).
+
+	This is a major change which should improve the rendering results
+	enormously for many TrueType fonts, especially in the range approx.
+	20-40ppem, fixing the appearance of many overshoots.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Look at the
+	first and last points of the segment, not the points right before
+	and after.
+
+2013-07-19  Behdad Esfahbod  <behdad@google.com>
+
+	[sfnt] `sbix' fix-ups.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Apple's `sbix' color bitmaps
+	are rendered scaled and then the `glyf' outline rendered on top.  We
+	don't support that yet, so just ignore the `glyf' outline and
+	advertise it as a bitmap-only font.
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
+	[TT_SBIT_TABLE_TYPE_SBIX]: Return metrics in 26.6 units.
+	(tt_face_load_sbix_image): Typo.
+
+2013-07-18  Behdad Esfahbod  <behdad@google.com>
+
+	[sfnt] Add support for Apple's `sbix' color bitmap table.
+
+	* include/freetype/internal/tttypes.h (TT_SBit_MetricsRec): Widen
+	fields to FT_Short and FT_UShort, respectively.
+	(TT_SbitTableType): New enumeration.
+	(TT_FaceRec): Add `sbit_table_type' field.
+
+	* include/freetype/tttags.h (TTAG_sbix): New macro.
+
+	* src/sfnt/pngshim.c (Load_SBit_Png): Pass a more generic
+	FT_GlyphSlot argument instead FT_Bitmap.
+	Add flag to control map and metrics handling.
+	Update all users.
+
+	* src/sfnt/ttsbit.c: Include `ttmtx.h'.
+	(tt_face_load_eblc): Renamed to...
+	(tt_face_load_sbit): This.
+	Handle `sbix' bitmaps.
+	(tt_face_free_eblc): Renamed to...
+	(tt_face_load_sbit): This.
+	Updated.
+	(tt_face_load_strike_metrics): Handle `sbix' bitmaps.
+	(tt_face_load_sbix_image): New function.
+	(tt_sbit_decoder_alloc_bitmap, tt_sbit_decoder_load_image,
+	tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned,
+	tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png,
+	tt_sbit_decoder_load_image, tt_sbit_decoder_load_bitmap): Don't pass
+	and handle load flags.
+	(tt_sbit_decoder_load_bitmap) [!FT_CONFIG_OPTION_USE_PNG]: Better
+	handle formats 17-19.
+	Move color to grayscale conversion to...
+	(tt_face_load_sbit_image): Here.
+	Handle `sbix' bitmaps.
+
+	* src/sfnt/pngshim.h: Updated.
+	* src/sfnt/ttsbit.h: Updated.
+	* src/sfnt/sfdriver.c: Updated.
+
+2013-07-18  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Ignore invalid magic number in `head' or `bhed'.
+
+	Other font engines seem to ignore it also.  Problem reported by
+	Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* src/sfnt/ttload.c (check_table_dir): Don't abort but warn only if
+	we have an invalid magic number.
+
+2013-07-16  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Fix segfault caused by previous commit.
+
+	* src/smooth/ftgrays.c (gray_set_cell): Always compute
+	`ras.invalid'.
+
+2013-07-16  David Turner  <digit@google.com>
+
+	[smooth] Improve performance.
+
+	Provide a work-around for an ARM-specific performance bug in GCC.
+	This speeds up the rasterizer by more than 5%.
+
+	Also slightly optimize `set_gray_cell' and `gray_record_cell' (which
+	also improves performance on other platforms by a tiny bit (<1%).
+
+	* src/smooth/ftgrays.c (FT_DIV_MOD): New macro.
+	Use it where appropriate.
+
+	(gray_record_cell, gray_set_cell, gray_move_to,
+	gray_convert_glyph_inner): Streamline condition handling.
+
+2013-07-16  David Turner  <digit@google.com>
+
+	[truetype] Add assembler code for TT_MulFix14 and TT_DotFix14.
+
+	This patch provides slightly optimized versions for ARM, x86, and
+	x86_64 CPUs if built with GCC.
+
+	Also remove some dead code.
+
+	* src/truetype/ttinterp.c (TT_MulFix14_arm, TT_MulFix14_long_long,
+	TT_DotFix14_long_long): New functions.
+
+2013-07-16  David Turner  <digit@google.com>
+
+	Optimize FT_MulFix for x86_64 GCC builds.
+
+	This patch provides an optimized `FT_MulFix' implementation for
+	x86_64 machines when FreeType is built with GCC, or compatible
+	compilers like Clang.
+
+	Example:
+	  bin/ftbench -p -t 5 -s 14 -f 0008 Arial.ttf
+
+	Before:
+
+	  Load                       4.863 us/op
+	  Load_Advances (Normal)     4.816 us/op
+	  Load_Advances (Fast)       0.028 us/op
+	  Render                     2.753 us/op
+	  Get_Glyph                  0.463 us/op
+	  Get_CBox                   0.077 us/op
+	  Get_Char_Index             0.023 us/op
+	  Iterate CMap              13.898 us/op
+	  New_Face                  12.368 us/op
+	  Embolden                   0.028 us/op
+	  Get_BBox                   0.302 us/op
+
+	After:
+
+	  Load                       4.617 us/op
+	  Load_Advances (Normal)     4.645 us/op
+	  Load_Advances (Fast)       0.027 us/op
+	  Render                     2.789 us/op
+	  Get_Glyph                  0.460 us/op
+	  Get_CBox                   0.077 us/op
+	  Get_Char_Index             0.024 us/op
+	  Iterate CMap              13.403 us/op
+	  New_Face                  12.278 us/op
+	  Embolden                   0.028 us/op
+	  Get_BBox                   0.301 us/op
+
+	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
+	(FT_MulFix_x86_64): New function.
+
+2013-07-16  David Turner  <digit@google.com>
+
+	Speed up ARMv7 support.
+
+	When building for ARMv7 with thumb2 instructions, the optimized
+	`FT_MulFix_arm' assembly routine was not being used.
+
+	The reason for this is in the `ftconfig.h' header, namely:
+
+	- The assembly routine uses the `smull' instruction which is not
+	  available when generating Thumb-1 machine code.  It is available
+	  in Thumb-2 mode, though.
+
+	- The header was written a long time ago before Thumb-2 became
+	  widely popular (e.g. with Android).  So it simply doesn't use the
+	  assembly routine if the `__thumb__' built-in macro is defined.
+
+	- When compiling in Thumb-2 mode, the compiler will define both
+	  `__thumb__' and `__thumb2__'.
+
+	By checking for `(__thumb2__ || !__thumb__)', we ensure that the
+	assembly routine is only avoided when generating Thumb-1 code.
+
+	Given that this is performance-sensitive function, this improves
+	`ftbench' as follows on a Galaxy Nexus:
+
+	                           Before (us/op)   After (us/op)
+
+	  - loading Arial.ttf glyphs at 14 ppem [1]
+
+	      Load                   34.285          33.098
+
+	  - same operation with the light auto-hinter [2]
+
+	      Load                   31.317          29.590
+
+	  - same operation without hinting [3]
+
+	      Load                    6.143           5.376
+
+	  - loading Arial.ttf advances at 14 ppem [4]
+
+	      Load_Advances (normal) 34.216          33.016
+	      Load_Advances (fast)    0.176           0.176
+
+	  [1] ftbench -t 5 -p -s 14 -b a -f 0008 Arial.ttf
+	  [2] ftbench -t 5 -p -s 14 -b a -r 1 -f 0028 Arial.ttf
+	  [3] ftbench -t 5 -p -s 14 -b a -f 000a Arial.ttf
+	  [4] ftbench -t 5 -p -s 14 -b b -f 0008 Arial.ttf
+
+	* builds/unix/ftconfig.in, include/freetype/config/ftconfig.h
+	(FT_MULFIX_ASSEMBLER): Fix handling for ARMv7.
+
+2013-06-28  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Updated.
+
+2013-06-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/winfonts/winfnt.c (FNT_Load_Glyph): Fix bitmap width guard.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Add darkening limit to `darkening-parameters'.
+
+	* src/cff/cffdrivr.c (cff_property_set): Add check.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Add `darkening-parameters' property.
+
+	* include/freetype/ftcffdrv.h: Document it.
+
+	* src/cff/cffdrivr.c (cff_property_set, cff_property_get): Handle
+	`darkening-parameters' property.
+
+	* src/cff/cf2font.h (CF2_FontRec): Add `darkenParams' array.
+
+	* src/cff/cf2font.c (cf2_computeDarkening): Add `darkenParams'
+	argument and use it.
+	Update all callers.
+
+	* src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Copy
+	`darken_params' values.
+
+	* src/cff/cffobjs.h (CFF_DriverRec): Add `darken_params' array.
+
+	* src/cff/cffobjs.c (cff_driver_init): Set default values for
+	`darken_params'.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Code shuffling.
+
+	* src/tools/docmaker/tohtml.py (re_url): Move regexp...
+	* src/tools/docmaker/sources.py: ... to this file.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Remove unused functions.
+
+	* src/tools/docmaker/content.py (DocMarkup.get_start,
+	DocBlock.get_markup_name): Removed.
+	* src/tools/docmaker/tohtml.py (html_quote0, dump_html_code,
+	HtmlFormatter.make_html_words): Removed.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	* builds/freetype.mk (dll): Remove target.
+
+	Problem reported by Jörg Günnewig <joerg.guennewig@googlemail.com>.
+
+2013-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Recognise URLs.
+
+	* src/tools/docmaker/tohtml.py (re_url): New regular expression.
+	(make_html_para): Use it.
+
+2013-06-19  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.0.1 released.
+	===========================
+
+
+	Tag sources with `VER-2-5-0-1'.
+
+	* include/freetype/config/ftoption.h: Undefine
+	CFF_CONFIG_OPTION_OLD_ENGINE.
+	* devel/ftoption.h: Define CFF_CONFIG_OPTION_OLD_ENGINE.
+
+2013-06-19  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/install.mk (install): Don't create `cache' directory.
+
+	Found by Peter Breitenlohner <peb@mppmu.mpg.de>.
+
+2013-06-19  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.5.0 released.
+	=========================
+
+
+	Tag sources with `VER-2-5-0'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.5.0.
+
+	* README, Jamfile (RefDoc),
+	builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+	builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+	builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+	builds/win32/visualc/freetype.dsp,
+	builds/win32/visualc/freetype.vcproj,
+	builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+	builds/win32/visualce/freetype.vcproj,
+	builds/win32/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.4.12/2.5.0/, s/2412/250/.
+
+	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 5.
+	(FREETYPE_PATCH): Set to 0.
+
+	* builds/unix/configure.raw (version_info): Set to 16:2:10.
+
+	* src/base/ftobjs.c (FT_Open_Face): Pacify compiler.
+	* src/truetype/ttinterp.c (Ins_MSIRP, Ins_MIRP): Ditto.
+
+2013-06-18  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #39269.
+
+	* src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Free memory in
+	case of reallocation failures.
+
+2013-06-18  Andrew Church  <achurch+savannah@achurch.org>
+
+	Fix Savannah bug #39266.
+
+	If memory allocations fail at certain points while opening a font,
+	FreeType can either crash due to a NULL dereference or leak memory.
+
+	* include/freetype/internal/ftobjs.c (FT_Face_InternalRec,
+	FT_LibraryRec): Make `refcount' a signed integer.  If, for example,
+	FT_Open_Face() fails in a memory allocation before the face's
+	reference count is set to 1, a subsequent `FT_Done_Library' call
+	would otherwise loop over `FT_Done_Face' 2^32 times before freeing
+	the face.
+
+	* src/base/ftobjs.c (open_face): Initialize `stream' and friends
+	earlier.
+	(FT_Open_Face) <Fail>: Behave correctly if `node' is NULL.
+	(FT_Destroy_Module) <Fail>: Check that `renderer_clazz' is valid.
+
+2013-06-14  Werner Lemberg  <wl@gnu.org>
+
+	* src/smooth/ftgrays.c One final pragma to silence 64-bit MSVC.
+
+2013-06-06  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Add code to Adobe's engine to handle ppem > 2000.
+
+	* src/cff/cffgload.c (cff_slot_load): If we get
+	FT_Err_Glyph_Too_Big, retry unhinted and scale up later on.
+
+2013-06-12  Werner Lemberg  <wl@gnu.org>
+
+	Another try on pragmas.
+
+	* include/freetype/internal/ftdebug.h: Move pragmas to...
+	* include/freetype/internal/internal.h: ... this file since it gets
+	included by all source files.
+	* include/freetype/internal/ftserv.h: Remove pragma which has no
+	effect.
+
+2013-06-12  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/internal/ftdebug.h: Disable MSVC warning C4127.
+
+	This partially undoes commit 3f6e0e0c.
+
+2013-06-12  Werner Lemberg  <wl@gnu.org>
+
+	More compiler warning fixes.
+
+	*/*: Use cast to `FT_Bool' (or `Bool') where appropriate.
+
+2013-06-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve handling of broken sbit advance widths.
+
+	* src/truetype/ttgload.c (TT_Load_Glyph): Use the glyph's (scaled)
+	`linearHoriAdvance' if the sbit's `horiAdvance' value is zero.
+
+	Cf. font `Fixedsys Excelsior' v3.01 (FSEX300.ttf), glyph A, 16ppem.
+
+2013-06-10  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve embedded bitmap tracing.
+
+	* src/base/ftobjs.c (FT_Request_Size): Move trace message regarding
+	bitmap strike match to...
+	(FT_Match_Size): This function.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_metrics,
+	tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_bit_aligned,
+	tt_sbit_decoder_load_compound, tt_sbit_decoder_load_png,
+	tt_sbit_decoder_load_image): Decorate with tracing messages.
+
+2013-06-10  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #39160.
+
+	* src/truetype/ttinterp.c (Ins_SDPVTL): Set projection vector too
+	for the degenerate case.
+
+2013-06-09  David Turner  <digit@google.com>
+
+	* src/cache/ftcmanag.c (FTC_Manager_Reset): Add missing cache flush.
+
+	This code, present since eight(!) years in the unused `CACHE'
+	branch, has been forgotten to apply to the master branch.  It's
+	really amazing that noone has ever complained since
+	`FTC_Manager_Reset' is pretty useless without flushing the cache.
+
+2013-06-07  Werner Lemberg  <wl@gnu.org>
+
+	Add and improve pragmas for MSVC compiler.
+
+	* include/freetype/internal/ftdebug.h: Remove pragmas.
+	* include/freetype/internal/ftserv.h: Use push and pop for pragmas.
+	* include/freetype/internal/ftvalid.h: Handle warning C4324.
+	* src/base/ftobjs.c: Use push and pop for pragmas.
+	* src/gzip/ftgzip.c: Handle warning C4244.
+
+2013-06-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff] s/cf2_getGlyphWidth/cf2_getGlyphOutline/.
+
+	* src/cff/cf2font.c, src/cff/cf2font.h, src/cff/cf2ft.c: Do it.
+
+2013-06-06  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Add early exit feature for width-only calls.
+
+	This is for `FT_Get_Advance'.
+
+	There are 7 places where the spec says the width can be defined:
+
+	  hstem/hstemhm
+	  vstem/vstemhm
+	  cntrmask/hintmask
+	  hmoveto
+	  vmoveto
+	  rmoveto
+	  endchar
+
+	* src/cff/cf2intrp.c (cf2_doStems): Exit early for width-only calls,
+	if possible.
+
+	(cf2_interpT2CharString) <cf2_cmdHSTEM>, <cf2_cmdVSTEM>,
+	<cf2_cmdVMOVETO>, <cf2_cmdENDCHAR>, <cf2_cmdHINTMASK>,
+	<cf2_cmdRMOVETO>, <cf2_cmdHMOVETO>: Exit early for width-only calls.
+
+2013-06-06  Werner Lemberg  <wl@gnu.org>
+
+	Next round of compiler fixes.
+
+	* builds/win32/ftdebug.c, builds/wince/ftdebug.c (ft_debug_init):
+	Add proper cast.
+
+	* include/freetype/internal/ftserv.h (FT_SERVICE_UNAVAILABLE): Fix
+	cast.
+	* include/freetype/internal/ftstream.h: Decorate stream and frame
+	macros with `FT_Long' and `FT_ULong' as appropriate.
+
+	* src/base/ftrfork.c (raccess_guess_darwin_hfsplus,
+	raccess_guess_darwin_newvfs): Use cast.
+
+	* src/bdf/bdflib.c (_bdf_set_default_spacing): Use cast.
+
+	* src/cache/ftcmanag.c (FTC_Manager_Check): Fix cast.
+	* src/cache/ftcmanag.h (FTC_ManagerRec): Ditto.
+
+	* src/cff/cf2arrst.c (cf2_arrstack_setNumElements): Use cast.
+	* src/cff/cf2ft.c (cf2_freeSeacComponent): Ditto.
+	* src/cff/cffobjs.c (remove_subset_prefix, remove_style): Ditto.
+
+	* src/cid/cidparse.c (cid_parser_new): Use cast.
+
+	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Use cast.
+
+	* src/psaux/psobjs.c (reallocate_t1_table): Fix argument type.
+
+	* src/raster/ftraster.c (ft_black_reset): Use cast.
+
+	* src/truetype/ttgxvar.c (FT_Stream_FTell): Use cast.
+	(ALL_POINTS): Fix cast.
+
+	* src/type1/t1driver.c (t1_ps_get_font_value): Add casts.
+	* src/type1/t1parse.c (T1_Get_Private_Dict): Add cast.
+
+2013-06-05  Dave Arnold  <darnold@adobe.com>
+
+	Fix more MSVC Win32 compiler warnings.
+
+	* src/base/ftobjs.c: Fix typo in MS pragma.
+
+	* src/base/bdflib.c (_bdf_set_default_spacing, _bdf_add_property):
+	`lineno' is only used in debug mode.
+
+	* src/cff/cf2ft.c (cf2_builder_moveTo): `params' is only used in
+	debug mode.
+
+2013-06-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix compiler warnings.
+
+	* include/freetype/internal/ftmemory.h: Decorate memory allocation
+	macros with `FT_Long' where appropriate.
+	Remove duplicate of FT_MEM_QRENEW_ARRAY definition.
+
+	* src/base/ftbitmap.c (ft_gray_for_premultiplied_srgb_bgra): Use
+	cast.
+
+	* src/base/ftobjs.c: Add warning disabling pragma for MSVC while
+	including `md5.c'.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdESC>: Add
+	cast.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_compound): Fix casts.
+	(tt_sbit_decoder_load_bitmap): Beautification.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Initialize
+	variables (earlier).
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph): Pacify compiler.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Use unsigned constants
+	where appropriate.
+
+	* src/type1/t1load.c (T1_Get_MM_Var): Ditto.
+
+2013-06-04  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cf2font.c (cf2_getGlyphWidth): Initialize `advWidth'.
+
+	Problem reported by Ingmar Sittl <ingmar.sittl@elektrobit.com>.
+
+2013-06-04  Werner Lemberg  <wl@gnu.org>
+
+	Apply fixes for cppcheck nitpicks.
+
+	  http://cppcheck.sourceforge.net/
+
+	The call was (from the top-level of the FreeType tree):
+
+	  cppcheck --force \
+	           --enable=all \
+	           -I include \
+	           -I include/freetype/ \
+	           -I include/freetype/config/ \
+	           -I include/freetype/internal/ \
+	           . &> cppcheck.log
+
+	Note that the current version heavily chokes on FreeType, delivering
+	many wrong results.  I will report those issues to the cppcheck team
+	so that a newer version gives improved results hopefully.
+
+	*/* Improve variable scopes.
+	*/* Remove redundant initializations which get overwritten.
+
+	* src/base/ftmac.c, builds/mac/ftmac.c (count_faces_scalable):
+	Remove unused variable.
+
+	* src/base/ftdbgmem.c (ft_mem_table_destroy): `table' can't be zero.
+
+	* src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt1_entry_validate):
+	Remove functionless code.
+
+	* src/tools/ftrandom.c (main): Fix memory leak.
+
+2013-06-03  Werner Lemberg  <wl@gnu.org>
+
+	Add CFF_CONFIG_OPTION_OLD_ENGINE configuration option.
+
+	This controls whether the old FreeType CFF engine gets compiled into
+	FreeType.  It is now disabled by default.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(CFF_CONFIG_OPTION_OLD_ENGINE): New macro.
+
+	* src/cff/cffdrivr.c (cff_property_set), src/cff/cffgload.c
+	(CFF_Operator, cff_argument_counts, cff_builder_add_point,
+	cff_operator_seac, cff_decoder_parse_charstrings, cff_slot_load),
+	src/cff/cffgload.h, src/cff/cffobjs.c (cff_driver_init): Use
+	CFF_CONFIG_OPTION_OLD_ENGINE to guard the affected code.
+
+	* docs/CHANGES: Updated.
+
+2013-06-02  Werner Lemberg  <wl@gnu.org>
+
+	Fix PNG library handling.
+
+	* builds/unix/configure.raw: Don't use LIBPNG_LIBS but
+	LIBPNG_LDFLAGS.
+
+2013-05-23  Behdad Esfahbod  <behdad@google.com>
+
+	Add support for color embedded bitmaps (eg. color emoji).
+
+	A new load flag, FT_LOAD_COLOR, makes FreeType load color
+	embedded-bitmaps, following this draft specification
+
+	  https://color-emoji.googlecode.com/git/specification/v1.html
+
+	which defines two new SFNT tables, `CBDT' and `CBLC' (named and
+	modeled after `EBDT' and `EBLC', respectively).  The color bitmaps
+	are stored in the new FT_PIXEL_MODE_BGRA format to represent BGRA
+	pre-multiplied sRGB images.  If PNG support is available, PNG color
+	images as defined in the same proposed specification are supported
+	also.
+
+	Note that color bitmaps are converted to grayscale if client didn't
+	ask for color.
+
+	* builds/unix/configure.raw: Search for libpng.
+	Add `--without-png' option.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(FT_CONFIG_OPTION_USE_PNG): New macro.
+
+	* include/freetype/freetype.h (FT_LOAD_COLOR): New load flag.
+
+	* include/freetype/ftimage.h (FT_Pixel_Mode): Add
+	`FT_PIXEL_MODE_BGRA'.
+
+	* include/freetype/tttags.h (TTAG_CBDT, TTAG_CBLC): New tags.
+
+	* src/base/ftbitmap.c (FT_Bitmap_Embolden): Updated.
+	(ft_gray_for_premultiplied_srgb_bgra): New function.
+	(FT_Bitmap_Convert): Handle FT_PIXEL_MODE_BGRA.
+
+	* src/sfnt/pngshim.c, src/sfnt/pngshim.h: New files.
+
+	* src/sfnt/sfnt.c: Include `pngshim.c'.
+
+	* src/sfnt/ttsbit.c: Include FT_BITMAP_H and `pngshim.h'
+	(tt_face_load_eblc): Load `CBLC'.
+	(tt_sbit_decoder_init): Load `CBDT'.
+	(tt_sbit_decoder_alloc_bitmap): Pass load flags to select between
+	color and grayscale bitmaps.
+	Set `num_grays'.  This is used by `ftview' to choose the blending
+	algorithm.
+	(tt_sbit_decoder_load_byte_aligned,
+	tt_sbit_decoder_load_bit_aligned, tt_sbit_decoder_load_compound,
+	tt_sbit_decoder_load_image): Pass load flag.
+	s/write/pwrite/.
+	Don't call `tt_sbit_decoder_alloc_bitmap'.
+	Updated.
+	(tt_sbit_decoder_load_png) [FT_CONFIG_OPTION_USE_PNG]: New function.
+	(tt_sbit_decoder_load_bitmap): Pass load flag.
+	Handle new glyph formats 17, 18, and 19.
+	Call `tt_sbit_decoder_alloc_bitmap'.
+	Flatten color bitmaps if necessary.
+	(tt_face_load_sbit_image): Updated.
+
+	* src/sfnt/rules.mk (SFNT_DRV_SRC): Add `pngshim.c'.
+
+	* docs/CHANGES: Updated.
+
+2013-05-24  Guenter  <info@gknw.net>
+
+	Apply Savannah patch #8055.
+
+	Make `apinames' create an import file for NetWare.
+
+	* src/tools/apinames.c (PROGRAM_VERSION): Set to 0.2.
+	(OutputFormat): Add `OUTPUT_NETWARE_IMP'.
+	(names_dump): Handle it.
+	(usage): Updated.
+	(main): Handle new command line flag `-wN'.
+
+2013-05-23  Behdad Esfahbod  <behdad@behdad.org>
+
+	Compilation fix.
+
+	* src/truetype/ttinterp.c (TT_RunIns)
+	[!TT_CONFIG_OPTION_SUBPIXEL_HINTING]: Make it work.
+
+2013-05-22  Infinality  <infinality@infinality.net>
+
+	[truetype] Formatting and an additional subpixel tweak.
+
+	* src/truetype/ttinterp.c (Ins_SHPIX): Formatting fix.
+	* src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules):
+	Revert previous modification for Verdana clones.
+
+2013-05-22  Infinality  <infinality@infinality.net>
+
+	[truetype] Adjust subpixel zp2 moves and tweak rules.
+
+	These modifications fix thin diagonal stems in some legacy fonts.
+
+	* src/truetype/ttinterp.c (Direct_Move_X): Remove unused macro.
+	(Move_Zp2_Point): Don't always disable x moves for subpixel rendering.
+	(Ins_SHP): Disable x moves here for subpixel rendering.
+	(Ins_SHPIX): Only disable x moves in compatibility mode.
+	Split out zp2 move reversals and reorder conditional respectively.
+
+	* src/truetype/ttsubpix.c (SKIP_NONPIXEL_Y_MOVES_Rules): Fix oversight.
+	Only adjust Verdana clones for 17 ppem.
+	(SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions): Add Courier New.
+	(ALWAYS_SKIP_DELTAP_Rules): Found additional cases for Arial `s'.
+
+2013-05-20  Infinality  <infinality@infinality.net>
+
+	[truetype] Simplify and improve subpixel function detection.
+
+	Some small enhancements have allowed the removal of many macros and
+	the simplification of existing rules in `ttsubpix.c'.
+
+	* src/truetype/ttsubpix.h (SPH_TWEAK_ALLOW_X_DMOVEX,
+	SPH_TWEAK_ALLOW_X_MOVE_ZP2,
+	SPH_TWEAK_DELTAP_SKIP_EXAGGERATED_VALUES,
+	SPH_TWEAK_SKIP_INLINE_DELTAS, SPH_TWEAK_MIRP_CVT_ZERO): Removed.
+	(SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP): New rule macro.
+
+	* src/truetype/ttsubpix.c: Updated affected rules.
+
+	* src/truetype/ttinterp.c (Direct_Move_X): Updated.
+	(INS_FDEF): Add additional function detection.
+	(INS_ENDF): Set runtime flag.
+	(Ins_CALL): Skip the call under certain conditions.
+	Remove bad code.
+	(Ins_LOOPCALL): Skip the call under certain conditions.
+	Remove bad code.
+	(Move_Zp2_Point): Updated.
+	(Ins_SHPIX): Updated.
+	Skip the move under some situations.
+	(Ins_MIAP): Improve conditions.
+	(Ins_MIRP): Updated.
+	(Ins_DELTAP): Skip move under certain conditions.
+	Simplify conditions.
+	(TT_RunIns): Updated.
+	Add code to handle new function detection.
+	Trace messages.
+
+2013-05-17  Werner Lemberg  <wl@gnu.org>
+
+	Update more FT_Err_XXX macros using FT_ERR and FT_THROW;
+
+	* builds/amiga/src/base/ftsystem.c, builds/mac/ftmac.c,
+	builds/unix/ftsystem.c, builds/vms/ftsystem.c: Do it.
+
+2013-05-15  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add `interpreter-version' property.
+
+	This makes the option TT_CONFIG_OPTION_SUBPIXEL_HINTING controllable
+	at runtime.
+
+	* include/freetype/ftttdrv.h: New file.
+
+	* include/freetype/config/ftheader.h (FT_TRUETYPE_DRIVER_H): New
+	macro.
+
+	* src/truetype/ttdriver.c: Include FT_TRUETYPE_DRIVER_H.
+	(tt_property_set, tt_property_get): Fill templates.
+
+	* src/truetype/ttobjs.h (TT_DriverRec): Add `interpreter_version'
+	member.
+	Remove unused `extension_component' member.
+
+	* src/truetype/ttgload.c: Include FT_TRUETYPE_DRIVER_H.
+	(tt_get_metrics, TT_Hint_Glyph, TT_Process_Simple_Glyph,
+	compute_glyph_metrics, tt_loader_init): Use `interpreter_version'.
+
+	* src/truetype/ttinterp.c: Include FT_TRUETYPE_DRIVER_H.
+	(SUBPIXEL_HINTING): New macro to check `interpreter_version' flag.
+	Update all affected functions to use it.
+	Use TT_INTERPRETER_VERSION_XXX where appropriate.
+
+	* src/truetype/ttobjs.c: Include FT_TRUETYPE_DRIVER_H.
+	(tt_driver_init): Initialize `interpreter_version'.
+
+	* src/truetype/ttsubpix.c: Include FT_TRUETYPE_DRIVER_H.
+	Use TT_INTERPRETER_VERSION_XXX where appropriate.
+
+2013-05-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Avoid empty source file.
+
+	* src/truetype/ttsubpix.c [!TT_CONFIG_OPTION_SUBPIXEL_HINTING]:
+	Provide dummy typedef.
+
+2013-05-13  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cf2font.c (cf2_getGlyphWidth): Fix uninitialized variable.
+
+	Fix suggested by Vaibhav Nagarnaik <vnagarnaik@gmail.com>.
+
+2013-05-13  Brian Nixon  <bnixon@yahoo.com>
+
+	Fix Savannah bug #38970.
+
+	* src/base/ftdebug.c, builds/win32/ftdebug.c,
+	builds/wince/ftdebug.c, builds/amiga/src/base/ftdebug.c
+	(ft_debug_init): Don't read past the environment variable FT2_DEBUG.
+
+2013-05-12  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add framework for TrueType properties.
+
+	* src/truetype/ttdriver.c: Include FT_SERVICE_PROPERTIES_H.
+	(tt_property_set, tt_property_get): New functions, still empty.
+	Define `tt_service_properties' service.
+	Update `tt_services'.
+
+	* src/truetype/ttpic.h: Include FT_SERVICE_PROPERTIES_H.
+	(TT_SERVICE_PROPERTIES_GET): New macro.
+	(TTModulePIC): Add `tt_service_properties'.
+
+2013-05-12  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #38967.
+
+	* src/base/ftcalc.c (FT_DivFix) [FT_LONG64]: Fix cast.
+
+2013-05-12  Werner Lemberg  <wl@gnu.org>
+
+	Introduce unsigned 64bit type (if available).
+
+	* include/freetype/config/ftconfig.h: Define FT_UINT64 if available.
+	[FT_LONG64]: Provide FT_UInt64.
+
+	* builds/unix/ftconfig.in: Synchronized.
+
+2013-05-12  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #38968.
+
+	* include/freetype/ftmodapi.h: Add `FT_EXPORT' to
+	FT_Property_{Set,Get}.
+	* src/base/ftobjs.c: Add `FT_EXPORT_DEF' to
+	FT_Property_{Set,Get}.
+
+2013-05-10  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Clean up bitmap code.
+
+	* src/sfnt/ttsbit.c: Deleted.
+	* src/sfnt/ttsbit0.c: Renamed to `ttsbit.c'.
+	* rules.mk (SFNT_DRV_H): Updated.
+
+2013-05-10  Werner Lemberg  <wl@gnu.org>
+
+	*/* [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove macro and guarded code.
+
+----------------------------------------------------------------------------
+
+Copyright 2013-2018 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.
+
+
+Local Variables:
+version-control: never
+coding: utf-8
+End:
diff --git a/ChangeLog.26 b/ChangeLog.26
new file mode 100644
index 0000000..ea89e91
--- /dev/null
+++ b/ChangeLog.26
@@ -0,0 +1,5711 @@
+2016-07-12  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6.5 released.
+	=========================
+
+
+	Tag sources with `VER-2-6-5'.
+
+	This commit immediately follows `[mac] Fix ftexport.sym target in
+	Jamfile.' on a separate branch, which was then merged with master
+	after the release.
+
+	* include/freetype/config/ftoption.h
+	(TT_CONFIG_OPTION_SUBPIXEL_HINTING): Comment out.
+
+	* docs/VERSION.TXT: Add entry for version 2.6.5.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6.4/2.6.5/, s/264/265/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
+
+	* builds/unix/configure.raw (version_info): Set to 18:5:12.
+	* CMakeLists.txt (VERSION_PATCH): Set to 5.
+
+	* docs/CHANGES: Updated.
+
+2016-07-11  Werner Lemberg  <wl@gnu.org>
+
+	Conditionally compile environment support.
+
+	* include/freetype/internal/ftobjs.h, src/autofit/afmodule.c,
+	src/base/ftobjs.c, src/cff/cffdrivr.c, src/truetype/ttdriver.c:
+	Decorate with `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES' where
+	necessary.
+
+2016-07-11  Werner Lemberg  <wl@gnu.org>
+
+	Handle properties in `FREETYPE_PROPERTIES' environment variable.
+
+	This commit covers the most important one.
+
+	* src/autofit/afmodule.c (af_property_set): Handle `warping',
+	`darkening-parameters', and `no-stem-darkening'.
+
+	* src/cff/cffdrivr.c (cff_property_set): Handle
+	`darkening-parameters', `hinting-engine', and `no-stem-darkening'.
+
+	* src/truetype/ttdriver.c (tt_property_set): Handle
+	`interpreter-version'.
+
+2016-07-11  Werner Lemberg  <wl@gnu.org>
+
+	Replace calls to `atol' with `strtol'.
+
+	We later on need strtol's `endptr' feature.
+
+	* include/freetype/config/ftstdlib.h (ft_atol): Replace with...
+	(ft_strtol): ... this.
+
+	* src/base/ftdbgmem.c (ft_mem_debug_init): Updated.
+	* src/cid/cidparse.c (cid_parser_new): Ditto.
+	* src/type42/t42drivr.c (t42_get_name_index), src/type42/t42objs.c
+	(T42_GlyphSlot_Load): Ditto.
+
+2016-07-10  Werner Lemberg  <wl@gnu.org>
+
+	Implement handling of `FREETYPE_PROPERTIES' environment variable.
+
+	Recognizing properties follows in another commit.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES): New macro.
+
+	* include/freetype/config/ftstdlib.h (ft_getenv): New macro.
+
+	* src/base/ftinit.c (ft_set_default_properties): New function to
+	parse `FREETYPE_PROPERTIES' and calling `ft_property_string_set'.
+	(FT_Init_FreeType): Updated.
+
+2016-07-09  Werner Lemberg  <wl@gnu.org>
+
+	Add function `ft_property_string_set'.
+
+	This is a preparation for handling an `FREETYPE_PROPERTIES'
+	environment variable to control (some) driver properties.
+
+	No change in functionality.
+
+	* src/base/ftobjs.c (ft_property_do): Add `value_is_string'
+	parameter.
+	(ft_property_string_set): New function.
+	(FT_Property_Set, FT_Property_Get): Updated.
+
+	* include/freetype/internal/ftobjs.h: Updated.
+
+	* include/freetype/internal/services/svprop.h
+	(FT_Properties_SetFunc): Add `value_is_string' parameter.
+
+	* src/autofit/afmodule.c (af_property_set), src/cff/cffdrivr.c
+	(cff_property_set), src/truetype/ttdriver.c (tt_property_set):
+	Updated, emitting an error currently if `value_is_string' is set.
+
+2016-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[mac] Fix ftexport.sym target in Jamfile.
+
+	* Jamfile: Update the directories of the header files scanned for
+	ftexport.sym.  They were incorrect since the migration of the
+	header files, on 2015-06-22.  Either inexisting include/cache
+	(removed on 2006-03-20) is not needed to be listed explicitly.
+	Now ftmac.h is scanned only in the case of Mac OS & Mac OS X.
+
+2016-07-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Sub-banding protocol revision.
+
+	Rasterization sub-banding is utilized at large sizes while using a
+	rather small fixed memory pool.  Indeed it is possible to make an
+	educated guess how much memory is necessary at a given size for a
+	given glyph.  It turns out that, for a large majority of European
+	glyphs, you should store about 8 times more boundary pixels than
+	their height.  Or, vice versa, if your memory pool can hold 800
+	pixels the band height should be 100 and you should sub-band
+	anything larger than that.  Should you still run out of memory,
+	FreeType bisects the band but you have wasted some time.  This is
+	what has been implemented in FreeType since the beginning.
+
+	It was overlooked, however, that the top band could grow to twice
+	the default band size leading to unnecessary memory overflows there.
+	This commit fixes that.  Now the bands are distributed more evenly
+	and cannot exceed the default size.
+
+	Now the magic number 8 is really suitable for rather simple European
+	scripts.  For complex Chinese logograms the magic number should be
+	13 but that is subject for another day.
+
+	* src/smooth/ftgrays.c (gray_convert_glyph): Revise sub-banding
+	protocol.
+
+2016-07-07  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[mac] Fix Savannah bug #48417.
+
+	Mac OS X linker throws errors when `-exported_symbol_list' input
+	file includes non-existing symbols.  Reported by Ryan Schmidt.
+
+	* builds/exports.mk: Exclude ftmac.h from the headers for apinames
+	by default.  Include it when ftmac.c would be compiled.
+
+2016-07-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TInstruction_Function): Removed, unused.
+
+2016-07-05  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6.4 released.
+	=========================
+
+
+	Tag sources with `VER-2-6-4'.
+
+	* docs/VERSION.TXT: Update documentation and bump version number to
+	2.6.4.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6.3/2.6.4/, s/263/264/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
+
+	* builds/unix/configure.raw (version_info): Set to 18:4:12.
+	* CMakeLists.txt (VERSION_PATCH): Set to 4.
+
+	* docs/CHANGES: Updated.
+
+2016-07-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/pfr/pfrsbit.c (pfr_lookup_bitmap_data): Fix compiler warning.
+
+2016-07-04  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Variable type revision (part 2).
+
+	* src/smooth/ftgrays.c (TArea): Restore original definition as `int'.
+	(gray_render_line) [FT_LONG64]: Updated.
+	(gray_convert_glyph): 32-bit band bisection stack should be 32 bands.
+	(gray_convert_glyph_inner): Trace successes and failures.
+
+2016-07-04  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Handle single-point contours as segments.
+
+	Doing so allows us to link them to edges – some fonts like
+	`NotoSansGurmukhi-Regular' have such isolated points sitting exactly
+	on other outlines.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Don't
+	ignore one-point contours but handle them specially as one-point
+	segments.
+	(af_latin_hints_compute_edges): Append one-point segments to edges
+	if possible.
+
+2016-07-02  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Remove unused structure members.
+
+	* src/autofit/afhints.h (AF_SegmentRec, AF_EdgeRec): Remove
+	`num_linked'.
+
+	* src/autofit/afcjk.c (af_cjk_hints_link_segments): Updated.
+
+2016-07-02  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Update to Unicode 9.0.0.
+
+	* src/autofit/afranges.c (af_arab_nonbase_uniranges,
+	af_cyrl_uniranges): Add new data.
+
+2016-07-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Variable type revision (part 1).
+
+	This patch restores original `TCoord' definition as `int' so that the
+	rendering pool is used more efficiently on LP64 platforms (unix).
+
+	* src/smooth/ftgrays.c (gray_TWorker, TCell, gray_TBand): Switch some
+	fields to `TCoord'.
+	(gray_find_cell, gray_render_scanline, gray_render_line, gray_hline,
+	gray_sweep, gray_convert_glyph): Updated.
+
+2016-06-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor clean-ups.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove redundant `ycount'.
+	(gray_sweep, gray_convert_glyph, gray_dump_cells): Updated.
+
+2016-06-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor clean-ups.
+
+	* src/smooth/ftgrays.c (gray_convert_glyph): Do not use volatile
+	qualifier.
+	(gray_raster_render): Move span initializations from here.
+	(gray_sweep): ... to here and remove unused `target' argument.
+
+2016-06-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[pcf] Fix handling of very large fonts (#47708).
+
+	* src/pcf/pcfread.c (pcf_get_encodings): Make `encodingOffset' an
+	unsigned short.
+	Only reject `0xFFFF' as an invalid encoding offset.
+
+2016-06-25  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Really fix deallocation in case of error (#47726).
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Thinko; initialize
+	`outline.points' also.
+
+2016-06-23  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Consolidate memory management.
+
+	* src/smooth/ftgrays.c (gray_init_cells): Remove function.
+	(gray_TWorker): Remove fields that become local variables.
+	(gray_raster_render): Move rendering buffer declaration from here.
+	(gray_convert_glyph): ... to here and update accordingly.
+
+2016-06-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Consolidate boundary checks.
+
+	Removing the checks from `gray_hline' shaves 1% off rendering speed.
+
+	* src/smooth/ftgrays.c [STANDALONE_]: Duplicate `FT_MIN' and `FT_MAX'.
+	(gray_TWorker): No need to store `clip_box'.
+	(gray_hline): Remove unnecessary boundary checks.
+	(gray_convert_glyph): Move boundary checks from here.
+	(gray_raster_render): ... to here and consolidate.
+
+2016-06-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Use `FT_Outline_Get_CBox'.
+
+	* src/smooth/ftgrays.c [STANDALONE_]: Duplicate `FT_Outline_Get_CBox'.
+	(gray_compute_cbox): Remove this function.
+	(gray_convert_glyph): Update to use `FT_Outline_Get_CBox'.
+
+2016-06-20  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Remove compiler warnings.
+
+	* src/smooth/ftgrays.c (gray_convert_glyph): Fix reports from clang.
+
+2016-06-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Sanitize memory management.
+
+	* src/smooth/ftgrays.c (gray_convert_glyph): Cleaned up.
+
+2016-06-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Remove `band_shoot' that never worked.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove `band_shoot'.
+	(gray_convert_glyph): Updated.
+
+2016-06-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[raster, smooth] Handle FT_RENDER_POOL_SIZE better.
+
+	* src/raster/ftraster.c (FT_MAX_BLACK_POOL): New macro.
+	(ft_black_render): Updated.
+	* src/smooth/ftgrays.c (FT_MAX_GRAY_POOL): New macro.
+	(gray_raster_render): Updated.
+
+2016-06-16  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/md5.c: Updated to recent version.
+
+2016-06-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_hline): Optimize if-condition.
+
+2016-06-13  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Cherokee script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Cherokee.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Cherokee standard characters.
+
+	* src/autofit/afranges.c: Add Cherokee data.
+
+	* src/autofit/afstyles.h: Add Cherokee data.
+
+2016-06-09  David Capello  <davidcapello@gmail.com>
+
+	[cmake] Avoid modifying `ftconfig.h' and `ftoption.h' files.
+
+	* CMakeLists.txt: Each time cmake is run those files are
+	modified and the whole FreeType library is recompiled.  With this
+	change we change the files only if there are real modifications, so
+	we can avoid recompilations.
+
+2016-06-09  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Check number of properties (#48166).
+
+	* src/bdf/bdflib.c (_bdf_parse_start): Implement.
+
+2016-06-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Re-enable new line renderer on 64-bit archs.
+
+	* src/smooth/ftgrays.c (gray_render_line): Conditionally re-enable new
+	implementation, where it is safe from overflows.
+
+2016-06-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor clean-ups.
+
+	* src/smooth/ftgrays.c (gray_dump_cells): Move out of the way.
+	(gray_render_span): Remove spurious casts and streamline.
+
+2016-06-07  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Ethiopic script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Ethiopic.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Ethiopic standard characters.
+
+	* src/autofit/afranges.c: Add Ethiopic data.
+
+	* src/autofit/afstyles.h: Add Ethiopic data.
+
+2016-06-07  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix compilation with VS2016 (#48126).
+
+	This compiler doesn't recognize the end-of-comment sequence `*/' if
+	it immediately follows non-ASCII characters.
+
+	* src/autofit/afscript.h: Ensure whitespace before `*/'.
+
+2016-06-04  Werner Lemberg  <wl@gnu.org>
+
+	Fix a test for named instances (#48122).
+
+	This was missed while giving negative face indices an extended
+	meaning.
+
+	* src/base/ftobjs.c (Mac_Read_sfnt_Resource): Implement.
+
+2016-05-31  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] Let SHPIX move points in the twilight zone in v40.
+
+	* src/truetype/ttinterp.c (Ins_SHPIX): Allow SHPIX to move points in
+	the twilight zone.  Otherwise, treat SHPIX the same as DELTAP.
+	Unbreaks various fonts such as older versions of Rokkitt and DTL
+	Argo T Light that would glitch severely after calling ALIGNRP after a
+	blocked SHPIX.
+
+2016-05-30  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Support `CharStrings' entry format as created by LilyPond.
+
+	* src/type42/t42parse.c (t42_parse_charstrings): Handle entries
+	having the format
+
+	  (foo) cvn 12345 def
+
+2016-05-28  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afranges.c: Remove `UL' postfix from hex numbers.
+
+	Suggested by Alexei.  `UL' is only needed for 16bit compilers, but
+	it seems noone is using this anymore (and we no longer test whether
+	FreeType compiles in such an environment).  Otherwise, it is easy to
+	add the postfix to the `AF_UNICODE_RANGE' macro.
+
+2016-05-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Shrink bisection stack.
+
+	The convergence of Bézier flatteners is fast with the deviation
+	from straight line being asymptotically cut 4-fold on each bisection.
+	This justifies smaller bisection stack size.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove common `bez_stack'.
+	(gray_render_conic): Create and use conic `bez_stack'. Move back the
+	band analysis from...
+	(gray_conic_to): ... here.
+	(gray_render_cubic): Create and use cubic `bez_stack'. Move back the
+	band analysis from...
+	(gray_cubic_to): ... here.
+	(gray_move_to): Updated.
+
+2016-05-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fixes for Armenian and Gujarati ranges.
+
+	* src/autofit/afranges.c (af_armn_uniranges): Corrected.
+	(af_guru_nonbase_uniranges): Make U+0A3E a base character.
+
+2016-05-24  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Armenian script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Armenian.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Armenian standard characters.
+
+	* src/autofit/afranges.c: Add Armenian data.
+
+	* src/autofit/afstyles.h: Add Armenian data.
+
+2016-05-23  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/unix-cc.in (LINK_LIBRARY): Use `-export-symbols'.
+
+	This was commented about 10 years ago – I think the reason then to
+	disable libtool's `-export-symbols' option was to give some badly
+	programmed applications access to internal FreeType functions.
+
+	I believe that we should no longer take care of such programs; the
+	number of symbols exported should be rather restricted as much as
+	possible.
+
+2016-05-22  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Gurmukhi script.
+
+	This essentially moves the Gurmukhi script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Gurmukhi.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Gurmukhi standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Gurmukhi data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Gurmukhi data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-05-21  Werner Lemberg  <wl@gnu.org>
+
+	Minor clang++ fixes.
+
+	* src/base/ftobjs.c (FT_Add_Module), src/psaux/psobjs.c
+	(ps_parser_load_field), src/type1/t1load.c (parse_subrs): Add
+	initializer.
+
+	* src/cache/ftccache.h (FTC_CACHE_TRYLOOP_END): Avoid implicit
+	conversion from NULL to boolean.
+
+2016-05-21  Werner Lemberg  <wl@gnu.org>
+
+	Work around a bug of the C 8.0.0.1 compiler on AIX 5.3 (#47955).
+
+	* include/freetype/internal/ftmemory.h (cplusplus_typeof): Use
+	braces for `extern "C++"'.
+
+2016-05-17  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] Make TT_LOADER_SET_PP support subpixel hinting [3/3].
+
+	* src/truetype/ttgload.c (TT_LOADER_SET_PP): Replace macro with...
+	(tt_loader_set_pp): ... this new function.
+	Update all callers.
+
+2016-05-17  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] New implementation of v38 bytecode interpreter [2/3].
+
+	This patch actually modifies the bytecode interpreter.
+
+	See added comments in `ttinterp.h' for more information on this and
+	the following commit in the series.
+
+	* src/truetype/ttinterp.c (SUBPIXEL_HINTING): Replaced by...
+	(NO_SUBPIXEL_HINTING, SUBPIXEL_HINTING_INFINALITY,
+	SUBPIXEL_HINTING_MINIMAL): ...new macros.
+	(Direct_Move, Direct_Move_X, Direct_Move_Y): Handle backward
+	compatibility.
+	Updated.
+	(Ins_RS, Ins_FDEF, Ins_ENDF, Ins_CALL, Ins_LOOPCALL, Ins_MD):
+	Updated.
+	(Ins_INSTCTRL): Handle native ClearType mode flag.
+	Updated.
+	(Ins_FLIPPT, Ins_FLIPRGON, Ins_FLIPRGOFF): Handle backward
+	compatibility.
+	(Move_Zp2_Point): Ditto.
+	(Ins_SHP): Updated.
+	(Ins_SHPIX): Handle backward compatibility.
+	Updated.
+	(Ins_MSIRP, Ins_MDAP, Ins_MIAP, Ins_MDRP, Ins_MIRP): Updated.
+	(Ins_ALIGNRP): Updated.
+	(Ins_IUP, Ins_DELTAP): Handle backward compatibility.
+	Updated.
+	(Ins_GETINFO): Handle v38 flags.
+	Updated.
+	(TT_RunIns): Handle backward compatibility mode.
+	Updated.
+
+2016-05-17  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] New implementation of v38 bytecode interpreter [1/3].
+
+	This patch prepares data structures and the like.
+
+	See added comments in `ttinterp.h' for more information on this and
+	the following commits in the series.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(TT_CONFIG_OPTION_SUBPIXEL_HINTING): Assign values to differentiate
+	between subpixel versions.
+	(TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY,
+	TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL): New macros.
+
+	* include/freetype/ftttdrv.h (TT_INTERPRETER_VERSION_40): New macro.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Updated.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): Define new fields
+	`subpixel_hinting_lean', `vertical_lcd_lean',
+	`backward_compatibility', `iupx_called', iupy_called', and
+	`grayscale_cleartype' for new hinting mode.
+
+	* src/truetype/ttdriver.c (tt_property_set): Handle v38 and v40
+	interpreters conditionally.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph): Save phantom points unless
+	in v38 backward compatibility mode.
+	Updated.
+	(compute_glyph_metrics): Add v38 backward compatibility mode
+	constraint for adjusting advance widths.
+	Updated.
+	(tt_loader_init): Handle new flags `subpixel_hinting_lean',
+	`grayscale_cleartype', and `vertical_lcd_lean'.
+	Updated.
+	(tt_get_metrics, TT_Process_Simple_Glyph, TT_LOADER_SET_PP):
+	Updated.
+
+	* src/truetype/ttobjs.c (tt_driver_init): Conditionally set
+	default interpreter version number.
+
+	* src/truetype/ttsubpix.c, src/truetype/ttsubpix.h: Updated.
+
+2016-05-17  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix matrix scaling (#47848).
+
+	* include/freetype/config/ftstdlib.h (FT_LONG_MIN): New macro.
+
+	* src/cff/cffparse.c (cff_parse_font_matrix): Use largest scaling
+	value of all matrix coefficients to scale matrix.
+
+	* src/cff/cffobjs.c (cff_face_init): Use `matrix->yx' member for
+	matrix normalization if `matrix->yy' is zero.
+
+2016-05-16  Werner Lemberg  <wl@gnu.org>
+
+	[base] Reject invalid sfnt Mac resource (#47891).
+
+	* src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Check validity
+	of `CID ' and `TYPE1' table offset and length.
+
+2016-05-16  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Fix scanning for `StartData' and `/sfnts' (#47892).
+
+	* src/cid/cidparse.c (STARTDATA, STARTDATA_LEN, SFNTS, SFNTS_LEN):
+	New macros.
+	(cid_parser_new): Fix and document algorithm.
+
+2016-05-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[truetype] Improve the recursive reference detector.
+
+	The previous fix for #46372 misunderstood a composite glyph referring
+	same component twice as a recursive reference.  See the discussion
+
+	  https://lists.gnu.org/archive/html/freetype/2016-05/msg00000.html
+
+	Thanks to Khaled Hosny for finding this issue.
+
+	* src/truetype/ttgload.c (ft_list_get_node_at): A function to get
+	the i-th node from FT_List.
+	(load_truetype_glyph): In the traversal scan of the reference tree
+	in the composite glyph, we clear the nodes filled by previous
+	sibling chain.
+
+2016-05-07  Werner Lemberg  <wl@gnu.org>
+
+	[cache] Allow value 0 for face ID.
+
+	We never dereference `face_id', and some implementations might use a
+	running number instead of a pointer.  Additionally, disallowing
+	value zero was undocumented.
+
+	* src/cache/ftccmap.c (FTC_CMapCache_Lookup), src/cache/ftcmanag.c
+	(FTC_Manager_LookupFace, FTC_Manager_RemoveFaceID): Remove test for
+	`face_id'.
+
+2016-05-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] More efficient accounting of conic splits and draws.
+
+	A single decrement counter of segments to draw, instead of an array,
+	contains all the information necessary to decide when to split and
+	when to draw a conic segment. The number of splits before each draw is
+	equal to the number of trailing zeros in the counter.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove `lev_stack'.
+	(gray_render_conic): Updated to use decrement counter of segments.
+
+2016-05-05  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Fix logic for `FT_Property_Set'.
+
+	Otherwise some properties could be set to arbitrary values, which is
+	harmless, but querying could give wrong positive results.
+
+	* src/cff/cffdrivr.c (cff_property_set) [hinting-engine],
+	* src/truetype/ttdriver.c (tt_property_set) [interpreter-version]:
+	Only allow defined values.
+
+2016-04-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Gujarati script.
+
+	This essentially moves the Gujarati script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Gujarati.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Gujarati standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Gujarati data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Gujarati data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-04-24  Werner Lemberg  <wl@gnu.org>
+
+	Minor.
+
+	* include/freetype/freetype.h (FT_HAS_*, FT_IS_*): Protect macro
+	argument with parentheses.
+
+2016-04-24  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix deallocation in case of error (#47726).
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Initialize fields in
+	`outline' that are going to be deallocated in case of error.
+
+2016-04-23  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve Georgian blue zone characters.
+
+	Suggested by Akaki Razmadze <razmadzekoko@gmail.com>.
+
+	* src/autofit/afblue.dat (AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM):
+	Updated.
+
+	* src/autofit/afblue.c: Regenerated.
+
+2016-04-16  David Capello  <davidcapello@gmail.com>
+
+	[cmake] Honor SKIP_INSTALL_* settings (as used in zlib).
+
+	As FreeType depends on zlib, if we don't install zlib (e.g., because
+	we defined SKIP_INSTALL_ALL), FreeType cannot be installed, too
+	(cmake triggers an error saying that FreeType cannot be installed
+	because zlib target isn't in the export set).
+
+	* CMakeLists.txt: Honor `SKIP_INSTALL_HEADERS',
+	`SKIP_INSTALL_LIBRARIES', and `SKIP_INSTALL_ALL' settings.
+
+2016-04-16  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Another fix for non-intermediate GX tuples.
+
+	* src/truetype/ttgxvar.c (ft_var_apply_tuple): Add some missing
+	cases.
+
+2016-04-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Remove forgotten macro.
+
+	* include/freetype/internal/internal.h
+	[FT_INTERNAL_POSTSCRIPT_GLOBALS_H]: Remove.
+
+2016-04-09  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Georgian scripts.
+
+	Georgian is problematic, since `uppercase' forms of Mkhedruli
+	(called Mtavruli) are not yet defined in Unicode, which means that
+	proper blue zones can't be defined.  However, there is already a
+	proposal submitted to Unicode; see
+
+	  https://www.unicode.org/L2/L2016/16034-n4707-georgian.pdf
+
+	Additionally, due to historical reasons, Unicode treats Khutsuri as
+	the same script as Mkhedruli, and so does OpenType.  However, since
+	the two scripts have completely different shapes it can happen that
+	blue zones differ considerably.  The tag `geok' used here (derived
+	from ISO 15924) to differentiate the two scripts is not an OpenType
+	tag in use.  If we now have a font that contains both glyphs for
+	Mkhedruli and Khutsuri, and it uses OpenType features for both also,
+	HarfBuzz unavoidably treats all glyphs as `geor'.  As a consequence,
+	blue zones for `geok' are not used for glyphs involved in the
+	OpenType features.
+
+	An issue not yet resolved is which OpenType feature should be used
+	to access Mtavruli glyph shapes; right now, FreeType doesn't set up
+	support for them, but it is easy to add them later on as soon as
+	more information is available.
+
+	* src/autofit/afblue.dat: Add blue zone data for Georgian.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Georgian standard characters.
+
+	* src/autofit/afranges.c: Add Georgian data.
+
+	* src/autofit/afstyles.h: Add Georgian data.
+
+2016-04-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Provide dummy blue zone for pseudo script `none'.
+
+	Even if the dummy hinter is used as the handler for `none' (which
+	doesn't use blue zones), it is more consistent than the old value
+	(which was 0), pointing to Arabic...
+
+	* src/autofit/afblue.dat: Add `AF_BLUE_STRINGSET_NONE'.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afstyles.h (none_dflt): Use AF_BLUE_STRINGSET_NONE.
+
+2016-03-30  Werner Lemberg  <wl@gnu.org>
+
+	* src/pfr/pfrload.c (pfr_aux_name_load): Thinko (#47567).
+
+2016-03-30  Werner Lemberg  <wl@gnu.org>
+
+	* src/pfr/pfrload.c (pfr_log_font_count): Better font size estimate.
+
+2016-03-30  Werner Lemberg  <wl@gnu.org>
+
+	* src/pfr/pfrload.c (pfr_aux_name_load): Fix memory leak (#47567).
+
+2016-03-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftadvanc.c (FT_Get_Advances): Fix invalid left shift.
+
+2016-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Fix binary search (#47514).
+
+	* src/pfr/pfrsbit.c (pfr_lookup_bitmap_data): Handle border
+	conditions correctly.
+
+2016-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Minor.
+
+	* src/pfr/pfrsbit.c (pfr_lookup_bitmap_data): Replace `left',
+	`right', and `middle' with `min', `max', and `mid' as used in other
+	FreeType binary search code.
+	(pfr_load_bitmap_metrics): Fix invalid left shift.
+
+2016-03-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/pfr/pfrtypes.h: Replace all enums with macros.
+
+	We need `~FOO' to unset bits, and only with unsigned values (which
+	`enum' isn't normally) this works cleanly.
+
+2016-03-26  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Robustify bitmap strike handling (#47514).
+
+	We did a binary search for a charcode without ensuring that the
+	searched data is ordered.  Validating the order is now done lazily,
+	this is, the first access to a bitmap glyph triggers the order check
+	in the corresponding bitmap strike.
+
+	* src/pfr/pfrtypes.h (PFR_BitmapFlags): New values
+	`PFR_BITMAP_VALID_CHARCODES' and `PFR_BITMAP_CHARCODES_VALIDATED'.
+
+	* src/pfr/pfrsbit.c (pfr_lookup_bitmap_data): Make `flags' argument
+	a pointer.  Handle new PFR_BITMAP_XXX flags.
+	(pfr_slot_load_bitmap): Updated.
+
+2016-03-26  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Fix handling of compound glyphs.
+
+	Extra items are indicated with different bit positions.
+
+	* src/pfr/pfrtypes.h (PFR_GlyphFlags): Replace
+	`PFR_GLYPH_EXTRA_ITEMS' with `PFR_GLYPH_SIMPLE_EXTRA_ITEMS' and
+	`PFR_GLYPH_COMPOUND_EXTRA_ITEMS'.
+
+	* src/pfr/pfrgload.c (pfr_glyph_load_simple,
+	pfr_glyph_load_compound): Use them.
+
+2016-03-25  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Minor.
+
+	* src/pfr/pfrsbit.c, src/pfr/pfrobjs.c: Use flag names instead of
+	bare numbers.
+
+2016-03-25  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Various clang sanitizer fixes.
+
+	* src/pfr/pfrsbit.c (pfr_load_bitmap_metrics): Correctly handle
+	signed nibbles.
+	(pfr_slot_load_bitmap): Correctly exit frame in case of error.
+	Fix invalid left shifts.
+
+2016-03-23  Werner Lemberg  <wl@gnu.org>
+
+	Rename `VERSION.DLL' (#47472).
+
+	* docs/VERSION.DLL: Renamed to...
+	* docs/VERSIONS.TXT: ...this.
+
+2016-03-23  Werner Lemberg  <wl@gnu.org>
+
+	[raster, smooth] Directly test outline size (#47500).
+
+	This improves stand-alone compilation.
+
+	* src/base/ftoutln.c (FT_Outline_Render): Move cbox size test to...
+
+	* src/raster/ftraster.c (ft_black_render), src/smooth/ftgrays.c
+	(gray_raster_render): ...these functions.
+
+2016-03-23  Werner Lemberg  <wl@gnu.org>
+
+	[raster, smooth] Fix some clang sanitizer runtime issues.
+
+	* src/raster/ftraster.c (ft_black_reset, ft_black_set_mode,
+	ft_black_render): Harmonize signatures with `ftimage.h'.
+
+	* src/smooth/ftgrays.c (gray_raster_render, gray_raster_reset):
+	Ditto.
+
+2016-03-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Minor.
+
+	This fixes an AddressSanitizer issue:
+
+	  ttgload.c:430:7: runtime error: null pointer passed as argument 1,
+	                   which is declared to never be null
+
+2016-03-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Thinko.
+
+	This fixes the previous commit to this file.
+
+2016-03-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Partly revert recent changes.
+
+	* src/smooth/ftgrays.c (gray_conic_to, gray_cubic_to): Rework
+	conditions to fix rendering issues.
+
+2016-03-20  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Show `near' points in tracing.
+
+	* src/autofit/afhints.h (AF_FLAG_NEAR): New macro.
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_points): Implement it.
+	(af_glyph_hints_reload): Handle AF_FLAG_NEAR.
+
+2016-03-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor refactoring and microoptimizations.
+
+	* src/smooth/ftgrays.c (gray_render_conic, gray_render_cubic): Move
+	band clipping from here.
+	(gray_conic_to, gray_cubic_to): ... to here.
+	(gray_render_line, gray_render_scanline): Initialize variables closer
+	to their use.
+
+2016-03-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor refactoring.
+
+	* src/smooth/ftgrays.c (gray_render_conic, gray_render_cubic): Move
+	upscaling from here.
+	(gray_conic_to, gray_cubic_to): ... to here.
+
+2016-03-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_latin_compute_stem_width): Optimize.
+
+2016-03-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Temporarily revert 6eb6158dd787 (#47114).
+
+	* src/smooth/ftgrays.c (gray_render_line): Old implementation.
+
+2016-03-12  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Improve coverage of rasterfuzzer.
+
+	* src/tools/ftfuzzer/rasterfuzzer.cc (LLVMFuzzerTestOneInput): Use
+	input data for `tags' array also.
+	Trim input data to get more positive hits.
+
+2016-03-11  Pavlo Denysov  <paul.kiev+savannah@gmail.com>
+
+	Fix CMake issues for iOS (patch #8941).
+
+	* CMakeLists.txt (CMAKE_TOOLCHAIN_FILE): Fix directory.
+	* builds/cmake/iOS.cmake: No longer enforce gcc.
+
+2016-03-09  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Fix handling of non-intermediate GX tuples.
+
+	We probably did not notice this as all fonts we tested had only
+	tuple_coords[i] be +1 or -1 for non-intermediate tuples.
+
+	* src/truetype/ttgxvar.c (ft_var_apply_tuple): Implement it.
+
+2016-03-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Refuse to render enormous outlines (#47114).
+
+	The goal is to avoid integer overflows in the rendering algorithms.
+	The limit is chosen arbitrarily at some 2^18 pixels, which should be
+	enough for modern devices including printers.
+
+	* src/base/ftoutln.c (FT_Outline_Render): Check CBox and reject
+	enormous outlines.
+
+2016-03-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Replace left shifts with multiplications (#47114).
+
+	* src/smooth/ftgrays.c (SUBPIXELS, UPSCALE, DOWNSCALE): Do it.
+
+2016-03-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Avoid excessive stem length rounding (#25392).
+
+	* src/autofit/aflatin.c (af_latin_compute_stem_width): Add argument
+	to pass difference between hinted and unhinted position of base
+	point; use this to adjust the stem width depending on the PPEM so
+	that it doesn't become too large under certain circumstances.
+	Update all callers using value 0 for this argument except...
+	(af_latin_align_linked_edge): Pass position delta of base point to
+	`af_latin_compute_stem_width'.
+
+2016-03-05  J Raynor  <jxraynor@gmail.com>
+
+	Make FreeType compile on AIX out of the box.
+
+	* builds/unix/configure.raw (XX_ANSIFLAGS): Don't use `-ansi' on
+	AIX.
+
+2016-03-01  Werner Lemberg  <wl@gnu.org>
+	    Kostya Serebryany  <kcc@google.com>
+
+	[ftfuzzer] Add unit for testing smooth and black rasterizers.
+
+	* src/tools/ftfuzzer/rasterfuzzer.cc: New file.
+
+2016-03-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix reallocation error introduced in 2016-02-27 (#47310).
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Reassign
+	`prev_segment' after reallocation.
+
+2016-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Fix clang warnings.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Use
+	FT_UShort for `min_flags' and `max_flags'.
+	Initialize `prev_*' variables.
+
+	* src/cff/cffobjs.c (cff_face_init) [FT_DEBUG_LEVEL_TRACE]: Fix
+	types of local variables.
+
+	* src/smooth/ftgrays.c (gray_dump_cells) [FT_DEBUG_LEVEL_TRACE]:
+	Update `printf' format string.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (setIntermediateAxis): Add cast.
+	(LLVMFuzzerTestOneInput): Fix loop type.
+
+2016-02-29  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Sinhala script.
+
+	This essentially moves the Sinhala script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Sinhala.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Sinhala standard character and move data
+	out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Sinhala data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Sinhala data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-02-27  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Properly handle spikes pointing to the x-axis.
+
+	An example that gets better rendered is glyph `uusignTaml' (glyph
+	index 2286) in font `FreeSerif.ttf' (Version 0412.2263) at 22ppem.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Properly
+	handle segments where the last point of the first segment is
+	identical to the first point in the second one.  This can happen for
+	malformed fonts or spikes.  We either merge the new segment with the
+	previous one (both segments point into the same direction), or we
+	discard the shorter segment if they point into different directions.
+
+2016-02-27  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor code clean-up.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Change
+	some local variable names to better differentiate between values
+	along a segment and values orthogonal to it.
+
+2016-02-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve BOUND action.
+
+	In complex glyph shapes, the original logic was too simple to cater
+	for situations that would actually need something similar to PS Hint
+	masks.  This fix should alleviate the worst cases.
+
+	* src/autofit/aflatin.c (af_latin_hint_edges): Don't allow
+	complete disappearance of stems.
+
+2016-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Tamil script.
+
+	This essentially moves the Tamil script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Tamil.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Tamil standard character and move data
+	out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Tamil data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Tamil data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-02-18  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Malayalam script.
+
+	This essentially moves the Malayalam script from the `Indic' hinter
+	to the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Malayalam.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Malayalam standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Malayalam data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Malayalam data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-02-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Fix integer overflow (#47114).
+
+	* src/smooth/ftgrays.c (TArea): Make it unconditionally `long'.
+
+2016-02-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffparse.c (cff_parse_multiple_master): Improve tracing.
+
+2016-02-15  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Handle T2 operator only with old CFF engine (#47157).
+
+	* src/cff/cffparse.c (cff_parser_run) <opcode 31>: Enclose with
+	#ifdef CFF_CONFIG_OPTION_OLD_ENGINE...#endif.
+
+2016-02-15  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Partially handle `load' and `store' ops in old CFF engine.
+
+	Now all glyphs of MM CFFs like `ITCGaramondMM-It.otf' can be
+	displayed.
+
+	* src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_store,
+	cff_op_load>: Partially implement it.
+
+	* src/cff/cffparse.c (cff_parser_init): Add new parameter to pass
+	the number of Multiple Master axes.
+	Update all callers.
+	(cff_parse_multiple_master): Get number of axes.
+	(cff_parser_run) <opcode 31>: Updated.
+	* src/cff/cffparse.h: Updated.
+	(CFF_ParserRec): Add `num_axes' field.
+
+	* src/cff/cffload.c: Updated.
+
+	* src/cff/cfftypes.h (CFF_FontRecDictRec): Add `num_axes' field.
+
+2016-02-15  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Correctly trace SIDs that contain NULL bytes.
+
+	We need this to properly trace Multiple Master CFFs, which contain
+	two SIDs that are charstrings.
+
+	This commit makes FreeType also show the last SID, omitted
+	previously due to a bug.
+
+	* src/cff/cfftypes.h (CFF_FontRec): Add `string_pool_size' field.
+
+	* src/cff/cffload.c (cff_index_get_pointers): Add argument to return
+	the pool size.
+	Update all callers.
+
+	* src/cff/cffobjs.c (cff_face_init) [FT_DEBUG_LEVEL_TRACE]: Directly
+	access `cff->strings' to display the non-default strings.
+
+2016-02-14  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/fthash.c: Include FT_INTERNAL_MEMORY_H.
+
+2016-02-14  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffparse.c: Include `cffgload.h'.
+
+	Problem reported by Colin Walters <walters@verbum.org>.
+
+2016-02-14  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Make old CFF engine show MM CFFs (without variations).
+
+	The new code only displays the first master in the font.
+
+	* src/cff/cffgload.c (cff_decode_parse_charstrings): Add new
+	parameter to allow function calls from dictionaries also.
+	<cff_op_blend>: Partially implement it.
+	Update all callers.
+	* src/cff/cffgload.h: Updated.
+
+	* src/cff/cffparse.c (cff_parser_init): Add new parameter to pass the
+	number of Multiple Master designs.
+	Update all callers.
+	(cff_parse_multiple_master): New function to rudimentarily parse
+	operator.
+	(cff_parser_run): Handle `T2' operator.
+	* src/cff/cffparse.h: Updated.
+	(CFF_ParserRec): Add `num_designs' field.
+
+	* src/cff/cffload.c: Updated.
+
+	* src/cff/cfftoken.h: Handle `MultipleMaster' operator.
+
+	* src/cff/cfftypes.h (CFF_FontRecDictRec): Add `num_designs' field.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Don't handle `fvar' table for
+	MM CFFs.
+
+2016-02-09  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Don't emit trailing newlines.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_code):
+	Use `rstrip'.
+
+2016-02-07  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6.3 released.
+	=========================
+
+
+	Tag sources with `VER-2-6-3'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.6.3.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6.2/2.6.3/, s/262/263/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
+
+	* builds/unix/configure.raw (version_info): Set to 18:3:12.
+	* CMakeLists.txt (VERSION_PATCH): Set to 3.
+
+	* docs/CHANGES: Updated.
+
+2016-02-07  Werner Lemberg  <wl@gnu.org>
+
+	Fix another runtime error found by clang's sanitizer (#47082).
+
+	* src/base/ftstroke.c (ft_stroke_border_export): Properly handle
+	empty input buffer.
+
+2016-02-07  Werner Lemberg  <wl@gnu.org>
+
+	Fix runtime errors found by clang's sanitizer (#47082).
+
+	* src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c
+	(FT_Outline_Copy), src/cache/ftcsbits.c (ftc_sbit_copy_bitmap):
+	Properly handle empty input buffer.
+
+2016-02-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Minor.
+
+	* src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_sqrt>:
+	Remove dead code.
+
+2016-02-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Implement missing operators in new engine (except `random').
+
+	* src/cff/cf2font.h (CF2_STORAGE_SIZE): New macro.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString): Implement the
+	following operators: abs, add, and, div, drop, dup, eq, exch, get,
+	ifelse, index, mul, neg, not, or, put, roll, sqrt, sub.
+
+	* src/cff/cf2stack.h, src/cff/cf2stack.c (cf2_stack_roll): New
+	auxiliary function for `roll' operator.
+
+2016-02-06  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix some Type 2 operators in old CFF engine.
+
+	* src/cff/cffgload.c (cff_decoder_parse_charstrings): Fix `eq'
+	operator, add `not' and (unsupported) `blend' operators.
+
+2016-02-05  Sebastian Rasmussen  <sebras@gmail.com>
+
+	Make direct call of `make install' work (#47072).
+
+	* builds/unix/unix-def.in (freetype-config): Make sure
+	`freetype-config' is generated for both make targets (`all' and
+	`install').
+
+2016-02-05  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix advance width loading for MM and GX fonts (#47064).
+
+	* src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Return false for
+	MM and GX fonts.
+	Update callers.
+
+2016-02-03  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix handling of face_index == -1 for pure CFF.
+
+	* src/cff/cffobjs.c (cff_face_init): Return correct number of faces.
+
+2016-01-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor tracing improvement.
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_points): Insert newline
+	at the start of a new contour.
+
+2016-01-28  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	Remove unpatented hinter (3/3).
+
+	* include/freetype/config/ftoption.h
+	(TT_CONFIG_OPTION_UNPATENTED_HINTING): Remove.
+
+	* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
+	`ignore_unpatented_hinter' field.
+	Update users.
+	(FT_DEBUG_HOOK_UNPATENTED_HINTING): Remove.
+	Update users.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Remove
+	`unpatented_hinting' field.
+	Update users.
+
+	* src/base/ftpatent.c (_tt_check_patents_in_range,
+	_tt_check_patents_in_table, _tt_face_check_patents): Remove.
+	(FT_Face_CheckTrueTypePatents, FT_Face_SetUnpatentedHinting):
+	Replace code with dummies.
+
+	* src/truetype/ttobjs.c (tt_face_init): Remove now defunct code.
+	* src/truetype/ttobjs.h (TT_GraphicsState): Remove `both_x_axis'
+	field.
+
+2016-01-28  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	Remove unpatented hinter (2/3).
+
+	* devel/ftoption.h (TT_CONFIG_OPTION_UNPATENTED_HINTING): Remove.
+
+2016-01-28  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	Remove unpatented hinter (1/3).
+
+	* src/truetype/ttinterp.c [TT_CONFIG_OPTION_UNPATENTED_HINTING]:
+	Remove all code related to this macro.
+
+2016-01-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Kannada script.
+
+	This essentially moves the Kannada script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Kannada.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Kannada standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Kannada data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Kannada data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2016-01-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Better access to 64-bit integers for C99 compilers.
+
+	* include/freetype/config/ftconfig.h [FT_LONG64]: Use
+	__STDC_VERSION__ to define 64-bit integers.
+	* builds/unix/ftconfig.in [FT_LONG64]: Ditto.
+	* builds/vms/ftconfig.h [FT_LONG64]: Ditto.
+
+2016-01-21  Werner Lemberg  <wl@gnu.org>
+
+	[gxvalid] Remove commented out code.
+
+	* src/gxvalid/gxvcommn.c (gxv_EntryTable_validate): Do it.
+
+2016-01-20  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Complete last autofit commit.
+
+	Problem reported by Kostya Serebryany <kcc@google.com>.
+
+	* src/autofit/afshaper.c (af_shaper_get_coverage)
+	[!FT_CONFIG_OPTION_USE_HARFBUZZ]: Update signature.
+
+2016-01-20  Werner Lemberg  <wl@gnu.org>
+
+	Still handle `__FTERRORS_H__'.
+
+	We need this for backward compatibility.
+
+	Problem reported by John Emmas <johne53@tiscali.co.uk>.
+
+	* include/freetype/fterrors.h: Fix inclusion guard so that
+	undefining either `FTERRORS_H_' or `__FTERRORS_H__' works as
+	expected.
+
+2016-01-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix handling of default script.
+
+	Patch taken from ttfautohint, commit
+	071ae2c00e0d67f9d19418f4fade1c23d27dc185.
+
+	There were two bugs.
+
+	  - We now use non-standard script tags like `khms' for special
+	    purposes.  However, HarfBuzz maps such tags to `DFLT', and
+	    without this commit the associated lookups were incorrectly
+	    assigned to the non-standard tags.
+
+	  - Let's assume we have a Bengali font, and the font's `DFLT'
+	    script tag handles the necessary lookups for Bengali, too.
+	    Without this commit, the `DFLT' lookups were assigned to
+	    ttfautohint's default script (usually `latn') before the
+	    standard lookups for Bengali were handled.
+
+	    We now have the following order while searching for covered
+	    glyph indices.
+
+	      special features of scripts (e.g. `sups' for Cyrillic)
+	      Unicode mappings of scripts
+	      remaining features of scripts (especially important for Indic
+	        scripts)
+	      default features of default script
+
+	* src/autofit/afshaper.c, src/autofit/afshaper.h
+	(af_shaper_get_coverage): Add boolean parameter to indicate default
+	script.
+	Update all callers.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	Fix search order for coverages.
+
+2016-01-19  Werner Lemberg  <wl@gnu.org>
+
+	Various minor clang fixes.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
+	src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize
+	`ch'.
+
+	* src/base/ftcalc.c (FT_MulFix) [FT_LONG64]: Add cast.
+
+	* src/base/ftdbgmem.c (ft_mem_table_destroy): Add cast.
+
+	* src/base/fthash.c (hash_num_lookup): Add cast.
+
+	* src/base/fttrigon.c (ft_trig_downscale) [FT_LONG64]: Fix cast.
+
+	* src/gxvalid/gxvcommn.c (gxv_EntryTable_validate): Comment out
+	redundant code.
+
+	* src/type1/t1driver.c (t1_get_ps_font_value) <PS_DICT_SUBR>: Add
+	cast.
+
+	* src/type1/t1load.c (parse_subrs): Fix type of `count'.
+
+2016-01-19  Derek B. Noonburg  <derekn@glyphandcog.com>
+
+	[truetype] Add another tricky font.
+
+	* src/truetype/ttobjs.c (TRICK_SFNT_IDS_NUM_FACES): Increase.
+	(sfnt_id): Add variant of `DFKaiShu'.
+
+2016-01-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Empower `FT_Library_SetLcdFilterWeights'.
+
+	* src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): Enable filter
+	in addition to setting weights.
+	(FT_Library_SetLcdFilter): Clean out FT_FORCE_LIGHT_LCD_FILTER and
+	FT_FORCE_LEGACY_LCD_FILTER.
+	* include/freetype/ftlcdfil.h: Documentation update.
+
+2016-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Don't use macro names that start with `_[A-Z]' [3/3].
+
+	Such macro names are reserved for both C and C++.
+
+	* src/cache/ftccache.h: s/_FTC_FACE_ID_HASH/FTC_FACE_ID_HASH/.
+	Update all callers.
+	(FTC_CACHE_LOOKUP_CMP): Replace `_XXX' with `XXX_'.
+	* src/cache/ftcmru.c (FTC_MRULIST_LOOKUP_CMP): Ditto.
+
+2016-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Don't use macro names that start with `_[A-Z]' [2/3].
+
+	Such macro names are reserved for both C and C++.
+
+	* include/freetype/ftimage.h, src/raster/ftraster.c,
+	src/smooth/ftgrays.c, src/smooth/ftgrays.h:
+	s/_STANDALONE_/STANDALONE_/.
+
+2016-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Don't use macro names that start with `_[A-Z]' [1/3].
+
+	Such macro names are reserved for both C and C++.
+
+	* src/bdf/bdflib.c: Replace macros of the form `_BDF_XXX' with
+	`BDF_XXX_'.
+
+2016-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Don't use macro names that contain `__' [2/2].
+
+	Such macro names are reserved for both C and C++.
+
+	* src/cache/*: s/__/_/.
+
+2016-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Don't use macro names that contain `__' [1/2].
+
+	Such macro names are reserved for both C and C++.
+
+	* */*: Replace macros of the form `__XXX_H__' with `XXX_H_'.
+
+2016-01-10  Jered Gray  <jegray@google.com>
+
+	[cff] Fix usage of `|' operator.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) [cf2_cmdEXTENDEDNMBR,
+	default]: `|' is not guaranteed to be processed from left to right
+	by the compiler.  However, the code repeatedly calls
+	`cf2_buf_readByte' to get the arguments to `|' ...  Fix this.
+
+2015-12-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make top-to-bottom hinting work in latin auto-hinter.
+
+	This improves rendering of scripts like Bengali or Devanagari.
+
+	* src/autofit/afhints.c (af_axis_hints_new_edge): Add parameter to
+	pass top-to-bottom hinting flag.  This makes the function sort edges
+	in descending vertical position.
+
+	* src/autofit/afhints.c: Updated.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_edges,
+	af_latin_hint_edges): Use `top_to_bottom_hinting' flag.
+
+	* src/autofit/afcjk.c (af_cjk_hints_compute_edges),
+	src/autofit/aflatin2.c (af_latin2_hints_compute_edges): Updated.
+
+2015-12-24  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add hinting direction to `AF_ScriptClassRec'.
+
+	Still unused.
+
+	* src/autofit/afglobal.c (SCRIPT): Handle hinting direction.
+
+	* src/autofit/aftypes.h (AF_ScriptClassRec): Add
+	`top_to_bottom_hinting' field.
+	(AF_HINTING_BOTTOM_TO_TOP, AF_HINTING_TOP_TO_BOTTOM): New macros.
+	(AF_DEFINE_SCRIPT_CLASS): Updated.
+
+2015-12-23  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Start implementing hinting direction (up/down, down/up).
+
+	Right now, it does nothing.
+
+	* src/autofit/afscript.h: Add another parameter to `SCRIPT',
+	specifying hinting direction.
+
+	* src/autofit/afglobal.c, src/autofit/afglobal.h,
+	src/autofit/afpic.c, src/autofit/afranges.h, src/autofit/afshaper.c,
+	src/autofit/aftypes.h: Extend `SCRIPT' definitions.
+
+2015-12-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1load.c (parse_subrs): Fix memory leak (#46744).
+
+2015-12-22  Werner Lemberg  <wl@gnu.org>
+
+	[base] Make hash interface symmetric.
+
+	Use `num' and `str' infixes everywhere.
+
+	* src/base/fthash.c (ft_hash_init): Renamed to...
+	(hash_init): ... This.
+	(ft_hash_str_init, ft_hash_num_init): New functions.
+	(ft_hash_free): Renamed to...
+	(ft_hash_str_free): ... This.
+
+	* include/freetype/internal/fthash.h: Updated.
+
+	* src/bdf/bdflib.c, src/type1/t1load.c, src/type1/t1objs.c: Updated.
+
+2015-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Avoid shift of negative numbers (#46732).
+
+	* src/type1/t1load.c (parse_subrs): Do it.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[type1, psaux] Handle large values of num_subrs correctly (#46692).
+
+	We now use a hash to map from subr indices to array elements holding
+	the subroutines, if necessary.
+
+	* include/freetype/internal/t1types.h: Include FT_INTERNAL_HASH_H.
+	(T1_FontRec): Add `subrs_hash' field.
+
+	* include/freetype/internal/psaux.h: Include FT_INTERNAL_HASH_H.
+	(T1_DecoderRec): Add `subrs_hash' field.
+
+	* src/type1/t1load.h (T1_LoaderRec): Add `subrs_hash' field.
+
+	* src/type1/t1driver.c: Include FT_INTERNAL_HASH_H.
+	(t1_ps_get_font_value) [PS_DICT_SUBR]: Look up hash if necessary.
+
+	* src/type1/t1load.c: Include FT_INTERNAL_HASH_H.
+	(parse_subrs): Use hash for subr indices that exceed the allocated
+	number of subr slots.
+	(t1_init_loader): Remove unnecessary code.
+	(t1_done_loader, T1_Open_Face): Updated.
+
+	* src/type1/t1gload.c (T1_Compute_Max_Advance, T1_Get_Advances,
+	T1_Load_Glyph): Updated.
+
+	* src/type1/t1objs.c (T1_Face_Done): Updated.
+
+	* src/psaux/t1decode.c: Include FT_INTERNAL_HASH_H.
+	(t1_decoder_parse_charstrings) [op_callsubr]: Look up hash if
+	necessary.
+
+	* src/cid/cidgload.c (cid_load_glyph): Updated.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base] Thinko: Remove free function pointer.
+
+	We don't copy keys or values while hashing.
+
+	* include/freetype/internal/fthash.h (FT_Hash_FreeFunc): Removed.
+	(FT_HashRec): Remove `free' field.
+
+	* src/base/fthash.c (hash_str_free): Removed.
+	(ft_hash_init, ft_hash_free): Updated.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base, bdf] Don't expose `FT_Hashnode' in hash functions.
+
+	* src/base/fthash.c (hash_lookup, ft_hash_str_lookup,
+	ft_hash_num_lookup): Return pointer to `size_t' instead of
+	`FT_Hashnode'.
+
+	* include/freetype/internal/fthash.h: Updated.
+
+	* src/bdf/bdflib.c (bdf_get_property, _bdf_add_property,
+	bdf_get_font_property): Updated.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base, bdf] Add number hashing.
+
+	* src/base/fthash.c (hash_num_lookup, hash_num_compare): New
+	functions.
+	(ft_hash_init): Add argument to select between number and string
+	hashing.
+	(ft_hash_num_insert, ft_hash_num_lookup): New functions.
+
+	* include/freetype/internal/fthash.h: Updated.
+
+	* src/bdf/bdflib.c (_bdf_parse_start): Updated.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base] Introduce hash lookup, compare, and free function pointers.
+
+	* include/freetype/internal/fthash.c (FT_Hash_LookupFunc,
+	FT_Hash_CompareFunc, FT_Hash_FreeFunc): New typedefs.
+	(FT_HashRec): Add `lookup', `compare', and `free' fields.
+
+	* src/base/fthash.c (hash_str_lookup, hash_str_compare,
+	hash_str_free): New functions.
+	(ft_hash_init): Set function pointers.
+	(hash_bucket, ft_hash_free): Use them.
+
+2015-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base, bdf] Use a union as a hash key.
+
+	We want to support both an integer and a string key later on.
+
+	* include/freetype/internal/fthash.h (FT_Hashkey): New union.
+	(FT_HashnodeRec): Updated.
+	(ft_hash_insert, ft_hash_lookup): Renamed to ...
+	(ft_hash_str_insert, ft_hash_str_lookup): ... this.
+
+	* src/base/fthash.c (hash_bucket): Updated.
+	(ft_hash_insert, ft_hash_lookup): Renamed to ...
+	(hash_insert, hash_lookup): ... this.
+	(ft_hash_str_insert, ft_hash_str_lookup): New wrapper functions.
+
+	* src/bdf/bdflib.c: Updated.
+
+2015-12-19  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Use new hash functions.
+
+	* src/bdf/bdf.h: Include FT_INTERNAL_HASH_H.
+	(hashnode, hashtable): Removed.
+	(bdf_font_t): Use `FT_HashRec' type for `proptbl'.
+
+	* src/bdf/bdflib.c: Remove all hash functions.
+	Update code for new hash structure and function names.
+
+2015-12-19  Werner Lemberg  <wl@gnu.org>
+
+	[bdf, base] Lift hash functions from bdf driver to base module.
+
+	* src/base/fthash.c, include/freetype/internal/fthash.h: New files,
+	containing (massaged) code from `bdflib.c' and `bdf.h'.
+
+	* include/freetype/internal/internal.h (FT_INTERNAL_HASH_H): New
+	macro.
+
+	* src/base/ftbase.c: Include `fthash.c'.
+
+	* src/base/Jamfile (_sources): Add `fthash'.
+
+	* src/base/rules.mk (BASE_SRC): Add `fthash.c'.
+
+	* docs/LICENSE.TXT: Updated.
+
+2015-12-15  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Bengali script.
+
+	This essentially moves the Bengali script from the `Indic' hinter to
+	the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Bengali.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Bengali standard characters and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Bengali data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Bengali data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2015-12-14  Ben Wagner  <bungeman@gmail.com>
+
+	[bdf] Remove dead code (#46625).
+
+	The BDF specification only allows decimal numbers, no octal or
+	hexadecimal decoding is needed.
+
+	* src/bdf/bdflib.c (_bdf_atoul, _bdf_atol, _bdf_atous,
+	_bdf_atos): Remove unused code and parameters.
+	Update all callers.
+	(odigits): Remove.
+
+2015-12-14  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix calls to `FT_Stream_Seek'.
+
+	* src/base/ftobjs.c (Mac_Read_sfnt_Resource, FT_Open_Face): Set
+	`error'.
+
+2015-12-14  Ben Wagner  <bungeman@gmail.com>
+
+	[base] Check error when seeking to data supplied offset (#46635).
+
+	* src/base/ftobjs.c (open_face_PS_from_sfnt_stream):
+	`ft_lookup_PS_in_sfnt_stream' returns offset and length from
+	user supplied data.  Use of this these values must be checked.
+
+2015-12-13  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Myanmar script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Myanmar.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Myanmar standard characters.
+
+	* src/autofit/afranges.c: Add Myanmar data.
+
+	* src/autofit/afstyles.h: Add Myanmar data.
+
+2015-12-12  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Minor.
+
+2015-12-12  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afscript.h: Avoid potential crash.
+
+2015-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Restore OpenType feature check.
+
+	This was removed while rewriting the HarfBuzz interface.
+
+	* src/autofit/afglobal.h (AF_FaceGlobalsRec): Add `hb_buf' field to
+	hold internal HarfBuzz buffer, needed for feature comparison.
+
+	* src/autofit/afglobal.c (af_face_globals_new,
+	af_face_globals_free): Initialize and destroy `hb_buf'.
+
+	* src/autofit/afshaper.c (af_shaper_get_cluster): Compare character
+	(cluster) with and without applied feature.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix tracing
+	message.
+
+2015-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Remove redundant code.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths): Do it.
+
+2015-12-09  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Thinko.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Don't count
+	empty blue zones (bug introduced 2015-12-06).
+
+2015-12-09  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce subscript top blue zones.
+
+	This feature is mainly for Khmer: The idea is to avoid a clash
+	between the top of subscript glyphs and the bottom of normal
+	baseline glyphs.
+
+	This only works for character clusters mapped to multiple glyphs.
+
+	* src/autofit/afblue.dat: Add subscript top blue zone for Khmer.
+
+	* src/autofit/afblue.hin (AF_BLUE_PROPERTY_LATIN_SUB_TOP): New
+	macro.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/aflatin.h (AF_LATIN_IS_SUB_TOP_BLUE,
+	AF_LATIN_BLUE_SUB_TOP): New macros.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Handle new
+	blue zone property.
+	Update tracing messages.
+	(af_latin_metrics_scale_dim): Handle new blue zone property.
+	(af_latin_hints_compute_blue_edges): Updated.
+
+2015-12-09  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix tracing message.
+
+	* src/autofit/aflatin.c (af_latin_metrics_scale_dim): Display
+	inactive blue zones also.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afblue.dat: Add more Khmer clusters.
+
+	Some fonts have incorrect ligatures; we need more samples to get a
+	good mean value.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Typos.
+
+	* src/autofit/afshaper.c (af_shaper_buf_create, af_shaper_get_elem)
+	[!FT_CONFIG_OPTION_USE_HARFBUZZ]: Make it compile.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Khmer script.
+
+	We split Khmer into two auto-hinter scripts: `Khmer' (`khmr') and
+	`Khmer symbols' (`khms', U+19E0-U+19FF).
+
+	* src/autofit/afblue.dat: Add blue zone data for Khmer.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Khmer standard characters.
+
+	* src/autofit/afranges.c: Add Khmer data.
+
+	* src/autofit/afstyles.h: Add Khmer data.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Rewrite HarfBuzz interface to support character clusters.
+
+	Scripts like Khmer have blue zones that can't be directly
+	represented by Unicode characters.  Instead, it is necessary to let
+	HarfBuzz convert character clusters into proper glyph representation
+	forms, then deriving the blue zone information from the resulting
+	glyphs.
+
+	* src/autofit/hbshim.c, src/autofit/hbshim.h: Replaced by...
+	* src/autofit/afshaper.c, src/autofit/afshaper.h: ... these two new
+	files, providing a new API to access HarfBuzz.
+
+	The new API manages a HarfBuzz buffer with `af_shaper_buf_create'
+	and `af_shaper_buf_destroy'.  The buffer receives a UTF8 encoded
+	string with function `af_shaper_get_cluster', and the resulting
+	glyph data (indices, advance widths, vertical offsets) can be
+	iteratively accessed with function `af_shaper_get_elem'.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths,
+	af_cjk_metrics_init_blues, af_cjk_metrics_check_digits): Updated.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_widths,
+	af_latin_metrics_init_blues, af_latin_metrics_check_digits):
+	Updated.
+
+	* include/freetype/internal/fttrace.h: s/afharfbuzz/afshaper/.
+
+	* src/autofit/afglobal.c: s/hbshim.h/afshaper.h/.
+	(af_face_globals_compute_style_coverage): Updated.
+
+	* src/autofit/afglobal.h: s/hbshim.h/afshaper.h/.
+
+	* src/autofit/autofit.c: s/hbshim.c/afshaper.c/.
+
+	* src/autofit/Jamfile, src/autofit/rules.mk (AUTOF_DRV_SRC):
+	Updated.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Prepare forthcoming changes.
+
+	This makes it easier to control the commits.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Add dummy
+	loop.  No functional change.
+
+2015-12-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Use string of standard characters.
+
+	This is more flexible; additionally, it would allow character
+	clusters.
+
+	* src/autofit/aftypes.h (SCRIPT, AF_DEFINE_SCRIPT_CLASS): Updated.
+	(AF_ScriptClassRec): Replace `standard_char[123]' with
+	`standard_charstring'.
+
+	* src/autofit/afscript.h: Replace last three character arguments
+	of the `SCRIPT' calls with a string parameter, holding the standard
+	characters (in UTF-8 encoding) separated with spaces.
+
+	* src/autofit/afglobal.c, src/autofit/afglobal.h,
+	src/autofit/afpic.c, src/autofit/afranges.c, src/autofit/hbshim.c
+	(SCRIPT): Updated.
+
+	* src/autofit/afcjk.c (af_cjk_metrics_init_widths),
+	src/autofit/aflatin.c (af_latin_metrics_init_widths): Updated.
+
+2015-12-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afblue.dat: Separate blue zone characters with spaces.
+
+	Another preparation for character cluster support.
+
+	* src/autofit/afblue.c, src/autofit.afblue.h: Regenerated.
+
+2015-12-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/afblue.pl (convert_ascii_chars): Don't ignore spaces.
+
+	Instead, reduce multiple spaces to a single one.  We need this later
+	for supporting character clusters in `afblue.dat'.
+
+2015-12-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afblue.hin (GET_UTF8_CHAR): Use `do...while(0)'.
+
+	* src/autofit/afblue.h: Regenerated.
+
+2015-12-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afwarp.c: s/INT_MIN/FT_INT_MIN/.
+
+2015-12-03  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/install.mk (install): Remove stale `ft2build.h'.
+
+2015-12-01  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Avoid dangling pointer (#46572).
+
+	* src/type1/t1afm.c (T1_Read_Metrics): Properly reset
+	`face->afm_data'.
+
+2015-11-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* include/freetype/ftlcdfil.h: Documentation tweak.
+
+2015-11-28  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6.2 released.
+	=========================
+
+
+	Tag sources with `VER-2-6-2'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.6.2.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6.1/2.6.2/, s/261/262/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 2.
+
+	* builds/unix/configure.raw (version_info): Set to 18:2:12.
+	* CMakeLists.txt (VERSION_PATCH): Set to 2.
+
+	* docs/CHANGES: Updated.
+
+2015-11-28  Werner Lemberg  <wl@gnu.org>
+
+	Fix C++ compilation.
+
+	* src/autofit/afloader.c: Include FT_INTERNAL_CALC_H.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Pacify compiler.
+
+2015-11-28  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	Change default LCD filter to be normalized and color-balanced.
+
+	* src/base/ftlcdfil.c (FT_Library_SetLcdFilter): Update
+	`default_filter'.
+
+2015-11-28  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Allow references to section names.
+
+	In the reference, we show the section's title enclosed in single
+	quotes.
+
+	* src/tools/docmaker/formatter.py (Formatter::__init__): Collect
+	section names as identifiers.
+
+	* src/tools/docmaker/tohtml.py (section_title_header): Split into...
+	(section_title_header1, section_title_header2): ... these two
+	strings.
+	(HtmlFormatter::make_block_url, make_html_word, html_source_quote):
+	Handle sections.
+	(HtmlFormatter::section_enter): Updated to add `id' HTML attribute.
+
+2015-11-27  Tamas Kenez  <tamas.kenez@adasworks.com>
+
+	[cmake] Add script to test the config module.
+
+	* builds/cmake/testbuild.sh: New file.
+
+2015-11-27  Tamas Kenez  <tamas.kenez@adasworks.com>
+
+	* CMakeLists.txt: Create `freetype-config.cmake' config module.
+
+2015-11-27  Tamas Kenez  <tamas.kenez@adasworks.com>
+
+	* CMakeLists.txt: Set CMAKE_DEBUG_POSTFIX to `d'.
+
+2015-11-27  Tamas Kenez  <tamas.kenez@adasworks.com>
+
+	[cmake] Add better control of library dependencies.
+
+	* CMakeLists.txt: Add `WITH_*' variables to force/auto/omit
+	ZLIB/BZip2/PNG/HarfBuzz.
+
+2015-11-27  Tamas Kenez  <tamas.kenez@adasworks.com>
+
+	[cmake] Make `FindHarfBuzz' observe the REQUIRED option.
+
+	* builds/cmake/FindHarfBuzz.cmake: Implement it.
+
+2015-11-27  Werner Lemberg  <wl@gnu.org>
+
+	[cmake] Collect files specific to cmake in `builds/cmake'.
+
+	* builds/FindHarfBuzz.cmake: Move to ...
+	* builds/cmake/FindHarfBuzz.cmake: ... this place.
+
+	* CMakeLists.txt (CMAKE_MODULE_PATH): Updated.
+
+2015-11-27  Alexander Bock  <alexander.j.bock@nasa.gov>
+
+	CMakeLists.txt: Honour new command line flag `FREETYPE_NO_DIST'.
+
+2015-11-26  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Allow `foo[bar]' as identifier.
+
+	We need this to handle equally named properties in different
+	modules.
+
+	* src/tools/docmaker/content.py (re_identifier),
+	src/tools/docmaker/sources.py (re_crossref): Allow `foo[bar]'.
+
+	* src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word,
+	HtmlFormatter::index_exit, HtmlFormatter::section_enter,
+	HtmlFormatter::block_enter): Handle `foo[bar]'.
+
+2015-11-25  Werner Lemberg  <wl@gnu.org>
+
+	* src/bdf/bdflib.c (bdf_load_font): Fix small memory leak (#46480).
+
+	(_bdf_parse_glyphs): Always reset `p->glyph_name' after moving its
+	contents.
+
+2015-11-21  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/internal/ftcalc.h: Don't use `register' keyword.
+
+	This fixes compiler warnings.
+
+	Reported by Behdad.
+
+2015-11-20  Werner Lemberg  <wl@gnu.org>
+
+	Add `FT_LCD_FILTER_LEGACY1' enum value.
+
+	This does the same as `FT_LCD_FILTER_LEGACY'.
+
+	See
+
+	  https://bugs.freedesktop.org/show_bug.cgi?id=92981
+
+	for the reasoning.
+
+	* include/freetype/ftlcdfil.h (FT_LcdFilter): New value
+	`FT_LCD_FILTER_LEGACY1'.
+
+	* src/base/ftlcdfil.c (FT_Library_SetLcdFilter): Use it.
+
+2015-11-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afhints.c (af_get_segment_index): Fix it.
+
+	The old code was too simple, returning invalid values in most cases
+	where a segment crosses the contour start.
+
+2015-11-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/bdf/bdflib.c (bdf_load_font): Fix small memory leak (#46439).
+
+2015-11-11  Werner Lemberg  <wl@gnu.org>
+
+	[cff, autofit] Switch off stem darkening by default.
+
+	* src/autofit/afmodule.c (af_autofitter_init), src/cff/cffobjs.c
+	(cff_driver_init): Do it.
+
+2015-11-10  Jan Alexander Steffens (heftig)  <jan.steffens@gmail.com>
+
+	Allow native CFF hinter in FT_RENDER_MODE_LIGHT.
+
+	Both the native CFF hinter and the auto-hinter now have a very
+	similar rendering style.
+
+	* include/freetype/freetype.h: Mention that FT_LOAD_TARGET_LIGHT no
+	longer implies FT_LOAD_FORCE_AUTOHINT.
+
+	* include/freetype/ftmodapi.h (FT_MODULE_DRIVER_HINTS_LIGHTLY): New
+	macro.
+
+	* include/freetype/internal/ftobjs.h (FT_DRIVER_HINTS_LIGHTLY): New
+	macro.
+
+	* src/cff/cffdrivr.c (cff_driver_class): Use it.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Update auto-hinter selection
+	logic.
+
+2015-11-09  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidload.c (cid_face_open): Fix GDBytes guard (#46408).
+
+2015-11-09  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Remove integer to pointer conversion compiler warning.
+
+	Problem reported by Alexei.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Use a solution found
+	in the glib library to fix the issue.
+
+2015-11-08  Behdad Esfahbod  <behdad@behdad.org>
+
+	[sfnt] Accept version 3 of `EBLC' and `CBLC' tables also.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit): Implement it.
+
+2015-11-08  Philipp Knechtges  <philipp-dev@knechtges.com>
+
+	[autofit] Don't distort (latin) glyphs too much (#46195).
+
+	* src/autofit/aflatin.h (AF_LatinBlueRec): Add `ascender' and
+	`descender' fields.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Collect
+	ascender and descender data for blue zones.
+	(af_latin_metrics_scale_dim): Reject vertical scaling values that
+	change the result by more than two pixels.
+
+2015-11-05  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Ignore embedded bitmaps with zero size (#46379).
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bit_aligned): Implement
+	it.
+
+2015-11-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Catch infinite recursion in subglyphs (#46372).
+
+	* include/freetype/internal/tttypes.h (TT_LoaderRec): New field
+	`composites'.
+
+	* src/truetype/ttgload.c: Include FT_LIST_H.
+	(load_truetype_glyph): Add composite subglyph index to a list;
+	abort if index is already in list.
+	(tt_loader_init): Updated.
+	(tt_loader_done): New function.
+	(TT_Load_Glyph): Call `tt_loader_done'.
+
+2015-11-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Better tracing of composite glyphs.
+
+	* src/truetype/ttgload.c (TT_Load_Composite_Glyph,
+	load_truetype_glyph): Implement it.
+
+2015-11-03  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Protect against zero-size bitmaps (#46345).
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bitmap): Check
+	`glyph_size'.
+
+2015-11-02  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	* src/autofit/afloader.c (af_loader_load_g): Implement emboldening.
+
+2015-11-02  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[autofit] Implement darkening computation function.
+
+	This is a crude adaption of the original `cf2_computeDarkening'
+	function.
+
+	* src/autofit/afloader.c (af_intToFixed, af_fixedToInt,
+	af_floatToFixed): New macros, taken from `cf2fixed.h'.
+	(af_loader_compute_darkening): New function.
+	* src/autofit/afloader.h: Updated.
+
+2015-11-02  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[autofit] Add functions to get standard widths for writing systems.
+
+	We need the computed standard horizontal and vertical widths for the
+	emboldening calculation.  This method provides a convenient way to
+	extract it from writing-system-specific metrics structures, which
+	all script definitions must implement.
+
+	* src/autofit/aftypes.h (AF_WritingSystem_GetStdWidthsFunc): New
+	function type.
+	(AF_WritingSystemClassRec): New member `style_metrics_getstdw'.
+	(AF_DEFINE_WRITING_SYSTEM_CLASS): Updated.
+
+	* src/autofit/afcjk.c (af_cjk_get_standard_width): New function.
+	(af_cjk_writing_system_class): Updated.
+	* src/autofit/afdummy.c	(af_dummy_writing_system_class): Updated.
+	* src/autofit/afindic.c (af_cjk_get_standard_width): New function.
+	(af_indic_writing_system_class): Updated.
+	* src/autofit/aflatin.c (af_latin_get_standard_width): New function.
+	(af_indic_writing_system_class): Updated.
+	* src/autofit/aflatin.c (af_latin_get_standard_width): New function.
+	(af_indic_writing_system_class): Updated.
+
+2015-11-02  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[autofit] Extend `AF_FaceGlobalsRec' to hold emboldening data.
+
+	* src/autofit/afglobal.h (AF_FaceGlobalsRec): Add fields.
+
+	* src/autofit/afglobal.c (af_face_globals_new): Initialize new
+	fields.
+	(af_face_globals_free): Reset new fields.
+
+2015-11-02  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[autofit] Add stem-darkening properties.
+
+	Actual code follows in a later commit.
+
+	* include/freetype/ftautoh.h: Document `no-stem-darkening' and
+	`darkening-parameters'.
+
+	* src/autofit/afmodule.h: New fields `no_stem_darkening' and
+	`darken_params'.
+
+	* src/autofit/afmodule.c (af_property_set, af_property_get):
+	Handle them.
+	(af_autofitter_init): Initialize them.
+
+2015-11-02  Ben Wagner  <bungeman@gmail.com>
+
+	[ftfuzzer] Add support for multiple files (patch #8779).
+
+	Currently, libFuzzer only supports mutation of a single file.  We
+	circumvent this problem by using an uncompressed tar archive as
+	multiple-file input for the fuzzer.
+
+	This patch enables tests of `FT_Attach_Stream' and AFM/PFM parsing;
+	a constructed tarball should contain a font file as the first
+	element, and files to be attached as further elements.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Include libarchive headers.
+	(archive_read_entry_data, parse_data): New functions.
+	(LLVMFuzzerTestOneInput): Updated.
+
+	* src/tools/ftfuzzer/ftmutator.cc: New file, providing a custom
+	mutator for libFuzzer that can mutate tarballs in a sensible way.
+
+2015-10-31  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix cmap 14 validation (#46346).
+
+	* src/sfnt/ttcmap.c (tt_cmap14_validate): Check limit before
+	accessing `numRanges' and `numMappings'.
+	Fix size check for non-default UVS table.
+
+2015-10-31  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Handle infinite recursion in bitmap strikes (#46344).
+
+	* src/sfnt/ttsbit.c (TT_SBitDecoder_LoadFunc,
+	tt_sbit_decoder_load_bitmap, tt_sbit_decoder_load_byte_aligned,
+	tt_sbit_decoder_load_bit_aligned, tt_sbit_decoder_load_png): Add
+	argument for recursion depth.
+	(tt_sbit_decoder_load_compound): Add argument for recursion depth.
+	Increase recursion counter for recursive call.
+	(tt_sbit_decoder_load_image): Add argument for recursion depth.
+	Check recurse depth.
+	(tt_face_load_sbit_image): Updated.
+
+2015-10-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_points): Minor.
+
+2015-10-29  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Remove code to set MSVC's /FD compiler switch.
+
+	Problem reported by David Capello <davidcapello@gmail.com>; see
+
+	  https://lists.nongnu.org/archive/html/freetype-devel/2015-10/msg00108.html
+
+	for details.
+
+2015-10-27  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Add some safety guards (#46302).
+
+	* src/pfr/pfrload.h (PFR_CHECK): Rename to...
+	(PFR_CHECK_SIZE): ... this.
+	(PFR_SIZE): [!PFR_CONFIG_NO_CHECKS]: Define to PFR_CHECK_SIZE.
+
+	* src/pfr/pfrload.c (pfr_log_font_count): Check `count'.
+	(pfr_extra_item_load_kerning_pairs): Remove tracing message.
+	(pfr_phy_font_load): Use PFR_CHECK_SIZE where appropriate.
+	Allocate `chars' after doing a size checks.
+
+	* src/pfr/pfrsbit.c (pfr_load_bitmap_bits): Move test for invalid
+	bitmap format to...
+	(pfr_slot_load_bitmap): ... this function.
+	Check bitmap size.
+
+2015-10-26  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix sanitizing logic for `loca' (#46223).
+
+	* src/truetype/ttpload.c (tt_face_load_loca): A thinko caused an
+	incorrect adjustment of the number of glyphs, most often using far
+	too large values.
+
+2015-10-25  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve tracing.
+
+	* src/autofit/afhints.c (af_print_idx, af_get_segment_index,
+	af_get_edge_index): New functions.
+
+	(af_glyph_hints_dump_points): Remove unnecessary `|', `[', and `]'.
+	Add segment and edge index for each point.
+	Slightly change printing order of some elements.
+	Don't print `-1' but `--' for missing elements.
+
+	(af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Remove
+	unnecessary `|', `[', and `]'.
+	Don't print `-1' but `--' for missing elements.
+
+2015-10-24  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Sanitize bitmap strike glyph height.
+
+	Problem reported by Nikolay Sivov <bunglehead@gmail.com>.
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics): Avoid zero value
+	for `metrics->height' by applying some heuristics.
+
+2015-10-22  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, type42] Fix clang compiler warnings.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Initialize `offset'.
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Use proper cast.
+
+2015-10-22  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Avoid overflow/module arithmetic.
+
+	This modifies the addition of subroutine number to subroutine bias
+	from unsigned to signed, but does not change any results.
+
+	* src/cff/cf2ft.c (cf2_initGlobalRegionBuffer,
+	cf2_initLocalRegionBuffer): Change variable names from (unsigned)
+	`idx' to (signed) `subrNum', since it is not an index until after
+	the bias is added.
+	* src/cff/cf2ft.h: Updated.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdCALLSUBR>:
+	Updated similarly.
+
+2015-10-22  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Better check of `SubrCount' dictionary entry (#46272).
+
+	* src/cid/cidload.c (cid_face_open): Add more sanity tests for
+	`fd_bytes', `gd_bytes', `sd_bytes', and `num_subrs'.
+
+2015-10-21  Werner Lemberg  <wl@gnu.org>
+
+	[base] Pacify compiler (#46266).
+
+	* src/base/ftoutln.c (FT_Outline_EmboldenXY): Initialize `in' and
+	`anchor'.
+
+2015-10-21  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Fix heap buffer overflow (#46269).
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Fix off-by-one error in
+	bounds checking.
+
+2015-10-21  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Fix limit in assert for max hints.
+
+	* src/cff/cf2interp.c (cf2_hintmask_setAll): Allow mask equal to the
+	limit (96 bits).
+
+2015-10-21  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Remove an assert (#46107).
+
+	* src/cff/cf2hints.c (cf2_hintmap_insertHint): Ignore paired edges
+	in wrong order.
+
+2015-10-21  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Avoid unnecessarily large allocation for WOFFs (#46257).
+
+	* src/sfnt/sfobjs.c (woff_open_font): Use WOFF's `totalSfntSize'
+	only after thorough checks.
+	Add tracing messages.
+
+2015-10-21  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Better check invalid `sfnts' array data (#46255).
+
+	* src/type42/t42parse.c (t42_parse_sfnts): Table lengths must be
+	checked individually against available data size.
+
+2015-10-20  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Add a bunch of safety checks.
+
+	* src/cid/cidload.c (parse_fd_array): Check `num_dicts' against
+	stream size.
+	(cid_read_subrs): Check largest offset against stream size.
+	(cid_parse_dict): Move safety check to ...
+	(cid_face_open): ... this function.
+	Also test length of binary data and values of `SDBytes',
+	`SubrMapOffset', `SubrCount', `CIDMapOffset', and `CIDCount'.
+
+2015-10-20  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Avoid segfault with malformed input (#46250).
+
+	* src/cid/cidload.c (cid_read_subrs): Return a proper error code for
+	unsorted offsets.
+
+2015-10-20  StudioEtrange  <nomorgan@gmail.com>
+
+	* CMakeLists.txt: Enable shared library builds on MinGW (#46233).
+
+2015-10-20  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1afm.c (T1_Read_Metrics): Fix memory leak (#46229).
+
+2015-10-19  Ben Wagner  <bungeman@gmail.com>
+
+	[cid] Better handle invalid glyph stream offsets (#46221).
+
+	* src/cid/cidgload.c (cid_load_glyph): Check minimum size of glyph
+	length.
+
+2015-10-18  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Fix tracing of negative numbers.
+
+	Due to incorrect casting negative numbers were shown as very large
+	(positive) integers on 64bit systems.
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstrings) <op_none>:
+	Use division instead of shift.
+
+2015-10-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES (#46223).
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h: Surround it
+	with #ifndef ... #endif, as suggested in the tracker issue.
+
+2015-10-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Better protection against malformed `fpgm' (#46223).
+
+	* src/truetype/ttobjs.c (tt_size_init_bytecode): Don't execute a
+	malformed `fpgm' table more than once.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidgload.c (cid_load_glyph): Fix memory leak.
+
+	Reported by Kostya Serebryany <kcc@google.com>.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Prevent memory leak (#46217).
+
+	* src/bdf/bdflib.c (_bdf_parse_glyphs) <STARTCHAR>: Check
+	_BDF_GLYPH_BITS.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Use stream size to adjust number of glyphs.
+
+	* src/bdf/bdflib.c (ACMSG17): New message macro.
+	(_bdf_parse_t): Add member `size'.
+	(bdf_load_font): Set `size'.
+	(_bdf_parse_glyphs): Adjust `cnt' if necessary.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidload.c (cid_parse_dict): Check `[FG]DBytes' size.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidgload.c (cid_glyph_load): Check file offsets (#46222).
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Fix heap buffer overflow (#46221).
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstring) <operator 12>:
+	Fix limit check.
+
+2015-10-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidload.c (cid_parse_dict): Handle invalid input (#46220).
+
+2015-10-15  Kostya Serebryany  <kcc@google.com>
+
+	[ftfuzzer] Add README.
+
+	* src/tools/ftfuzzer/README: New file.
+
+2015-10-15  Ben Wagner  <bungeman@gmail.com>
+
+	[bdf] Fix memory leak (#46213).
+
+	* src/bdf/bdflib.c (bdf_load_font): Always go to label `Fail' in
+	case of error.
+
+2015-10-15  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES (#46208).
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h
+	(TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES): New configuration macro.
+
+	* src/truetype/ttinterp.c (MAX_RUNNABLE_OPCODES): Removed.
+	(TT_RunIns): Updated.
+
+2015-10-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Fix bytecode stack tracing.
+
+	The used indices were off by 1.
+
+2015-10-15  Ben Wagner  <bungeman@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Handle fixed sizes (#46211).
+
+2015-10-15  Werner Lemberg  <wl@gnu.org>
+
+	[base] Compute MD5 checksums only if explicitly requested.
+
+	This improves profiling accuracy.
+
+	* src/base/ftobjs.c (FT_Render_Glyph_Internal): Implement it.
+
+2015-10-14  Werner Lemberg  <wl@gnu.org>
+
+	[base] Use `FT_' namespace for MD5 functions (#42366).
+
+	* src/base/ftobjs.c (MD5_*): Define as `FT_MD5_*'.
+	Undefine HAVE_OPENSSL.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Correctly handle missing MM axis names (#46202).
+
+	* src/type1/t1load.c (T1_Get_MM_Var): Implement it.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Quickly exit if font index < 0.
+
+	Similar to other font formats, this commit makes the parser no
+	longer check the whole PCF file but only the header and the TOC if
+	we just want to get the number of available faces (and a proper
+	recognition of the font format).
+
+	* src/pcf/pcfdrivr.c (PCF_Face_Init): Updated.
+	Exit quickly if face_index < 0.
+
+	* src/pcfread.c (pcf_load_font): Add `face_index' argument.
+	Exit quickly if face_index < 0.
+
+	* src/pcf/pcf.h: Updated.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Handle TTCs and MM/GX variations.
+
+	This patch also contains various other improvements.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Add preprocessor guard to reject
+	pre-C++11 compilers.
+	(FT_Global): New class.  Use it to provide a global constructor and
+	destructor for the `FT_Library' object.
+	(setIntermediateAxis): New function to select an (arbitrary)
+	instance.
+	(LLVMFuzzerTestOneInput): Loop over all faces and named instances.
+	Also call `FT_Set_Char_Size'.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Refine some GX sanity tests.
+
+	Use the `gvar' table size instead of the remaining bytes in the
+	stream.
+
+	* src/truetype/ttgxvar.h (GX_BlendRec): New field `gvar_size'.
+
+	* src/truetype/ttgxvar.c (ft_var_load_gvar): Set `gvar_size'.
+	(ft_var_readpackedpoints, ft_var_readpackeddeltas: New argument
+	`size'.
+	(tt_face_vary_cvt, TT_Vary_Apply_Glyph_Deltas): Updated.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Another GX sanity test.
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Check
+	`tupleCount'.
+	Add tracing message.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix memory leak for broken GX fonts (#46188).
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix scope of
+	deallocation.
+
+2015-10-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix commit from 2015-10-10.
+
+	* src/truetype/ttgxvar.c (ft_var_load_gvar): Add missing error
+	handling body to condition.
+
+2015-10-12  Werner Lemberg  <wl@gnu.org>
+
+	[unix] Make MKDIR_P actually work.
+
+	* builds/unix/configure.raw: Fix underquoting of `INSTALL' and
+	`MKDIR_P'.
+
+	Problem reported by Dan Liddell <lddll@yahoo.com>.
+
+2015-10-11  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve extraction of number of named instances.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face)
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Check number of instances against
+	`fvar' table size.
+
+2015-10-10  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix overflow
+	(#46149).
+
+2015-10-10  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix infinite loops with broken cmaps (#46167).
+
+	* src/sfnt/ttcmap.c (tt_cmap8_char_next, tt_cmap12_next): Take care
+	of border conditions (i.e., if the loops exit naturally).
+
+2015-10-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More sanity tests for GX handling.
+
+	These tests should mainly help avoid unnecessarily large memory
+	allocations in case of malformed fonts.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints,
+	ft_var_readpackeddeltas): Check number of points against stream
+	size.
+	(ft_var_load_avar): Check `pairCount' against table length.
+	(ft_var_load_gvar): Check `globalCoordCount' and `glyphCount'
+	against table length.
+	(tt_face_vary_cvt): Check `tupleCount' and `offsetToData'.
+	Fix trace.
+	(TT_Vary_Apply_Glyph_Deltas): Fix trace.
+	Free `sharedpoints' to avoid memory leak.
+
+2015-10-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Better protection against malformed GX data (#46166).
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Correctly
+	handle empty `localpoints' array.
+
+2015-10-10  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Check stream size (#46162).
+
+2015-10-09  Werner Lemberg  <wl@gnu.org>
+
+	* src/gzip/ftgzip.c (FT_Stream_OpenGzip): Use real stream size.
+
+2015-10-08  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Protect against invalid number of TOC entries (#46159).
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Check number of TOC entries
+	against size of data stream.
+
+2015-10-08  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Protect against invalid number of glyphs (#46159).
+
+	* src/type42/t42parse.c (t42_parse_charstrings): Check number of
+	`CharStrings' dictionary entries against size of data stream.
+
+2015-10-08  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix some signed overflows (#46149).
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
+	<TT_SBIT_TABLE_TYPE_SBIX>: Use `FT_MulDiv'.
+
+2015-10-08  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Protect against invalid number of subroutines (#46150).
+
+	* src/type1/t1load.c (parse_subrs): Check number of
+	`Subrs' dictionary entries against size of data stream.
+
+2015-10-07  Kostya Serebryany  <kcc@google.com>
+
+	[ftfuzzer] Add support for LLVM's LibFuzzer.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc, src/tools/runinput.cc: New files.
+
+2015-10-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Faster alternative line renderer.
+
+	This implementation renders the entire line segment at once without
+	subdividing it into scanlines.  The main speed improvement comes from
+	reducing the number of divisions to just two per line segment, which
+	is a bare minimum to calculate cell coverage in a smooth rasterizer.
+	Notably, the progression from cell to cell does not itself require any
+	divisions at all.  The speed improvement is more noticeable at larger
+	sizes.
+
+	* src/smooth/ftgrays.c (gray_render_line): New implementation.
+
+2015-10-06  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Return correct PS names from pure CFF (#46130).
+
+	* src/cff/cffdrivr.c (cff_get_ps_name): Use SFNT service only for
+	SFNT.
+
+2015-10-04  Werner Lemberg  <wl@gnu.org>
+
+	[base] Replace left shifts with multiplication (#46118).
+
+	* src/base/ftglyph.c (ft_bitmap_glyph_bbox, FT_Get_Glyph): Do it.
+
+2015-10-04  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6.1 released.
+	=========================
+
+
+	Tag sources with `VER-2-6-1'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.6.1.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6/2.6.1/, s/26/261/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+	* builds/unix/configure.raw (version_info): Set to 18:1:12.
+	* CMakeLists.txt (VERSION_PATCH): Set to 1.
+
+	* src/autofit/afmodule.c [AF_DEBUG_AUTOFIT]: Ensure C linking for
+	dumping functions.
+
+2015-10-04  Werner Lemberg  <wl@gnu.org>
+
+	[bzip2, gzip] Avoid access of uninitialized memory (#46109).
+
+	* src/bzip2/ftbzip2.c (ft_bzip2_file_fill_input), src/gzip/ftgzip.c
+	(ft_gzip_file_fill_input): In case of an error, adjust the limit to
+	avoid copying uninitialized memory.
+
+2015-10-03  Werner Lemberg  <wl@gnu.org>
+
+	[bzip2, gzip] Avoid access of uninitialized memory (#46109).
+
+	* src/bzip2/ftbzip2.c (ft_bzip2_file_fill_output), src/gzip/ftgzip.c
+	(ft_gzip_file_fill_output): In case of an error, adjust the limit to
+	avoid copying uninitialized memory.
+
+2015-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Clean up worker.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove never used fields.
+
+2015-10-01  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Make `tt_cmap4_char_map_linear' more robust (#46078).
+
+	* src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Take care of
+	border conditions (i.e., if the loop exits naturally).
+
+2015-10-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afranges.c (af_deva_nonbase_uniranges): Fix ranges.
+	They should be a subset of `af_deva_uniranges'.
+
+2015-10-01  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Make `tt_cmap4_char_map_linear' faster (#46078).
+
+	* src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Use inner loop to
+	reject too large glyph indices.
+
+2015-09-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Clean up worker.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove lightly used `last_ey'.
+	(gray_start_cell, gray_render_line): Update.
+
+2015-09-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Replace `no-base' with `non-base'.
+
+	* src/autofit/*: Do it.
+
+2015-09-30  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Rewrite `tt_cmap4_char_map_linear' (#46078).
+
+	* src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Add code to better
+	skip invalid segments.
+	If searching the next character, provide a more efficient logic to
+	speed up the code.
+
+2015-09-30  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Adjust number of glyphs for malformed `loca' tables.
+
+	* src/truetype/ttpload.c (tt_face_load_loca): Implement it.
+
+2015-09-29  Werner Lemberg  <wl@gnu.org>
+
+	[pshinter] Avoid harmless overflow (#45984).
+
+	* src/pshinter/pshglob.c (psh_blues_set_zones): Fix it.
+
+2015-09-28  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Lao script.
+
+	Thanks to Danh Hong <danhhong@gmail.com> for guidance with blue zone
+	characters!
+
+	* src/autofit/afblue.dat: Add blue zone data for Lao.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Lao standard characters.
+
+	* src/autofit/afranges.c: Add Lao data.
+
+	* src/autofit/afstyles.h: Add Lao data.
+
+2015-09-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[base] Fix a leak by broken sfnt-PS or resource fork (#46028).
+
+	open_face_from_buffer() frees passed buffer if valid font
+	is not found.  But if copying to the buffer is failed,
+	the allocated buffer should be freed within the caller.
+
+	* src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Free
+	the buffer `sfnt_ps' if an error caused before calling
+	open_face_from_buffer().
+	(Mac_Read_sfnt_Resource): Free the buffer `sfnt_data' if
+	an error caused before calling open_face_from_buffer();
+
+2015-09-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[mac] Fix buffer size calculation for LWFN font.
+
+	* src/base/ftmac.c (read_lwfn): Cast post_size to FT_ULong
+	to prevent confused copy by too large chunk size.
+
+2015-09-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (PIXEL_MASK): Remove unused macro.
+
+2015-09-26  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Minor tracing improvement.
+
+	* src/autofit/aflatin.c (af_latin_metrics_scale_dim): Don't emit
+	blue zones header line if there are no blue zones.
+
+2015-09-26  Werner Lemberg  <wl@gnu.org>
+
+	[bzip2, gzip, lzw] Harmonize function signatures with prototype.
+
+	Suggested by Hin-Tak Leung.
+
+	* src/bzip2/ftbzip2.c (ft_bzip2_stream_io), src/gzip/ftgzip.c
+	(ft_gzip_stream_io), src/lzw/ftlzw.c (ft_lzw_stream_io): Do it.
+
+2015-09-26  Hin-Tak Leung  <htl10@users.sourceforge.net>
+
+	Add new FT_LOAD_COMPUTE_METRICS load flag.
+
+	* include/freetype/freetype.h (FT_LOAD_COMPUTE_METRICS): New macro.
+	* src/truetype/ttgload.c (compute_glyph_metrics): Usage.
+
+2015-09-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add cast.
+
+2015-09-25  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Protect against invalid number of glyphs (#46029).
+
+	* src/type1/t1load.c (parse_charstrings): Check number of
+	`CharStrings' dictionary entries against size of data stream.
+
+2015-09-23  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Better checks for invalid cmaps (2/2) (#46019).
+
+	While the current code in `FT_Get_Next_Char' correctly rejects
+	out-of-bounds glyph indices, it can be extremely slow for malformed
+	cmaps that use 32bit values.  This commit tries to improve that.
+
+	* src/sfnt/ttcmap.c (tt_cmap8_char_next, tt_cmap12_next,
+	tt_cmap12_char_map_binary, tt_cmap13_next,
+	tt_cmap13_char_map_binary): Reject glyph indices larger than or
+	equal to the number of glyphs.
+
+2015-09-23  Werner Lemberg  <wl@gnu.org>
+
+	[base, sfnt] Better checks for invalid cmaps (1/2).
+
+	* src/base/ftobjs.c (FT_Get_Char_Index): Don't return out-of-bounds
+	glyph indices.
+	(FT_Get_First_Char): Updated.
+
+	* src/sfnt/ttcmap.c (tt_cmap6_char_next): Don't return character
+	codes greater than 0xFFFF.
+
+	(tt_cmap8_char_index): Avoid integer overflow in computation of
+	glyph index.
+	(tt_cmap8_char_next): Avoid integer overflows in computation of
+	both next character code and glyph index.
+
+	(tt_cmap10_char_index): Fix unsigned integer logic.
+	(tt_cmap10_char_next): Avoid integer overflow in computation of
+	next character code.
+
+	(tt_cmap12_next): Avoid integer overflows in computation of both
+	next character code and glyph index.
+	(tt_cmap12_char_map_binary): Ditto.
+	(tt_cmap12_char_next): Simplify.
+
+	(tt_cmap13_char_map_binary): Avoid integer overflow in computation
+	of next character code.
+	(tt_cmap13_char_next): Simplify.
+
+2015-09-21  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[base] Check too long POST and sfnt resource (#45919).
+
+	* src/base/ftbase.h (FT_MAC_RFORK_MAX_LEN): Maximum length of the
+	resource fork for Mac OS.  Resource forks larger than 16 MB can be
+	written but can't be handled correctly, at least in Carbon routine.
+	See https://support.microsoft.com/en-us/kb/130437.
+
+	* src/base/ftobjs.c (Mac_Read_POST_Resource): No need to use `0x'
+	prefix for `%p' formatter.
+
+	* src/base/ftbase.c (Mac_Read_POST_Resource): Check the fragment and
+	total size of the concatenated POST resource before buffer
+	allocation.
+	(Mac_Read_sfnt_Resource): Check the declared size of sfnt resource
+	before buffer allocation.
+
+	* src/base/ftmac.c (read_lwfn, FT_New_Face_From_SFNT): Check the
+	total resource size before buffer allocation.
+
+2015-09-19  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve handling of invalid SFNT table entries (#45987).
+
+	This patch fixes weaknesses in function `tt_face_load_font_dir'.
+
+	- It incorrectly assumed that valid tables are always at the
+	  beginning.  As a consequence, some valid tables after invalid
+	  entries (which are ignored) were never seen.
+
+	- Duplicate table entries (this is, having the same tag) were not
+	  rejected.
+
+	- The number of valid tables was sometimes too large, leading to
+	  access of invalid tables.
+
+	* src/sfnt/ttload.c (check_table_dir): Add argument to return number
+	of valid tables.
+	Add another tracing message.
+	(tt_face_load_font_dir): Only allocate table array for valid
+	entries as returned by `check_table_dir'.
+	Reject duplicate tables and adjust number of valid tables
+	accordingly.
+
+2015-09-19  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Improve `FT_ABS' fix from 2015-09-17 (#45999).
+
+	* src/pcf/pcfread.c (pcf_load_font): Do first the cast to FT_Short,
+	then take the absolute value.
+	Also apply FT_ABS to `height'.
+
+2015-09-17  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Fix memory leak (#45989).
+
+	* src/type42/t42parse.c (t42_parse_charstrings): Allow only a single
+	`CharStrings' array.
+
+2015-09-17  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Fix memory leak (#45986).
+
+	* src/psaux/psobjs.c (ps_parser_load_field) <T1_FIELD_TYPE_MM_BBOX>:
+	Free `temp' in case of error.
+
+2015-09-17  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Improve tracing message.
+
+	* src/psaux/psobjs.c (ps_parser_load_field) <T1_FIELD_TYPE_MM_BBOX>:
+	Handle plural correctly.
+
+2015-09-17  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Fix integer overflows (#45985).
+
+	* src/pcf/pcfread.c (pcf_load_font): Use FT_MulDiv.
+
+2015-09-17  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Use FT_ABS for some property values (#45893).
+
+	* src/pcf/pcfread.c (pcf_load_font): Take absolute values for
+	AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE, RESOLUTION_X, and
+	RESOLUTION_Y.  In tracing mode, add warnings.
+
+2015-09-16  Werner Lemberg  <wl@gnu.org>
+
+	Minor fixes for some clang warnings.
+
+	* src/base/ftoutln.c (FT_Outline_EmboldenXY): Cast, possible missing
+	initialization.
+
+	* src/truetype/ttgload.c (TT_Process_Composite_Component): Cast.
+
+2015-09-15  Werner Lemberg  <wl@gnu.org>
+
+	[type1, type42] Fix memory leaks (#45966).
+
+	* src/type1/t1load.c (parse_blend_axis_types): Handle multiple axis
+	names.
+	(parse_blend_design_map): Allow only a single design map.
+	(parse_encoding): Handle multiple encoding vectors.
+
+	* src/type42/t42parse.c (t42_parse_encoding): Handle multiple
+	encoding vectors.
+
+2015-09-15  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix integer type (#45965).
+
+	* src/truetype/ttobjs.c (tt_synth_sfnt_checksum): Implement it.
+
+2015-09-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfread.c (pcf_load_font): Fix integer overflow (#45964).
+
+2015-09-15  Werner Lemberg  <wl@gnu.org>
+
+	[type1, type42] Check encoding array size (#45961).
+
+	* src/type1/t1load.c (parse_encoding), src/type42/t42parse.c
+	(t42_parse_encoding): Do it.
+
+2015-09-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c (FT_MulFix) [FT_LONG64]: Improve.
+
+2015-09-14  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Fix another potential buffer overflow (#45955).
+
+	* src/type1/t1parse (T1_Get_Private_Dict): Assure that check for
+	`eexec' doesn't exceed `limit'.
+
+2015-09-13  Werner Lemberg  <wl@gnu.org>
+
+	Replace `mkinstalldirs' with AC_PROG_MKDIR_P.
+
+	* builds/unix/mkinstalldirs: Removed, no longer needed.
+
+	* builds/unix/configure.raw: Call `AC_PROG_MKDIR_P'.
+	Update pwd call for `$INSTALL'.
+
+	* builds/unix/unix-def.in (MKINSTALLDIRS): Use `@MKDIR_P@'.
+
+	* autogen.sh: Updated.
+
+2015-09-13  Werner Lemberg  <wl@gnu.org>
+
+	[winfonts] Check alignment shift count for resource data (#45938).
+
+	* src/winfonts/winfnt.c (fnt_face_get_dll_font): Implement it.
+
+2015-09-13  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Fix potential buffer overflow (#45923).
+
+	* src/type1/t1parse.c (T1_Get_Private_Dict): Assure `cur' doesn't
+	point to end of file buffer.
+
+2015-09-13  Werner Lemberg  <wl@gnu.org>
+
+	[gzip] Fix access of small compressed files (#45937).
+
+	* src/gzip/ftgzip.c (ft_gzip_stream_close): Avoid memory leak.
+
+	(ft_gzip_get_uncompressed_file): Correct byte order while reading
+	unsigned long value.  Without this change, the whole optimization of
+	accessing small files in `FT_Stream_OpenGzip' is never executed!  As
+	a consequence, access to PCF files in general (which are normally
+	small files) should be much improved now as originally intended.
+
+2015-09-11  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Fix potential buffer overflow (#45922).
+
+	* src/psaux/psobjs.c (ps_parser_skip_PS_token): If a token is
+	enclosed in balanced expressions, ensure that the cursor position
+	doesn't get larger than the current limit.
+
+2015-09-11  Werner Lemberg  <wl@gnu.org>
+
+	[base] Avoid crash while tracing `load_mac_face'.
+
+	Reported in Savannah bug #45919.
+
+	* src/base/ftobjs.c (load_mac_face): Honour FT_OPEN_MEMORY while
+	tracing.
+
+2015-09-11  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Fix endless loop (#45920).
+
+	* src/type42/t42parse.c (t42_parse_encoding): Synchronize with
+	type1's `parse_encoding'.
+
+2015-09-10  Werner Lemberg  <wl@gnu.org>
+
+	[docmaker] Allow `-' in bold and italic markup.
+
+	* src/tools/docmaker/sources.py (re_italic, re_bold): Adjust
+	accordingly.
+
+2015-09-09  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c (FT_RoundFix): Improve.
+
+2015-09-09  Wojciech Mamrak  <wmamrak@gmail.com>
+
+	* src/base/ftcalc.c (FT_CeilFix, FT_FloorFix): Normalize.
+
+	This commit makes the functions behave as expected, this is,
+	rounding towards plus or minus infinity.
+
+2015-09-07  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_render_line): Simplify clipping.
+
+2015-09-04  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[raster,smooth] Microoptimizations.
+
+	* src/raster/ftraster.c (Insert_Y_Turn, Finalize_Profile_Table,
+	Bezier_Up): Use do-while loops.
+
+	* src/smooth/ftgrays.c (gray_render_scanline, gray_render_line,
+	gray_convert_glyph): Ditto.
+
+2015-09-04  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Redesign code ranges (2/2).
+
+	This commit adds two fallback scripts (`latb', `latp') and
+	implements support for the no-base character ranges introduced in
+	the previous commit.
+
+	* src/autofit/aftypes.h (AF_ScriptClassRec): Add
+	`script_uni_nobase_ranges' field.
+	(AF_DEFINE_SCRIPT_CLASS): Updated.
+
+	* src/autofit/afscript.h, src/autofit/afstyles.h: Add `latb' and
+	`latp' fallback scripts.
+
+	* src/autofit/afblue.dat: Add blue zones for Latin subscript and
+	superscript fallback scripts.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afglobal.h (AF_NOBASE): New style flag for no-base
+	characters.
+	(AF_STYLE_MASK): Updated.
+
+	* src/autofit/afglobal.c (SCRIPT): Updated.
+	(af_face_globals_compute_style_coverage): Handle new style flag.
+
+	* src/autofit/aflatin.c (af_latin_hints_apply): Handle new style
+	flag.
+
+	* src/autofit/afranges.h (SCRIPT): Use it to export no-base ranges.
+
+2015-09-04  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Redesign code ranges (1/2).
+
+	This patch introduces auxiliary code ranges that identify no-base
+	characters; they refer to glyphs of a script that should be hinted
+	without alignments to blue zones (mostly diacritics).
+
+	It also splits off ranges for fallback scripts that handle subscript
+	and superscript characters not covered by OpenType features.  For
+	example, this greatly helps improve the hinting of various phonetic
+	alphabets, which contain a large amount characters that look like
+	superscript glyphs.
+
+	Finally, code ranges are updated to Unicode 8.0, and enclosed
+	characters are removed in general since they normally look better if
+	they stay unhinted.
+
+	* src/autofit/afranges.c (af_latn_uniranges): Updated to Unicode
+	8.0.
+	Split off superscript-like and subscript-like glyphs into...
+
+	(af_latb_uniranges, af_latp_uniranges): ... these two new arrays.
+
+	(af_xxxx_nobase_uniranges): New arrays that hold no-base characters
+	of the corresponding character ranges.
+
+2015-09-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Pass glyph index to hinting function.
+
+	No functionality change yet.
+
+	* src/autofit/aftypes.h (AF_WritingSystem_ApplyHintsFunc): Pass
+	glyph index.
+
+	* src/autofit/afcjk.c, src/autofit/afcjk.h (af_cjk_hints_apply),
+	src/autofit/afdummy.c (af_dummy_hints_apply), src/autofit/afindic.c
+	(af_indic_hints_apply), src/autofit/aflatin.c
+	(af_latin_hints_apply), src/autofit/aflatin2.c
+	(af_latin2_hints_apply), src/autofit/afloader.c (af_loader_load_g):
+	Updated.
+
+2015-08-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Code clean-up.
+
+	* src/autofit/afglobal.h (AF_STYLE_MASK): New macro.
+	(AF_STYLE_UNASSIGNED): Use AF_STYLE_MASK for definition.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage):
+	Updated.
+
+2015-08-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make glyph style array use 16bit values.
+
+	* include/freetype/ftautoh.h (FT_Prop_GlyphToScriptMap): Use
+	`FT_UShort' for `map' field.
+
+	* src/autofit/afglobal.c (af_face_globals_compute_style_coverage,
+	af_face_globals_new), src/autofit/hbshim.c, src/autofit/hbshim.h
+	(af_get_coverage): Use FT_UShort for `glyph_styles' array.
+
+	* src/autofit/afglobal.h (AF_STYLE_UNASSIGNED, AF_DIGIT): Extend to
+	16 bits.
+	(AF_FaceGlobalsRec): Use `FT_UShort' for `glyph_styles' field.
+
+2015-08-26  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/configure.raw: Need harfbuzz >= 0.9.21 (#45828).
+
+2015-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[base] Improve kerning tracing and documentation.
+
+	* src/base/ftobjs.c (FT_Get_Kerning): Emit tracing message if
+	scaled-down kerning values differ.
+
+2015-08-18  Werner Lemberg  <wl@gnu.org>
+
+	[raster] Remove last remnants of `raster5' driver.
+
+	* src/raster/ftrend1.h (ft_raster5_renderer_class): Removed.
+
+	* src/raster/rastpic.c, src/raster/rastpic.h
+	(ft_raster5_renderer_class_pic_init,
+	ft_raster5_renderer_class_pic_free): Removed.
+
+2015-08-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Improve emboldener (#45596).
+
+	* src/base/ftoutln.c (FT_Outline_EmboldenXY): Correct displacement
+	of zero-length segments.
+
+2015-08-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Reoptimize arithmetic.
+
+	* src/base/ftcalc.c (FT_MulDiv, FT_MulFix) [!FT_LONG64]: Remove
+	special cases that slow down the general use.
+
+2015-08-15  pazer  <ibemad@gmail.com>
+
+	Fix C++ compilation (#45762).
+
+	* src/base/ftstroke.c (ft_outline_glyph_class): Use
+	FT_CALLBACK_TABLE.
+
+2015-08-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Clean up.
+
+	* src/truetype/ttgload.c (TT_Process_Composite_Component): Use
+	`FT_Outline_Transform' and `FT_Outline_Translate'.
+	(translate_array): Dropped.
+
+2015-08-14  Andreas Enge  <andreas.enge@inria.fr>
+
+	* builds/unix/detect.mk (CONFIG_SHELL): Don't handle it (#44261).
+
+2015-08-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Introduce named instance access to GX fonts.
+
+	For functions querying a face, bits 16-30 of the face index can hold
+	the named instance index if we have a GX font.  The indices start
+	with value 1; value 0 indicates font access without GX variation
+	data.
+
+	* include/freetype/freetype.h (FT_FaceRec): Update documentation.
+	* include/freetype/internal/sfnt.h: Ditto.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face)
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Get number of named instances and
+	do argument checks.
+	(sfnt_load_face): Updated.
+
+	* src/truetype/ttobjs.c (tt_face_init)
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Use named instance, overwriting
+	the style name.
+
+	* src/base/ftobjs.c (open_face_from_buffer,
+	open_face_PS_from_sfnt_stream): Updated.
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Updated.
+	* src/cff/cffload.c (cff_font_load): Updated.
+
+	* src/cff/cffobjs.c (cff_face_init): Make function exit early for
+	pure CFF fonts if `font_index < 0'.
+	Updated.
+
+	* src/cid/cidobjs.c (cid_face_init): Updated.
+	* src/pcf/pcfdrivr.c (PCF_Face_Init): Updated.
+	* src/pfr/pfrobjs.c (pfr_face_init): Updated.
+	* src/type1/t1objs.c (T1_Face_Init): Updated.
+	* src/type42/t42objs.c (T42_Face_Init): Updated.
+	* src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init):
+	Updated.
+
+	* docs/CHANGES: Updated.
+
+2015-08-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[type1,cff,cid] Streamline font matrix application.
+
+	* src/type1/t1gload.c (T1_Load_Glyph): Directly modify advances only
+	if font matrix is not trivial.
+	* src/cff/cffgload.c (cff_slot_load): Ditto.
+	* src/cid/cidgload.c (cid_slot_load_glyph): Ditto for advances and the
+	entire outline.
+
+2015-08-11  Werner Lemberg  <wl@gnu.org>
+
+	[builds/unix] Minor.
+
+	* builds/unix/configure.raw:
+	s/lib{priv,staticconf}/libs{priv,staticconf}/ for orthogonality with
+	similarly named uppercase variables.
+
+2015-08-10  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[type1,cid,type42] Minor improvements.
+
+	* src/type1/t1load.c (t1_parse_font_matrix): Scale units per EM only
+	when necessary. Refresh comments.
+	* src/cid/cidload.c (cid_parse_font_matrix): Ditto.
+	* src/type42/t42parse.c (t42_parse_font_matrix): Refresh comments.
+
+2015-08-08  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Fix glyph access.
+
+	This is a severe bug: We've missed one level of indirection, as
+	described in the Type 42 specification.  As a result, ftview
+	sometimes showed incorrect glyphs for given glyph names, and even
+	displayed `error 0x0006' (invalid argument!) in case the number of
+	glyph indices differed between the Type 42 font and the embedded
+	TTF.
+
+	Apparently, noone ever noticed it; this shows how much Type 42 fonts
+	are in use...
+
+	* src/type42/t42objs.c (T42_GlyphSlot_Load): Map Type 42 glyph index
+	to embedded TTF's glyph index.
+
+2015-08-08  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Minor clean-up.
+
+	* src/type42/t42parse.c (t42_parse_font_matrix): Remove unused
+	variable.
+
+2015-08-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[type42] Parse FontMatrix according to specifications.
+
+	* src/type42/t42parse.c (t42_parse_font_matrix): Type 42 FontMatrix
+	does not need scaling by 1000. Units_per_EM are taken from the
+	embedded TrueType.
+
+2015-08-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve Arabic hinting.
+
+	Problem reported by Titus Nemeth <tn@tntypography.eu> (by using
+	ttfautohint).
+
+	* src/autofit/afblue.dat: Add neutral blue zone for the tatweel
+	character.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+2015-08-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Clean up types.
+
+	* src/truetype/ttobjs.c (TT_Size): Move declaration from here.
+	* include/freetype/internal/tttypes.h (TT_Size): ... to here.
+	(TT_LoaderRec): Switch to appropriate types for `face' and `size'.
+	* src/truetype/ttgload.c: Remove corresponding type casts.
+	* src/truetype/ttsubpix.c: Ditto.
+
+2015-08-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve recognition of flat vs. rounded segments.
+
+	Lower the flatness threshold from upem/8 to upem/14, making the
+	auto-hinter accept shorter elements.
+
+	Synchronize flat/round stem selection algorithm with blue zone code.
+
+	* src/autofit/aflatin.c (FLAT_THRESHOLD): New macro.
+	(af_latin_metrics_init_blues): Use it.
+	(af_latin_hints_compute_segments): Collect information on maximum
+	and minimum coordinates of `on' points; use this to add a constraint
+	for the flat/round decision similar to
+	`af_latin_metrics_init_blues'.
+
+2015-08-04  Werner Lemberg  <wl@gnu.org>
+
+	Another left-shift bug (#45681).
+
+	* src/base/ftobjs.c (IsMacBinary): Only accept positive values for
+	`dlen'.
+
+2015-08-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Fix `ft_corner_orientation'.
+
+	Remove casting from `FT_Long' to `FT_Int' that might change the sign
+	of the return value and make it faster too.
+
+	* src/base/ftcalc.c (ft_corner_orientation): On 32-bit systems, stay
+	with 32-bit arithmetic when safe. Use plain math on 64-bit systems.
+	* src/pshinter/pshalgo.c: Remove old unused code.
+
+2015-08-03  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgload.c (load_truetype_glyph)
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix crash for composite glyphs
+	having a depth greater than 1.
+
+2015-08-03  Werner Lemberg  <wl@gnu.org>
+
+	Fix typo in clang bug from 2015-07-31 (#45678).
+
+	* src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Fix inequality.
+
+2015-08-02  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Improve shared library support.
+
+	Based on a patch from John Cary <cary@txcorp.com>.
+
+2015-08-02  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/freetype-config.in (enable_shared): Remove.  Unused.
+
+2015-08-02  Werner Lemberg  <wl@gnu.org>
+
+	Fix more invalid left-shifts.
+
+	* src/pfr/pfrgload.c (pfr_glyph_load_compound): Use multiplication,
+	not left-shift.
+
+	* src/truetype/ttgxvar.c (ft_var_load_avar, ft_var_load_gvar,
+	tt_face_vary_cvt, TT_Vary_Apply_Glyph_Deltas): Use multiplication,
+	not left-shift.
+
+2015-07-31  Werner Lemberg  <wl@gnu.org>
+
+	Fix some bugs found by clang's `-fsanitize=undefined' (#45661).
+
+	* src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Only accept
+	positive values from header.
+	Check overflow.
+
+	* src/base/ftoutln.c (SCALED): Correctly handle left-shift of
+	negative values.
+
+	* src/bdf/bdf.h (_bdf_glyph_modified, _bdf_set_glyph_modified,
+	_bdf_clear_glyph_modified): Use unsigned long constant.
+
+	* src/bdf/bdfdrivr.c (BDF_Size_Select, BDF_Glyph_Load): Don't
+	left-shift values that can be negative.
+
+	* src/pcf/pcfdrivr.c (PCF_Size_Select, PCF_Glyph_Load): Don't
+	left-shift values that can be negative.
+
+	* src/raster/ftraster.c (SCALED): Correctly handle left-shift of
+	negative values.
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics): Don't left-shift
+	values that can be negative.
+
+	* src/truetype/ttgload.c (TT_Load_Composite_Glyph,
+	compute_glyph_metrics, load_sbit_image): Don't left-shift values
+	that can be negative.
+
+2015-07-31  Werner Lemberg  <wl@gnu.org>
+
+	Define FT_LONG_MAX.
+
+	* include/freetype/config/ftstdlib.h (FT_LONG_MAX): New macro.
+	* src/cff/cf2arrst.c (cf2_arrstack_setNumElements): Use it.
+
+2015-07-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c (FT_Vector_NormLen): Clarify.
+
+2015-07-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftcalc.c (FT_Vector_NormLen): Explicate type conversions.
+
+2015-07-26  Matthias Clasen  <matthias.clasen@gmail.com>
+
+	[cff] Don't use `hmtx' table for LSB (#45520).
+
+	* src/cff/cffgload.c (cff_slot_load): Use `htmx' table for advance
+	width only.  Bug introduced 2015-04-10.
+
+2015-07-09  Werner Lemberg  <wl@gnu.org>
+
+	Better support of user-supplied C++ namespaces.
+
+	See
+
+	  https://lists.nongnu.org/archive/html/freetype-devel/2015-07/msg00008.html
+
+	for a rationale.
+
+	* src/autofit/afpic.h, src/base/basepic.h, src/cff/cffpic.h,
+	src/pshinter/pshpic.h, src/psnames/pspic.h, src/raster/rastpic.h,
+	src/sfnt/sfntpic.h, src/smooth/ftspic.h, src/truetype/ttpic.h
+	(FT_BEGIN_HEADER, FT_END_HEADER): Move macro calls to not enclose
+	header files that contain FT_{BEGIN,END}_HEADER macros by
+	themselves.
+
+	* src/autofit/aftypes.h [FT_DEBUG_AUTOFIT]: Include
+	FT_CONFIG_STANDARD_LIBRARY_H earlier.
+
+	* src/truetype/ttpic.h: Include FT_INTERNAL_PIC_H.
+
+2015-07-07  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Make `tt_face_get_name' member of the SFNT interface.
+
+	* include/freetype/internal/sfnt.h (TT_Get_Name_Func): New
+	prototype.
+	(SFNT_Interface, FT_DEFINE_SFNT_INTERFACE): New member `get_name'.
+
+	* src/sfnt/sfdriver.c (sfnt_interface): Updated.
+
+	* src/sfnt/sfobjs.c (tt_face_get_name): Tag it with `LOCAL_DEF'.
+	* src/sfnt/sfobjs.h: Add prototype for it.
+
+2015-06-30  Werner Lemberg  <wl@gnu.org>
+
+	Fix some clang compiler warnings.
+
+	* src/base/ftoutln.c (FT_Outline_EmboldenXY), src/cff/cf2intrp.c
+	(cf2_interpT2CharString), src/truetype/ttgload.c
+	(load_truetype_glyph), src/truetype/ttgxvar.c (tt_handle_deltas),
+	src/truetype/ttinterp.c (Ins_INSTCTRL): Fix signedness issues.
+
+2015-06-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Speed up bytecode interpreter.
+
+	* src/truetype/ttinterp.c (Normalize): Use `FT_Vector_NormLen'.
+
+2015-06-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Speed up emboldening.
+
+	* src/base/ftoutln.c (FT_Outline_EmboldenXY): Use
+	`FT_Vector_NormLen'.
+
+2015-06-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Implement fast vector normalization.
+
+	The function uses Newton's iterations instead of dividing vector
+	components by its length, which needs a square root. This is,
+	literally, a bit less accurate but a lot faster.
+
+	* src/base/ftcalc.c (FT_Vector_NormLen): New function.
+
+2015-06-28  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Always create `ftconfig.h'.
+
+	For non-UNIX builds, the file stays unmodified.  However, it's
+	better to have the main configuration files at the same place
+	regardless of the OS.
+
+2015-06-28  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Improve MSVC support (#43737).
+
+2015-06-28  Werner Lemberg  <wl@gnu.org>
+
+	[cmake] Check for libraries and create `ftoption.h'.
+
+	* builds/FindHarfBuzz.cmake: New file, taken from
+
+	  https://trac.webkit.org/browser/trunk/Source/cmake/FindHarfBuzz.cmake
+
+	* CMakeLists.Txt: Add path to local cmake modules.
+	Find dependencies for zlib, bzip2, libpng, and harfbuzz.
+	Create `ftoption.h' file.
+	Set up include and linker stuff for libraries.
+
+2015-06-28  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Fix creation of `ftconfig.h'.
+	Check for UNIX header files using `check_include_file'.
+	Set up correct header include directories.
+
+2015-06-28  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Disallow in-source builds.
+
+2015-06-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/docmaker/utils.py (check_output): Add missing `\n'.
+
+2015-06-26  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Select platform-dependent `ftdebug.c'.
+
+2015-06-25  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Use cmake functions for generating `ftconfig.h'.
+	Additionally, do this for UNIX only.
+
+2015-06-25  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt (BASE_SRCS): Use `ftbase.c' and `psnames.c'.
+
+2015-06-25  Werner Lemberg  <wl@gnu.org>
+
+	Another adjustment to header locations.
+
+	This change is a result of a discussion thread on freetype-devel
+
+	  https://lists.nongnu.org/archive/html/freetype-devel/2015-06/msg00041.html
+
+	Re-introduce the `freetype2' subdirectory for all FreeType header
+	files after installation, and rename the `freetype2' subdirectory in
+	the git repository to `freetype'.
+
+	* include/freetype2: Renamed to...
+	* include/freetype: This.
+
+	* CMakeLists.txt (PUBLIC_HEADERS, PUBLIC_CONFIG_HEADERS,
+	PRIVATE_HEADERS): Updated.
+	Update creation of `ftconfig.h'.
+	Install generated `ftconfig.h'.
+
+	* Jamfile (HDRMACRO, RefDoc), autogen.sh: Updated.
+
+	* builds/amiga/include/config/ftconfig.h, builds/freetype.mk
+	(PUBLIC_DIR), builds/symbian/bld.inf, builds/toplevel.mk (work),
+	builds/unix/freetype2.in: Updated.
+
+	* builds/unix/freetype-config.in: Updated.
+	* builds/unix/configure.raw: Don't check for `rmdir'.
+	* builds/unix/unix-def.in (DELDIR): Use `rm -rf', which is portable
+	according to the autoconf info manual.
+	* builds/unix/install.mk (install, uninstall,
+	distclean_project_unix): Update and simplify.
+
+	* builds/wince/*, builds/windows/*: Updated.
+
+	* devel/ft2build.h, include/ft2build.h: Updated.
+
+	* include/freetype2/config/ftheader.h,
+	include/freetype2/internal/ftserv.h,
+	include/freetype2/internal/internal.h: Update all header file
+	macros.
+
+	* src/tools/chktrcmp.py (TRACE_DEF_FILES): Updated.
+
+	* docs/*: Updated.
+
+2015-06-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/bdf/bdflib.c (_bdf_parse_start): Disallow 0 bpp.
+
+2015-06-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/bdf/bdflib.c (_bdf_parse_start): Simplify bpp parsing.
+
+2015-06-23  Werner Lemberg  <wl@gnu.org>
+
+	s/TYPEOF/FT_TYPEOF/ (#45376).
+
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.in,
+	include/freetype2/config/ftconfig.h,
+	include/freetype2/internal/ftobjs.h, src/autofit/afwarp.h: Do it.
+
+2015-06-22  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #45097.
+
+	We no longer `pollute' the namespace of possible header file names;
+	instead we move `ft2build.h' up by one level so that it gets
+	installed in the default include directory (e.g.,
+	/usr/local/include).  After this commit, only `ft2build.h' stays in
+	the compiler's include path.
+
+	No visible changes for the user who follows the standard FreeType
+	header inclusion rules.
+
+	* include/*: Move to ...
+	* include/freetype2/*: This directory, except `ft2build.h'.
+
+	* CMakeLists.txt (PUBLIC_HEADERS, PUBLIC_CONFIG_HEADERS,
+	PRIVATE_HEADERS), Jamfile (HDRMACRO, RefDoc), autogen.sh: Updated.
+
+	* builds/amiga/include/config/ftconfig.h, builds/freetype.mk
+	(PUBLIC_DIR), builds/symbian/bld.inf, builds/toplevel.mk (work),
+	builds/unix/install.mk (install, uninstall),
+	builds/unix/freetype2.in: Updated.
+
+	* builds/unix/freetype-config.in: Updated.
+	Emit -I directory only if it is not `/usr/include'.
+
+	* builds/wince/*, builds/windows/*: Updated.
+
+	* devel/ft2build.h, include/ft2build.h: Updated.
+
+	* include/freetype2/config/ftheader.h,
+	include/freetype2/internal/ftserv.h,
+	include/freetype2/internal/internal.h: Update all header file
+	macros.
+
+	* src/tools/chktrcmp.py (TRACE_DEF_FILES): Updated.
+
+2015-06-21  Werner Lemberg  <wl@gnu.org>
+
+	Make Jam support work again.
+
+	This is just very basic stuff and just a little bit tested on
+	GNU/Linux only.  I won't delve into this since I'm not a Jam user.
+
+	* Jamfile: Call `HDRMACRO' for `ftserv.h' also.
+	(DEFINES): Replace with...
+	(CCFLAGS): ... this.
+
+	* src/Jamfile: Don't call `HDRMACRO' for `internal.h'; this is
+	already handled in the top-level Jamfile.
+
+	* src/autofit/Jamfile (DEFINES): Replace with...
+	(CCFLAGS): ... this.
+	(_sources): Add missing files.
+
+	* src/cache/Jamfile: Don't call `HDRMACRO' for `ftcache.h'; it no
+	longer contains macro header definitions.
+
+	* src/base/Jamfile, src/cff/Jamfile, src/sfnt/Jamfile,
+	src/truetype/Jamfile (_sources): Add missing files.
+
+2015-06-16  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #45326.
+
+	* src/sfnt/sfntpic.h (SFNT_SERVICES_GET): Remove duplicate
+	definitions.
+
+2015-06-07  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.6 released.
+	=======================
+
+
+	Tag sources with `VER-2-6'.
+
+	* docs/VERSION.DLL: Update documentation and bump version number to
+	2.6.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.5.5/2.6/, s/255/26/.
+
+	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 6.
+	(FREETYPE_PATCH): Set to 0.
+
+	* builds/unix/configure.raw (version_info): Set to 18:0:12.
+	* CMakeLists.txt (VERSION_MINOR): Set to 6.
+	(VERSION_PATCH): Set to 0.
+
+	* src/autofit/afmodule.c [!FT_MAKE_OPTION_SINGLE_OBJECT]: Add
+	declarations for dumping functions.
+
+	* src/truetype/ttinterp.c (TT_New_Context): Pacify compiler.
+
+	* builds/toplevel.mk: Use `freetype.mk's code to compute the version
+	string.
+	Don't include a zero patch level in version string.
+	* builds/freetype.mk: Remove code for computing the version string.
+
+2015-06-06  Ashish Azad  <ashish.azad@samsung.com>
+
+	Fix Savannah bug #45260.
+
+	* src/pfr/pfrdrivr.c (pfr_get_kerning): Fix typo.
+
+2015-06-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix memory leak.
+
+	Problem reported by Grissiom <chaos.proton@gmail.com>; in
+
+	  https://lists.nongnu.org/archive/html/freetype/2015-05/msg00013.html
+
+	there is an example code to trigger the bug.
+
+	* src/truetype/ttobjs.c (tt_size_init_bytecode): Free old `size'
+	data before allocating again.  Bug most probably introduced four
+	years ago in version 2.4.3.
+
+2015-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[raster] Add more tracing.
+
+	* src/raster/ftraster.c (FT_TRACE7) [_STANDALONE_]: Define.
+	(Vertical_Sweep_Span, Vertical_Sweep_Drop, Horizontal_Sweep_Span,
+	Horizontal_Sweep_Drop, Render_Glyph): Add tracing calls.
+
+2015-06-01  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] While tracing opcodes, show code position and stack.
+
+	* src/truetype/ttinterp.c: Change all existing TRACE7 calls to
+	TRACE6.
+	(opcode_name): Add string lengths.
+	(TT_RunIns): Implement display of code position and stack.
+
+2015-05-31  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] In GX, make private point numbers work correctly.
+
+	This is completely missing in Apple's documentation: If a `gvar'
+	tuple uses private point numbers (this is, deltas are specified for
+	some points only), the uncovered points must be interpolated for
+	this tuple similar to the IUP bytecode instruction.  Examples that
+	need this functionality are glyphs `Oslash' and `Q' in Skia.ttf.
+
+	* src/truetype/ttgxvar.c (tt_delta_shift, tt_delta_interpolate,
+	tt_handle_deltas): New functions.
+	(TT_Vary_Get_Glyph_Deltas): Renamed to...
+	(TT_Vary_Apply_Glyph_Deltas): ... this; it directly processes the
+	points and does no longer return an array of deltas.
+	Add tracing information.
+	Call `tt_handle_deltas' to interpolate missing deltas.
+	Also fix a minor memory leak in case of error.
+
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+	load_truetype_glyph): Updated.
+
+2015-05-31  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] In GX, make intermediate tuplets work at extrema.
+
+	* src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix range condition.
+
+2015-05-31  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add tracing information to GX code.
+
+	* src/truetype/ttgxvar.c (ft_var_load_avar, ft_var_load_gvar,
+	ft_var_apply_tuple, TT_Get_MM_Var, TT_Set_MM_Blend,
+	TT_Set_Var_Design, tt_face_vary_cvt): Do it.
+
+2015-05-28  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/apinames.c (names_dump): Fix invalid reference.
+
+	Problem reported by Guzman Mosqueda, Jose R
+	<jose.r.guzman.mosqueda@intel.com>.
+
+2015-05-24  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix commit from 2015-05-22.
+
+	* src/truetype/ttgload.c, src/truetype/ttinterp.c: Guard new code
+	with `TT_CONFIG_OPTION_SUBPIXEL_HINTING'.
+
+	Problem reported by Nikolaus Waxweiler <madigens@gmail.com>.
+
+2015-05-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix return values of GETINFO bytecode instruction.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): New fields
+	`vertical_lcd' and `gray_cleartype'.
+
+	* src/truetype/ttgload.c (tt_loader_init): Initialize new fields.
+	Change `symmetrical smoothing' to TRUE, since FreeType produces
+	exactly this.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO): Fix selector/return bit
+	values for symmetrical smoothing, namely 11/18.
+	Handle bits for vertical LCD subpixels (8/15) and Gray ClearType
+	(12/19).
+
+2015-05-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Minor.
+
+	* src/truetype/ttinterp.h (TT_ExecContext):
+	 s/subpixel/subpixel_hinting.
+
+	* src/truetype/ttgload.c, src/truetype/ttgload.h: Updated.
+
+2015-05-22  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Support selector index 3 of the INSTCTRL instruction.
+
+	This flag activates `native ClearType hinting', disabling backward
+	compatibility mode as described in Greg Hitchcocks whitepaper.  In
+	other words, it enables unrestricted functionality of all TrueType
+	instructions in ClearType.
+
+	* src/truetype/ttgload.c (tt_get_metrics): Call `sph_set_tweaks'
+	unconditionally.
+	(tt_loader_init): Unset `ignore_x_mode' flag if bit 2 of
+	`GS.instruct_control' is active.
+
+	* src/truetype/ttinterp.c (Ins_INSTCTRL): Handle selector index 3.
+	(Ins_GETINFO): Updated.
+
+	* docs/CHANGES: Document it.
+
+2015-05-20  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Minor.
+
+	* src/truetype/ttinterp.h (SetSuperRound): Fix type of `GridPeriod'
+	argument.
+
+2015-05-17  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix loading of composite glyphs.
+
+	* src/truetype/ttgload.c (TT_Load_Composite_Glyph): If the
+	ARGS_ARE_XY_VALUES flag is not set, handle argument values as
+	unsigned.  I trust `ttx' (which has exactly such code) that it does
+	the right thing here...
+
+	The reason that noone has ever noticed this bug is probably the fact
+	that point-aligned subglyphs are rare, as are subglyphs with a
+	number of points in the range [128;255], which is quite large (or
+	even in the range [32768;65535], which is extremely unlikely).
+
+2015-05-12  Chris Liddell  <chris.liddell@artifex.com>
+
+	[cff] Make the `*curveto' operators more tolerant.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString): The opcodes
+	`vvcurveto', `hhcurveto', `vhcurveto', and `hvcurveto' all iterate,
+	pulling values off the stack until the stack is exhausted.
+	Implicitly the stack must be a multiple (or for subtly different
+	behaviour) a multiple plus a specific number of extra values deep.
+	If that's not the case, enforce it (as the old code did).
+
+2015-05-12  Chris Liddell  <chris.liddell@artifex.com>
+
+	[cff] fix incremental interface with new cff code.
+
+	* src/cff/cf2ft.c (cf2_getSeacComponent): When using the incremental
+	interface to retrieve glyph data for a SEAC, it be left to the
+	incremental interface callback to apply the encoding to raw
+	character index (as it was in the previous code).
+
+2015-04-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[autofit] Speed up IUP.
+
+	* src/autofit/afhints.c (af_iup_interp): Separate trivial snapping to
+	the same position from true interpolation, use `scale' to reduce
+	divisions.
+
+2015-04-28  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Use `name' table for PS name if we have a SFNT-CFF.
+
+	This follows the OpenType 1.7 specification.  See
+
+	  https://tug.org/pipermail/tex-live/2015-April/036634.html
+
+	for a discussion.
+
+	* src/cff/cffdrivr.c (cff_get_ps_name): Use the `sfnt' service if we
+	have an SFNT.
+
+2015-04-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[truetype] Speed up IUP.
+
+	* src/truetype/ttinterp.c (_iup_worker_interpolate): Separate trivial
+	snapping to the same position from true interpolation.
+
+2015-04-21  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] By default, enable warping code but switch off warping.
+
+	Suggested by Behdad.
+
+	* include/config/ftoption.h: Define AF_CONFIG_OPTION_USE_WARPER.
+
+	* src/autofit/afmodule.c (af_autofitter_init): Initialize `warping'
+	with `false'.
+
+2015-04-21  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Updated.
+
+2015-04-21  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Introduce `warping' property.
+
+	This code replaces the debugging hook from the previous commit with
+	a better, more generic solution.
+
+	* include/ftautoh.h: Document it.
+
+	* src/autofit/afmodule.h (AF_ModuleRec)
+	[AF_CONFIG_OPTION_USE_WARPER]: Add `warping' field.
+
+	* src/autofit/afmodule.c (_af_debug_disable_warper): Remove.
+	(af_property_set, af_property_get, af_autofitter_init)
+	[AF_CONFIG_OPTION_USE_WARPER]: Handle `warping' option.
+
+	* src/autofit/afhints.h (AF_HINTS_DO_WARP): Remove use of the no
+	longer existing `_af_debug_disable_warper'.
+
+	* src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
+	(af_latin_hints_init), src/autofit/aflatin2.c (af_latin2_hints_init)
+	[AF_CONFIG_OPTION_USE_WARPER]: Add `AF_SCALER_FLAG_NO_WARPER' to the
+	scaler flags if warping is off.
+
+	* src/autofit/aftypes.h: Updated.
+
+2015-04-16  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add debugging hook to disable warper.
+
+	* src/autofit/afmodule.c (_af_debug_disable_warper)
+	[FT_DEBUG_AUTOFIT]: New global variable.
+
+	* src/autofit/aftypes.h: Updated.
+	(AF_SCALER_FLAG_NO_WARPER): New macro (not actively used yet).
+
+	* src/autofit/afhints.h (AF_HINTS_DO_WARP): New macro.
+
+	* src/autofit/aflatin.c (af_latin_hints_apply)
+	[AF_CONFIG_OPTION_USE_WARPER]: Use `AF_HINTS_DO_WARP' to control use
+	of warper.
+
+	* src/autofit/afcjk.c (af_cjk_hints_init, af_cjk_hints_apply)
+	[AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'.
+
+	* src/autofit/aflatin2.c (af_latin2_hints_apply)
+	[AF_CONFIG_OPTION_USE_WARPER]: Synchronize with `aflatin.c'.
+
+2015-04-10  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Update advance width handling to OpenType 1.7.
+
+	Problem reported by Behdad.
+
+	* src/cff/cffdrivr.c (cff_get_advances): Handle SFNT case
+	separately.
+
+	* src/cff/cffgload.c (cff_slot_load): Use advance width and side
+	bearing values from `hmtx' table if present.
+
+2015-04-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Use do-while loop.
+
+2015-04-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/autofit/aflatin.c (af_latin_hint_edges): Reduce logic.
+
+2015-04-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[autofit] Finish the thought.
+
+	* src/autofit/afhints.c (af_direction_compute): make sure the long arm
+	is never negative so that its `FT_ABS' is not necessary.
+
+2015-04-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Call dumper functions for tracing.
+
+	* src/autofit/afcjk.c (af_cjk_hints_apply): Remove dead code.
+	* src/autofit/afhints.c (af_glyph_hints_dump_points): Minor
+	improvement.
+	* src/autofit/afmodule.c (af_autofitter_load_glyph): Implement it.
+
+2015-04-01  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Make debugging stuff work again.
+
+	The interface to ftgrid was broken in the series of commits starting
+	with
+
+	  [autofit] Allocate AF_Loader on the stack instead of AF_Module.
+
+	from 2015-01-14.
+
+	* src/autofit/afmodule.c (_af_debug_hints_rec) [FT_DEBUG_AUTOFIT]:
+	Use a global AF_GlyphHintsRec object for debugging.
+	(af_autofitter_done, af_autofitter_load_glyph): Updated.
+
+	* src/autofit/afloader.c (af_loader_init, af_loader_done): Updated.
+
+2015-04-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afhints.c (af_glyph_hints_done): Fix minor thinko.
+
+2015-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix Savannah bug #44629.
+
+	* src/cff/cf2font.h (CF2_MAX_SUBR), src/cff/cffgload.h
+	(CFF_MAX_SUBRS_CALLS): Set to 16.
+
+2015-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[type1, truetype] Make the MM API more flexible w.r.t. `num_coords'.
+
+	This commit allows `num_coords' to be larger or smaller than the
+	number of available axes while selecting a design instance, either
+	ignoring excess data or using defaults if data is missing.
+
+	* src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design):
+	Implement it.
+
+	* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design,
+	T1_Set_Var_Design): Ditto.
+
+2015-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Minor.
+
+	* src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Use
+	FT_THROW.
+	(T1_Set_Var_Design): Use T1_MAX_MM_AXIS and FT_THROW.
+
+2015-03-27  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Trace charstring nesting levels.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdCALLGSUBR,
+	cf2_cmdCALLSUBR, cf2_cmdRETURN>: Implement it.
+
+	* src/cff/cffgload.c (cff_decoder_parse_charstrings)
+	<cff_op_callsubr, cff_op_callgsubr, cff_op_return>: Ditto.
+
+2015-03-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base] Optimize `FT_Angle_Diff'.
+
+	Under normal circumstances we are usually close to the desired range
+	of angle values, so that the remainder is not really necessary.
+
+	* src/base/fttrigon.c (FT_Angle_Diff): Use loops instead of remainder.
+
+	* src/autofit/aftypes.h (AF_ANGLE_DIFF): Ditto in the unused macro.
+
+2015-03-21  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve `gvar' handling.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Correctly handle
+	single-element runs.  Cf. glyph `Q' in Skia.ttf with weights larger
+	than the default.
+
+2015-03-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/fttrigon.c (FT_Vector_Rotate): Minor refactoring.
+
+2015-03-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Fix Savannah bug #44412 (part 2).
+
+	* src/base/fttrigon.c (FT_Sin, FT_Cos, FT_Tan): Call `FT_Vector_Unit'.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Arabic script.
+
+	Thanks to Titus Nemeth <tn@tntypography.eu> for guidance!
+
+	* src/autofit/afblue.dat: Add blue zone data for Arabic.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Arabic standard characters.
+
+	* src/autofit/afranges.c: Add Arabic data.
+
+	* src/autofit/afstyles.h: Add Arabic data.
+
+	* docs/CHANGES: Document it.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	Rename `svxf86nm.h' to `svfntfmt.h'; update related symbols.
+
+	* include/internal/ftserv.h (FT_SERVICE_XFREE86_NAME_H): Renamed
+	to...
+	(FT_SERVICE_FONT_FORMAT_H): This.
+
+	* include/internal/services/svfntfmt.h (FT_XF86_FORMAT_*): Renamed
+	to ...
+	(FT_FONT_FORMAT_*): This.
+
+	src/base/ftfntfmt.c, src/bdf/bdfdrivr.c, src/cff/cffdrivr.c,
+	src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c,
+	src/truetype/ttdriver.c, src/type1/t1driver.c,
+	src/type42/t42drivr.c, src/winfonts/winfnt.c: Updated.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	[base] Rename `FT_XFREE86_H' to `FT_FONT_FORMATS_H'.
+
+	* include/config/ftheader.h: Implement it.
+	* src/base/ftfntfmt.c, docs/CHANGES: Updated.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	[base] Rename `FT_Get_X11_Font_Format' to `FT_Get_Font_Format'.
+
+	* include/ftfntfmt.h, src/base/ftfntfmt.c: Implement it.
+
+	* docs/CHANGES: Updated.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	Fix automatic copyright updating.
+
+	* src/tools/update-copyright: Make scanning of `no-copyright'
+	actually work.
+
+	* src/tools/no-copyright: Don't include README in general.
+
+2015-03-11  Werner Lemberg  <wl@gnu.org>
+
+	Rename `ftxf86.[ch]' to `ftfntfmt.[ch]'.
+
+	CMakeLists.txt, builds/amiga/makefile, builds/amiga/makefile.os4,
+	builds/amiga/smakefile, builds/mac/FreeType.m68k_cfm.make.txt,
+	builds/mac/FreeType.m68k_far.make.txt,
+	builds/mac/FreeType.ppc_carbon.make.txt,
+	builds/mac/FreeType.ppc_classic.make.txt, builds/symbian/bld.inf,
+	builds/symbian/freetype.mmp, builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/freetype.vcxproj.filters,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj, docs/INSTALL.ANY,
+	include/config/ftheader.h, include/ftfntfmt.h, modules.cfg,
+	src/base/ftfntfmt.c, vms_make.com: Updated.
+
+2015-03-10  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Fix Savannah bug #44412 (part 1).
+
+	* src/base/ftstroke.c (ft_stroker_inside): Handle near U-turns.
+
+2015-03-10  Werner Lemberg  <wl@gnu.org>
+
+	[base] Rename `FT_Bitmap_New' to `FT_Bitmap_Init'.
+
+	* include/ftbitmap.h, src/base/ftbitmap.c: Implement it.
+	Update all callers.
+
+	* docs/CHANGES: Updated.
+
+2015-03-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttload.c (tt_face_load_font_dir): Fix compiler warning.
+
+	Found by Alexei.
+
+2015-03-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftstroke.c: Simplify.
+
+2015-03-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Some fixes and code refactoring in `ttgxvar.c'.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix return value
+	of `point_cnt' if two bytes are read.
+	Use a more vertical coding style.
+	(ft_var_readpackeddeltas): Use FT_UInt for `delta_cnt' parameter.
+	Use a more vertical coding style.
+
+2015-03-03  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix Savannah bug #44241.
+
+	* src/autofit/aflatin.c (af_latin_metrics_init_blues): Reject glyphs
+	with less than 3 points.
+
+2015-03-02  Werner Lemberg  <wl@gnu.org>
+
+	Simplify `TYPEOF' macro.
+
+	No need for two arguments.
+
+	* include/config/ftconfig.h, builds/unix/ftconfig.in,
+	builds/vms/ftconfig.h (TYPEOF): Updated.
+
+	* include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR),
+	src/autofit/afwarp.h (AF_WARPER_FLOOR): Updated.
+
+2015-03-01  Werner Lemberg  <wl@gnu.org>
+
+	Various compiler warning fixes for `make multi'.
+
+	* src/autofit/afcjk.c (af_cjk_hints_compute_blue_edges),
+	src/autofit/aflatin.c (af_latin_hint_compute_blue_edges,
+	af_latin_hint_edges), src/autofit/aflatin2.c
+	(af_latin2_hints_compute_blue_edges, af_latin2_hint_edges): Declare
+	as `static'.
+
+	* src/cache/ftccmap.c (FTC_CMAP_QUERY_HASH, FTC_CMAP_NODE_HASH):
+	Removed.  Unused.
+	* src/cache/ftcimage.c: Include FT_INTERNAL_OBJECTS_H.
+	* src/cache/ftcmanag.c (FTC_LRU_GET_MANAGER): Removed.  Unused.
+
+	* src/cff/cf2intrp.c: Include `cf2intrp.h'.
+	* src/cff/cffdrivr.c (PAIR_TAG): Removed.  Unused.
+
+	* src/gzip/ftgzip.c (NO_DUMMY_DECL): Removed.  Unused.
+
+	* src/psaux/afmparse.c (afm_parser_read_int): Declare as `static'.
+
+	* src/pshinter/pshalgo.c (STRONGER, PSH_ZONE_MIN, PSH_ZONE_MAX):
+	Removed.  Unused.
+
+	* src/raster/ftraster.c (Render_Glyph): Declare as `static'.
+
+	* src/sfnt/ttpost.c (load_format_20): Fix signedness warning.
+
+	* src/truetype/ttdriver.c (PAIR_TAG): Removed.  Unused.
+	* src/truetype/ttsubpix.c (is_member_of_family_class,
+	is_member_of_style_class): Declare as `static'.
+
+	* src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Declare
+	as `static'.
+	* src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): Declare as
+	`static'.
+	(T1_FIELD_COUNT): Removed.  Unused.
+	* src/type1/t1parse.h (T1_Done_Table): Removed.  Unused.
+
+	* src/type42/t42parse.c (T1_Done_Table): Removed.  Unused.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Signedness fixes.
+
+	* include/internal/psaux.h, src/psaux/afmparse.c,
+	src/psaux/afmparse.h, src/psaux/psconv.c, src/psaux/psobjs.c,
+	src/psaux/t1cmap.c, src/psaux/t1decode.c: Apply.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[otvalid] Signedness fixes.
+
+	* src/otvalid/otvcommn.c, src/otvalid/otvgdef.c,
+	src/otvalid/otvgpos.c, src/otvalid/otvgsub.c, src/otvalid/otvmath.c:
+	Apply.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	* src/bzip2/ftbzip2.c (ft_bzip2_alloc): Signedness fix.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[lzw] Signedness fixes.
+
+	* src/lzw/ftzopen.c, src/lzw/ftzopen.h: Apply.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[gxvalid] Signedness fixes.
+
+	* src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c,
+	src/gxvalid/gxvcommn.h, src/gxvalid/gxvjust.c,
+	src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c,
+	src/gxvalid/gxvmort1.c, src/gxvalid/gxvmort2.c,
+	src/gxvalid/gxvmorx.c, src/gxvalid/gxvmorx1.c,
+	src/gxvalid/gxvmorx2.c, src/gxvalid/gxvopbd.c,
+	src/gxvalid/gxvprop.c, src/gxvalid/gxvtrak.c: Apply.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[cache] Signedness fixes.
+
+	* src/cache/ftcbasic.c, src/cache/ftccmap.c, src/cache/ftcimage.c,
+	src/cache/ftcmanag.c, src/cache/ftcsbits.c: Apply.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	Change dimension fields in `FTC_ImageTypeRec' to unsigned type.
+
+	This doesn't break ABI.
+
+	* include/ftcache.h (FTC_ImageTypeRec): Use unsigned types for
+	`width' and `height'.
+
+	* docs/CHANGES: Document it.
+
+2015-02-25  Werner Lemberg  <wl@gnu.org>
+
+	[cache] Don't use `labs'.
+
+	This is the only place in FreeType where this function was used.
+
+	* include/config/ftstdlib.h (ft_labs): Remove.
+
+	* src/cache/ftcimage.c (ftc_inode_weight): Replace `ft_labs' with
+	`FT_ABS'.
+
+2015-02-23  Werner Lemberg  <wl@gnu.org>
+
+	[cache] Replace `FT_PtrDist' with `FT_Offset'.
+
+	* src/cache/ftccache.h (FTC_NodeRec): `FT_Offset' (a.k.a. `size_t')
+	is a better choice for `hash' to hold a pointer than `FT_PtrDist'
+	(a.k.a. `ptrdiff_t'), especially since the latter is signed,
+	causing zillions of signedness warnings.  [Note that `hash' was of
+	type `FT_UInt32' before the change to `FT_PtrDist'.]
+	Update all users.
+
+	* src/cache/ftcbasic.c, src/cache/ftccache.c, src/cache/ftccmap.c,
+	src/cache/ftcglyph.c, src/cache/ftcglyph.h: Updated.
+
+2015-02-23  Werner Lemberg  <wl@gnu.org>
+
+	[smooth, raster] Re-enable standalone compilation.
+
+	* src/raster/ftraster.c (FT_RENDER_POOL_SIZE, FT_MAX)
+	[_STANDALONE_]: Define macros.
+
+	* src/smooth/ftgrays.c (FT_RENDER_POOL_SIZE, FT_MAX, FT_ABS,
+	FT_HYPOT) [_STANDALONE_]: Define macros.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Signedness fixes.
+
+	* src/smooth/ftgrays.c, src/smooth/ftsmooth.c: Apply.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/raster/ftraster.c: Use the file's typedefs everywhere.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttpost.c (load_format_20): Fix error tracing message.
+
+	Bug introduced 6 commits earlier.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[pshinter] Fix thinko.
+
+	* src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Correctly
+	check `count'.
+	Bug introduced two commits earlier.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[raster] Signedness fixes.
+
+	* src/raster/ftraster.c, src/raster/ftrend1.c: Apply.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[pshinter] Signedness fixes.
+
+	* src/pshinter/pshalgo.c, src/pshinter/pshglob.c,
+	src/pshinter/pshrec.c: Apply.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[pshinter] Use macros for (unsigned) flags, not enumerations.
+
+	* src/pshinter/pshalgo.h (PSH_Hint_Flags): Replace with macros.
+	Updated.
+	* src/pshinter/pshrec.h (PS_Hint_Flags): Replace with macros.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/pshinter/pshrec.c: Simplify.
+	(ps_hints_open, ps_hints_stem): Remove switch statement.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Signedness fixes.
+
+	* src/sfnt/pngshim.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap.c,
+	src/sfnt/ttkern.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
+	src/sfnt/ttsbit.c: Apply.
+	* src/sfnt/sfdriver.c: Apply.
+	(sfnt_get_ps_name): Simplify.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Signedness fixes.
+
+	* src/bdf/bdf.h, src/bdf/bdfdrivr.c, src/bdf/bdfdrivr.h,
+	src/bdf/bdflib.c: Apply.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/bdf/bdflib.c (_bdf_atous): New function.
+	(_bdf_parse_glyphs, _bdf_parse_start): Use it.
+
+2015-02-22  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Signedness fixes.
+
+	* src/pcf/pcf.h, src/pcf/pcfdrivr.c: Apply.
+	* src/pcf/pcfread.c: Apply.
+	(pcf_get_encodings): Ignore invalid negative encoding offsets.
+
+2015-02-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/winfonts/winfnt.c: Signedness fixes.
+
+2015-02-21  Werner Lemberg  <wl@gnu.org>
+
+	[type42] Signedness fixes.
+
+	* src/type42/t42parse.c, src/type42/t42parse.h,
+	src/type42/t42types.h: Apply.
+
+2015-02-21  Werner Lemberg  <wl@gnu.org>
+
+	[pfr] Signedness fixes.
+
+	* src/pfr/pfrdrivr.c, src/pfr/pfrgload.c, src/pfr/pfrload.c,
+	src/pfr/pfrload.h, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c,
+	src/pfr/pfrtypes.h: Apply.
+
+2015-02-21  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Minor signedness fixes related to last commit.
+
+	* src/cff/cf2ft.c, src/cff/cf2intrp.c, src/cff/cffgload.c: Apply.
+
+2015-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Thinkos in bias handling.
+
+	Only the final result is always positive.
+
+	Bug introduced three commits earlier.
+
+	* src/cff/cffgload.c, src/cff/cffgload.h: Apply.
+
+2015-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Fix signedness issues and emit some better error codes.
+
+	* src/cid/cidgload.c, src/cid/cidload.h, src/cid/cidobjs.c,
+	src/cid/cidparse.h: Apply.
+	* src/cid/cidload.c: Apply.
+	(parse_fd_array): Reject negative values for number of dictionaries.
+	* src/cid/cidparse.c: Apply.
+	(cid_parser_new): Reject negative values for hex data length.
+
+2015-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Signedness fixes for new engine.
+
+	* src/cff/cf2arrst.c, src/cff/cf2fixed.h, src/cff/cf2ft.c,
+	src/cff/cf2ft.h, src/cff/cf2hints.c, src/cff/cf2intrp.c: Apply.
+
+2015-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Signedness fixes for basic infrastructure and old engine.
+
+	* include/internal/pshints.h, src/cff/cffdrivr.c,
+	src/cff/cffgload.c, src/cff/cffgload.h, src/cff/cffload.c,
+	src/cff/cffobjs.c, src/cff/cffparse.c, src/pshinter/pshrec.c: Apply.
+
+2015-02-19  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Ignore `countSizePairs'.
+
+	This is hard-coded to value 2 in `fvar' version 1.0 (and no newer
+	version exists), but some fonts set it incorrectly.
+
+	Problem reported by Adam Twardoch <adam@fontlab.com>.
+
+2015-02-19  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Emit better error code for invalid private dict size.
+
+	* src/cff/cffparse.c (cff_parse_private_dict): Reject negative
+	values for size and offset.
+
+2015-02-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix signedness issues.
+
+	* src/autofit/afangles.c, src/autofit/afcjk.c,
+	src/autofit/afglobal.c, src/autofit/afhints.c,
+	src/autofit/aflatin.c, src/autofit/aflatin2.c, src/autofit/afwarp.c,
+	src/autofit/hbshim.c: Apply.
+
+2015-02-19  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Use macros for (unsigned) flags, not enumerations.
+
+	This harmonizes with other code in FreeType (and reduces the number
+	of necessary casts to avoid compiler warnings).
+
+	* src/autofit/afblue.hin: Make flag macros unsigned.
+	* src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afcjk.h: Replace flag enumeration with macros.
+	* src/autofit/afcjk.c: Updated.
+
+	* src/autofit/afhints.h (AF_Flags, AF_Edge_Flags): Replace with
+	macros.
+	* src/autofit/afhints.c: Updated.
+
+	* src/autofit/aflatin.h: Replace flag enumerations with macros.
+	* src/autofit/aflatin.c, src/autofit/aflatin2.c: Updated.
+
+	* src/autofit/aftypes.h (AF_ScalerFlags): Replace with macros.
+
+2015-02-18  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Fix signedness issues.
+
+	* include/internal/psaux.h, include/internal/t1types.h,
+	src/psaux/psobjs.c, src/psaux/psobjs.h, src/psaux/t1decode.c,
+	src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1parse.c: Apply.
+
+2015-02-18  Werner Lemberg  <wl@gnu.org>
+
+	[psaux, type1] Fix minor AFM issues.
+
+	* include/internal/t1types.h (AFM_KernPairRec): Make indices
+	unsigned.
+	Update users.
+	(AFM_FontInfoRec): Make element counters unsigned.
+	Update users.
+	* src/psaux/afmparse.h (AFM_ValueRec): Add union member for unsigned
+	int.
+
+	* src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs):
+	Reject negative values for number of kerning elements.
+
+	* src/type1/t1afm.c, src/tools/test_afm.c: Updated.
+
+2015-02-18  Werner Lemberg  <wl@gnu.org>
+
+	Don't use `FT_PtrDist' for lengths.
+
+	Use FT_UInt instead.
+
+	* include/internal/psaux.h (PS_Table_FuncsRec, PS_TableRec,
+	T1_DecoderRec): Do it.
+
+	* include/internal/t1types.h (T1_FontRec): Ditto.
+
+	* src/cid/cidload.c (cid_parse_dict): Updated.
+	* src/pfr/pfrload.c (pfr_extra_item_load_font_id): Ditto.
+	* src/psaux/psobjs.c (ps_table_add), src/psaux/psobjs.h: Ditto.
+	* src/type1/t1load.c (parse_blend_axis_types, parse_encoding,
+	parse_charstrings, parse_dict): Ditto.
+	* src/type42/t42parse.c (t42_parse_encoding, t42_parse_charstrings,
+	t42_parse_dict): Ditto.
+
+2015-02-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1driver.c (t1_ps_get_font_value): Clean up.
+	This handles negative values better, avoiding many casts.
+
+2015-02-17  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix Savannah bug #44284.
+
+	* src/base/ftcalc.c (FT_MulFix): Typos.
+
+2015-02-17  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Finish compiler warning fixes for signedness issues.
+
+	* src/truetype/ttgxvar.c, src/truetype/ttsubpix.c,
+	src/truetype/ttsubpix.h: Apply.
+
+2015-02-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttsubpix.c: Adding missing `static' keywords.
+
+2015-02-17  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More signedness fixes.
+
+	* include/internal/tttypes.h, src/truetype/ttinterp.h,
+	src/truetype/ttobjs.h, src/truetype/ttinterp.c,
+	src/truetype/ttobjs.c: Apply.
+
+2015-02-17  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Various signedness fixes.
+
+	* include/internal/ftgloadr.h, src/truetype/ttpload.c: Apply.
+
+	* src/truetype/ttgload.c: Apply.
+	(TT_Get_VMetrics): Protect against invalid ascenders and descenders
+	while constructing advance height.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	[base] Finish compiler warning fixes for signedness issues.
+
+	* src/base/ftglyph.c, src/base/ftlcdfil.c, src/base/ftstroke.c:
+	Apply.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	* include/tttables.h (TT_OS2): `fsType' must be FT_UShort.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	More minor signedness warning fixes.
+
+	* src/base/ftbbox.c, src/base/ftbitmap.c, src/base/fttrigon.c,
+	src/base/ftutil.c: Apply.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	Next round of minor compiler warning fixes.
+
+	* include/internal/ftrfork.h (FT_RFork_Ref): Change `offset' member
+	type to `FT_Long'.
+	(CONST_FT_RFORK_RULE_ARRAY_BEGIN): Add `static' keyword.
+
+	* include/internal/ftstream.h (FT_Stream_Pos): Return `FT_ULong'.
+
+	* src/base/ftoutln.c, src/base/ftrfork.c, src/base/ftstream.c:
+	Signedness fixes.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	Various minor signedness fixes.
+
+	* include/ftadvanc.h, include/internal/ftobjs.h,
+	src/base/ftgloadr.c, src/base/ftobjs.c: Apply.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	New `TYPEOF' macro.
+
+	This helps suppress signedness warnings, avoiding issues with
+	implicit conversion changes.
+
+	* include/config/ftconfig.h, builds/unix/ftconfig.in,
+	builds/vms/ftconfig.h (TYPEOF): Define.
+
+	* include/internal/ftobjs.h (FT_PAD_FLOOR, FT_PIX_FLOOR),
+	src/autofit/afwarp.h (AF_WARPER_FLOOR): Use it.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftsystem.c: Use casts in standard C function wrappers.
+	(ft_alloc, ft_realloc, ft_ansi_stream_io, FT_Stream_Open): Do it.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #44261.
+
+	* builds/unix/detect.mk (setup) [unix]: Set `CONFIG_SHELL' in the
+	environment also while calling the configure script.
+
+2015-02-16  Werner Lemberg  <wl@gnu.org>
+
+	* include/internal/ftmemory.h: Add some `FT_Offset' casts.
+	(FT_MEM_SET, FT_MEM_COPY, FT_MEM_MOVE, FT_ARRAY_ZERO, FT_ARRAY_COPY,
+	FT_MEM_MOVE): Do it.
+
+2015-02-15  Werner Lemberg  <wl@gnu.org>
+
+	[base] Clean up signedness issues in `ftdbgmem.c'.
+
+	Also fix other minor issues.
+
+	* src/base/ftdbgmem.c (FT_MemTableRec): Replace all FT_ULong types
+	with FT_Long for consistency.
+	(ft_mem_primes): Change type to `FT_Int'.
+	(ft_mem_closest_prime, ft_mem_table_set): Updated.
+
+	(ft_mem_debug_panic, ft_mem_debug_alloc, ft_mem_debug_free,
+	ft_mem_debug_realloc): Use `static' keyword and fix signedness
+	warnings where necessary.
+
+	(ft_mem_table_resize, ft_mem_table_new, ft_mem_table_destroy,
+	ft_mem_table_get_nodep, ft_mem_debug_init, FT_DumpMemory): Fix types
+	and add or remove casts to avoid signedness warnings.
+
+2015-02-15  Werner Lemberg  <wl@gnu.org>
+
+	[base] Clean up signedness in arithmetic functions.
+
+	This makes the code more readable and reduces compiler warnings.
+
+	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round, FT_MulFix,
+	FT_DivFix): Convert input parameters to unsigned, do the
+	computation, then convert the result back to signed.
+	(ft_corner_orientation): Fix casts.
+
+2015-02-07  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Savannah bug #44184.
+
+	* src/sfnt/ttload.c (check_table_dir, tt_face_load_font_dir): No
+	longer reject `htmx' and `vmtx' tables with invalid length but
+	sanitize them.
+
+2015-02-06  Jon Anderson  <jon@websupergoo.com>
+
+	[truetype] Fix regression in the incremental glyph loader.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): For incremental
+	fonts, the glyph index may be greater than the number of glyphs
+	indicated, so guard the check with a preprocessor conditional.
+
+2015-02-06  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix potential memory leak.
+
+	While this doesn't show up with FreeType, exactly the same code
+	leaks with ttfautohint's modified auto-hinter code (which gets used
+	in a slightly different way).
+
+	It certainly doesn't harm since it is similar to already existing
+	checks in the code for embedded arrays.
+
+	* src/autofit/afhints.c (af_glyph_hints_reload): Set `max_contours'
+	and `max_points' for all cases.
+
+2015-01-31  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add support for Thai script.
+
+	Thanks to Ben Mitchell <ben@rosettatype.com> for guidance with blue
+	zone characters!
+
+	* src/autofit/afblue.dat: Add blue zone data for Thai.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Thai standard characters.
+
+	* src/autofit/afranges.c: Add Thai data.
+
+	* src/autofit/afstyles.h: Add Thai data.
+
+2015-01-23  Behdad Esfahbod  <behdad@behdad.org>
+
+	[raster] Handle `FT_RASTER_FLAG_AA' correctly.
+
+	This fixes a breakage caused by the commit `[raster] Remove
+	5-level gray AA mode from monochrome rasterizer.'.
+
+	Problem reported by Markus Trippelsdorf <markus@trippelsdorf.de>.
+
+	* src/raster/ftraster.c (ft_black_render): Handle
+	`FT_RASTER_FLAG_AA'.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Remove gray AA mode
+	remnants.
+
+2015-01-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (FT_New_Library): Fix compiler warning.
+
+2015-01-18  Chris Liddell  <chris.liddell@artifex.com>
+
+	[raster] Fix Savannah bug #44022.
+
+	Add fallback for glyphs with degenerate bounding boxes.
+
+	If a glyph has only one very narrow feature, the bbox can end up
+	with either the width or height of the bbox being 0, in which case
+	no raster memory is allocated and no attempt is made to render the
+	glyph.  This is less than ideal when the drop-out compensation in
+	the rendering code would actually result in the glyph being
+	rendered.
+
+	This problem can be observed with the `I' glyph (gid 47) in the
+	Autodesk RomanS TrueType font.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Add a fallback if either
+	dimension is zero to explicitly round up/down (instead of simply
+	round).
+
+2015-01-17  Werner Lemberg  <wl@gnu.org>
+
+	Add some tools to handle yearly copyright notice updates.
+
+	We are now following the GNU guidelines: A new release automatically
+	means that the copyright year of all affected files gets updated; it
+	is no longer used to track years of modification changes.
+
+	* src/tools/update-copyright-year: New Perl script.
+	* src/tools/update-copyright: New shell script that calls
+	`update-copyright-year' on all files.
+	* src/tools/no-copyright: Exceptions that should not be handled by
+	`update-copyright'
+
+2015-01-14  Werner Lemberg  <wl@gnu.org>
+
+	* docs/CHANGES: Updated, using a description from Behdad.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	* src/autofit/afmodule.c (af_autofitter_done): Fix compiler warning.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Add embedded array of segments and edges.
+
+	Avoids multiple mallocs per typical glyphs.
+
+	With this and recent changes to avoid mallocs, the thread-safe
+	stack-based loader is now as fast as the previous model that had one
+	cached singleton.
+
+	* src/autofit/afhints.h (AF_SEGMENTS_EMBEDDED, AF_EDGES_EMBEDDED):
+	New macros.
+	(AF_AxisHintsRec): Add two arrays for segments and edges.
+
+	* src/autofit/afhints.c (af_axis_hints_new_segment): Only allocate
+	data if number of segments exceeds given threshold value.
+	(af_axis_hints_new_edge):  Only allocate data if number of edges
+	exceeds given threshold value.
+	(af_glyph_hints_done): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Add embedded arrays for points and contours.
+
+	This avoids at least two malloc calls for typical glyphs.
+
+	* src/autofit/afhints.h (AF_POINTS_EMBEDDED, AF_CONTOURS_EMBEDDED):
+	New macros.
+	(AF_GlyphHintsRec): Add two arrays for contours and points.
+
+	* src/autofit/afhints.c (af_glyph_hints_init, af_glyph_hints_done):
+	Updated.
+	(af_glyph_hints_reload): Only allocate data if number of contours or
+	points exceeds given threshold values.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Allocate hints object on the stack.
+
+	This avoids one malloc per load.
+
+	* src/autofit/afloader.h (AF_LoaderRec): Change type of `hints' to
+	`AF_GlyphHints'.
+	Update prototype.
+
+	* src/autofit/afloader.c (af_loader_init): Use `AF_GlyphHints'
+	parameter instead of `FT_Memory'.
+	(af_loader_done): Directly reset `load_hints'.
+	(af_loader_load_g): Updated.
+
+	* src/autofit/afmodule.c (af_autofitter_load_glyph): Use local
+	`hints' object.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Reuse slot glyph loader.
+
+	No need to create a new glyph loader; we can reuse the one from
+	`slot->internal->loader'.  It's hard to tell why it was written that
+	way originally, but new code looks sound and correct to me, and
+	avoids lots of allocations.
+
+	* src/autofit/afloader.c (af_loader_init): Change return type to
+	`void'.
+	Don't call `FT_GlyphLoader_New'.
+	(af_loader_reset): Don't call `FT_GlyphLoader_Rewind'.
+	(af_loader_load_g): Update code to use `internal->loader', which
+	doesn't need copying of data.
+
+	* src/autofit/afloader.h (AF_LoaderRec): Remove `gloader' member.
+	Update prototype.
+
+	* src/autofit/afmodule.c (af_autofitter_load_glyph): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Remove (unused) support for composite glyphs.
+
+	We never have to deal with composite glyphs in the autohinter, as
+	those will be loaded into FORMAT_OUTLINE by the recursed
+	`FT_Load_Glyph' function.
+
+	In the rare cases that FT_LOAD_NO_RECURSE is set, it will imply
+	FT_LOAD_NO_SCALE as per `FT_Load_Glyph', which then implies
+	FT_LOAD_NO_HINTING:
+
+	  /* resolve load flags dependencies */
+
+	  if ( load_flags & FT_LOAD_NO_RECURSE )
+	    load_flags |= FT_LOAD_NO_SCALE         |
+	                  FT_LOAD_IGNORE_TRANSFORM;
+
+	  if ( load_flags & FT_LOAD_NO_SCALE )
+	  {
+	    load_flags |= FT_LOAD_NO_HINTING |
+	                  FT_LOAD_NO_BITMAP;
+
+	    load_flags &= ~FT_LOAD_RENDER;
+	  }
+
+	and as such the auto-hinter is never called.  Thus, the recursion in
+	`af_loader_load_g' never actually happens.  So remove the depth
+	counter as well.
+
+	* src/autofit/afloader.c (af_loader_load_g): Remove `depth'
+	parameter.
+	<FT_GLYPH_FORMAT_COMPOSITE>: Remove associated code.
+	(af_loader_load_glyph): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[raster] Fix uninitialized memory access.
+
+	Apparently `ras.cProfile' might be uninitialized.  This will be the
+	case if `ras.top == ras.cProfile->offset', as can be seen in
+	`End_Profile'.  The overshoot code introduced in a change `Fix B/W
+	rasterization of subglyphs with different drop-out modes.' (from
+	2009-06-18) violated this, accessing `ras.cProfile->flags'
+	unconditionally just before calling `End_Profile' (which then
+	detected that `cProfile' is uninitialized and didn't touch it).
+
+	This was harmless, and was not detected by valgrind before because
+	the objects were allocated on the `raster_pool', which was always
+	initialized.  With recent change to allocate raster buffers on the
+	stack, valgrind now reported this invalid access.
+
+	* src/raster/ftraster.c (Convert_Glyph): Don't access an
+	uninitialized `cProfile'.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[smooth] Fix uninitialized memory access.
+
+	Looks like `ras.span_y' could always be used without initialization.
+	This was never detected by valgrind before because the library-wide
+	`raster_pool' was used for the worker object and `raster_pool' was
+	originally zero'ed.  But subsequent reuses of it were using `span_y'
+	uninitialized.  With the recent change to not use `render_pool' and
+	allocate worker and buffer on the stack, valgrind now detects this
+	uninitialized access.
+
+	* src/smooth/ftgrays.c (gray_raster_render): Initialize
+	`ras.span_y'.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[base] Don't initialize unused `driver->glyph_loader'.
+
+	* src/base/ftobjs.c (Destroy_Driver): Don't call
+	`FT_GlyphLoader_Done'.
+	(FT_Add_Module): Don't call `FT_GlyphLoader_New'.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[base] Don't allocate `library->raster_pool' anymore.
+
+	It's unused after the following commits:
+
+	  [raster] Allocate render pool for mono rasterizer on the stack.
+	  [raster] Remove 5-level gray AA mode from monochrome rasterizer.
+
+	The value of FT_RENDER_POOL_SIZE still serves the purpose it used to
+	serve, which is, to adjust the pool size.  But the pool is now
+	allocated on the stack on demand.
+
+	* src/base/ftobjs.c (FT_New_Library, FT_Done_Library): Implement.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[base] Do not reorder library->renderers upon use.
+
+	Instead of keeping `library->renderers' in a MRU order, just leave
+	it as-is.  The MRU machinery wasn't thread-safe.
+
+	With this patch, rasterizing glyphs from different faces from
+	different threads doesn't fail choosing rasterizer
+	(FT_Err_Cannot_Render_Glyph).
+
+	Easiest to see that crash was to add a `printf' (or otherwise let
+	thread yield in FT_Throw with debugging enabled).
+
+	* src/base/ftobjs.c (FT_Render_Glyph_Internal), src/base/ftoutln.c
+	(FT_Outline_Render): Don't call `FT_Set_Renderer'.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[raster] Allocate render pool for mono rasterizer on the stack.
+
+	Instead of using the `render_pool' member of `FT_Library' that is
+	provided down to the rasterizer, completely ignore that and allocate
+	needed objects on the stack instead.
+
+	With this patch, rasterizing glyphs from different faces from
+	different threads doesn't crash in the monochrome rasterizer.
+
+	* src/raster/ftraster.c (black_TRaster): Remove `buffer',
+	`buffer_size', and `worker' members.
+
+	(ft_black_render): Create `buffer' locally.
+	(ft_black_reset): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[raster] Remove 5-level gray AA mode from monochrome rasterizer.
+
+	It was off by default and couldn't be turned on at runtime.  And the
+	smooth rasterizer superseded it over ten years ago.  No point in
+	keeping.  Comments suggested that it was there for compatibility
+	with FreeType 1.
+
+	550 lines down.
+
+	* src/raster/ftraster.c (FT_RASTER_OPTION_ANTI_ALIASING,
+	RASTER_GRAY_LINES): Remove macros and all associated code.
+
+	(black_TWorker): Remove `gray_min_x' and `gray_max_x'.
+	(black_TRaster): Remove `grays' and `gray_width'.
+
+	(Vertical_Sweep_Init, Vertical_Sweep_Span, Vertical_Sweep_Drop,
+	ft_black_render): Updated.
+
+	* src/raster/ftrend1.c (ft_raster1_render): Simplify code.
+	(ft_raster5_renderer_class): Removed.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[smooth] Allocate render pool for smooth rasterizer on the stack.
+
+	Instead of using the `render_pool' member of `FT_Library' that is
+	provided down to the rasterizer, completely ignore that and allocate
+	needed objects on the stack instead.
+
+	With this patch, rasterizing glyphs from different faces from
+	different threads doesn't crash in the smooth rasterizer.
+
+	Bugs:
+
+	  https://bugzilla.redhat.com/show_bug.cgi?id=678397
+	  https://bugzilla.redhat.com/show_bug.cgi?id=1004315
+	  https://bugzilla.redhat.com/show_bug.cgi?id=1165471
+	  https://bugs.freedesktop.org/show_bug.cgi?id=69034
+
+	* src/smooth/ftgrays.c (gray_TRaster): Remove `buffer',
+	`buffer_size', `band_size', and `worker' members.
+
+	(gray_raster_render): Create `buffer', `buffer_size', and
+	`band_size' locally.
+	(gray_raster_reset): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Allocate TT_ExecContext in TT_Size instead of TT_Driver.
+
+	Previously the code had stipulation for using a per-TT_Size exec
+	context if `size->debug' was true.  But there was no way that
+	`size->debug' could *ever* be true.  As such, the code was always
+	using the singleton `TT_ExecContext' that was stored in `TT_Driver'.
+	This was, clearly, not threadsafe.
+
+	With this patch, loading glyphs from different faces from different
+	threads doesn't crash in the bytecode loader code.
+
+	* src/truetype/ttobjs.h (TT_SizeRec): Remove `debug' member.
+	(TT_DriverRec): Remove `context' member.
+
+	* src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Remove
+	`TT_ExecContext' code related to a global `TT_Driver' object.
+
+	(tt_driver_done): Don't remove `TT_ExecContext' object here but ...
+	(tt_size_done_bytecode): ... here.
+
+	(tt_driver_init): Don't create `TT_ExecContext' object here but ...
+	(tt_size_init_bytecode): ... here, only on demand.
+
+	* src/truetype/ttinterp.c (TT_Run_Context): Remove defunct debug
+	code.
+	(TT_New_Context): Remove `TT_ExecContext' code related to a global
+	`TT_Driver' object.
+
+	* src/truetype/ttinterp.h: Updated.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph, tt_loader_init): Updated.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[autofit] Allocate AF_Loader on the stack instead of AF_Module.
+
+	Stop sharing a global `AF_Loader'.  Allocate one on the stack during
+	glyph load.
+
+	Right now this results in about 25% slowdown, to be fixed in a
+	following commit.
+
+	With this patch loading glyphs from different faces from different
+	threads doesn't immediately crash in the autohinting loader code.
+
+	Bugs:
+
+	  https://bugzilla.redhat.com/show_bug.cgi?id=1164941
+
+	* src/autofit/afloader.c (af_loader_init): Pass
+	`AF_Loader' and `FT_Memory' instead of `AF_Module' as arguments.
+	(af_loader_reset, af_loader_load_glyph): Also pass `loader' as
+	argument.
+	(af_loader_done): Use `AF_Loader' instead of `AF_Module' as
+	argument.
+
+	* src/autofit/afmodule.c (af_autofitter_init): Don't call
+	`af_loader_init'.
+	(af_autofitter_done): Don't call `af_loader_done'.
+	(af_autofitter_load_glyph): Use a local `AF_Loader' object.
+
+	* src/autofit/afloader.h: Include `afmodule.h'.
+	Update prototypes.
+	Move typedef for `AF_Module' to...
+
+	* src/autofit/afmodule.h: ... this place.
+	No longer include `afloader.h'.
+
+2015-01-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	* src/type42/t42objs.h (T42_DriverRec): Remove unused member.
+
+2015-01-12  Werner Lemberg  <wl@gnu.org>
+
+	Fix Savannah bug #43976.
+
+	Assure that FreeType's internal include directories are found before
+	`CPPFLAGS' (which might be set by the user in the environment), and
+	`CPPFLAGS' before `CFLAGS'.
+
+	* builds/freetype.mk (FT_CFLAGS): Don't add `INCLUDE_FLAGS'.
+	(FT_COMPILE): Make this a special variable for compiling only the
+	files handled in `freetype.mk'.
+	(.c.$O): Removed, unused.
+
+	* src/*/rules.mk (*_COMPILE): Fix order of include directories.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Prettifying.
+
+	* src/truetype/ttinterp.c (project, dualproj, fast_project,
+	fast_dualproj): Rename to...
+	(PROJECT, DUALPROJ, FAST_PROJECT, FAST_DUALPROJ): ... this.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (Ins_JROT, Ins_JROF): Simplify.
+
+	Based on a patch from Behdad.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (Ins_SxVTL): Simplify function call.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (Normalize): Remove unused argument.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	* src/truetype/ttinterp.c (FT_UNUSED_EXEC): Remove macro by
+	expansion.
+
+2015-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	* src/truetype/ttinterp.c (INS_ARG): Remove macro by expansion,
+	adjusting function calls where necessary.
+	(FT_UNUSED_ARG): Removed, no longer needed.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	Based on a patch from Behdad.
+
+	* src/truetype/ttinterp.c (DO_*): Expand macros into corresponding
+	`Ins_*' functions.
+	(TT_RunIns): Replace `DO_*' macros with `Ins_*' function calls.
+	(ARRAY_BOUND_ERROR): Remove second definition, which is no longer
+	needed.
+	(Ins_SVTCA, Ins_SPVTCA, Ins_SFVTCA): Replaced with...
+	(Ins_SxyTCA): New function.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Remove TT_CONFIG_OPTION_INTERPRETER_SWITCH.
+
+	Behdad suggested this code simplification, and nobody objected...
+
+	* include/config/ftoption.h, devel/ftoption.h
+	(TT_CONFIG_OPTION_INTERPRETER_SWITCH): Remove.
+
+	* src/truetype/ttinterp.c [TT_CONFIG_OPTION_INTERPRETER_SWITCH]:
+	Remove related code.
+	(ARRAY_BOUND_ERROR): Use do-while loop.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	* src/truetype/ttinterp.c, src/truetype/ttinterp.h (EXEC_ARG_,
+	EXEC_ARG): Remove by replacing with expansion.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	Based on a patch from Behdad.
+
+	* src/truetype/ttinterp.c (SKIP_Code, GET_ShortIns, NORMalize,
+	SET_SuperRound, ROUND_None, INS_Goto_CodeRange, CUR_Func_move,
+	CUR_Func_move_orig, CUR_Func_round, CUR_Func_cur_ppem,
+	CUR_Func_read_cvt, CUR_Func_write_cvt, CUR_Func_move_cvt,
+	CURRENT_Ratio, INS_SxVTL, COMPUTE_Funcs, COMPUTE_Round,
+	COMPUTE_Point_Displacement, MOVE_Zp2_Point): Remove by replacing
+	with expansion.
+
+	(Cur_Func_project, CUR_Func_dualproj, CUR_fast_project,
+	CUR_fast_dualproj): Replace with macros `project', `dualproj',
+	`fast_project', `fast_dualproj'.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More macro expansions.
+
+	* src/truetype/ttinterp.c (EXEC_OP_, EXEC_OP): Remove by replacing
+	with expansion.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Remove code for static TrueType interpreter.
+
+	This is a follow-up patch.
+
+	* src/truetype/ttinterp.c, src/truetype/ttinterp.h
+	[TT_CONFIG_OPTION_STATIC_INTERPRETER,
+	TT_CONFIG_OPTION_STATIC_RASTER]: Remove macros and related code.
+
+2015-01-10  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (CUR): Remove by replacing with expansion.
+
+	This starts a series of patches that simplifies the code of the
+	bytecode interpreter.
+
+
+----------------------------------------------------------------------------
+
+Copyright 2015-2018 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.
+
+
+Local Variables:
+version-control: never
+coding: utf-8
+End:
diff --git a/ChangeLog.27 b/ChangeLog.27
new file mode 100644
index 0000000..0e82b2f
--- /dev/null
+++ b/ChangeLog.27
@@ -0,0 +1,2106 @@
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.7.1 released.
+	=========================
+
+
+	Tag sources with `VER-2-7-1'.
+
+	* docs/VERSION.TXT: Add entry for version 2.7.1.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.7/2.7.1/, s/27/271/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+	* builds/unix/configure.raw (version_info): Set to 19:0:13.
+	* CMakeLists.txt (VERSION_PATCH): Set to 1.
+
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Replace `rand' with an xorshift algorithm.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Don't include `stdlib.h'.
+	(Random): Implement and use a 32bit `xorshift' algorithm.
+
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Restrict number of tested bitmap strikes.
+
+	Malformed fonts often have large values for the number of bitmap
+	strikes, and FreeType doesn't check the validity of all bitmap
+	strikes in advance.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=353
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Include `stdlib.h' for `rand'.
+	(Random): Small class to provide n randomly selected numbers
+	(without repetition) out of the value set [1,N].
+	(LLVMFuzzerTestOneInput): Use it to test only up to 10 bitmap
+	strikes.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Variation font API stability issues.
+
+	Make some functions work before a call to `TT_Set_MM_Blend'.
+
+	* src/truetype/ttgxvar.c (tt_hadvance_adjust): Exit immediately if
+	we don't blend.
+	(TT_Get_MM_Blend, TT_Get_Var_Design): Return default values if we
+	don't blend.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis data.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=348
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Tracing fixes.
+
+	* src/truetype/ttgxvar.c (tt_hadvance_adjust): Emit correct
+	information.
+	(TT_Set_Var_Design): Fix typo.
+	(TT_Get_Var_Design): Fix typos.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+	*/*: Use `0.5f' for tracing 16.16 numbers.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Protect against gzip bombs.
+
+	Fix suggested by Kostya; reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=345
+
+	* src/pcf/pcfread.c (pcf_read_TOC): Limit number of TOC entries to
+	1024.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[psnames] Only declare, not define, data in `pstables.h' (#49949).
+
+	Pdfium includes `pstables.h' a second time; moving the definition
+	from `pstables.h' to `psmodule.c' saves more than 60kByte data
+	segment space for this case.
+
+	* src/tools/glnames.py (StringTable::dump,
+	StringTable::dump_sublist, dump_encoding, dump_array): Emit
+	additional code to only define tables if `DEFINE_PS_TABLES' is set.
+
+	* src/psnames/pstables.h: Regenerated.
+	* src/psnames/psmodule.c (DEFINE_PS_TABLES): Define.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Catch `blend' op in non-variant fonts.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=334
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>: Don't
+	allow `blend' op for non-variant fonts.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Better check of number of blends.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>,
+	src/cff/cffparse.c (cff_parse_blend): Compare number of blends with
+	stack size.
+
+2016-12-27  Werner Lemberg  <wl@gnu.org>
+
+	Documentation updates.
+
+	* docs/CHANGES: Add missing information.
+
+	* docs/formats.txt: Rewritten and updated.
+
+2016-12-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype, type1] Implement `FT_Get_Var_Design_Coordinates'.
+
+	* src/truetype/ttgxvar.c (TT_Get_Var_Design): Implement.
+	(TT_Set_Var_Design): Fix tracing.
+
+	* src/type1/t1load.c (T1_Get_Var_Design): Implement.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttpload.c (tt_face_load_hdmx): Ignore `version'.
+
+	Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit): Allow more version values.
+
+	Some fonts seem to have the `version' field in the wrong byte order.
+
+	Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttpload.c (tt_face_load_loca): Sanitize table length.
+
+	This trivial fix allows us to accept more fonts.
+
+	Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Fix tracing.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+	* CMakeLists.txt: Make it work with cmake 2.8.11.2 (#49909).
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+	Ensure used preprocessor symbols are defined (#49790).
+
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+	include/freetype/config/ftconfig.h: Check `__GNUC__', `__IBMC__',
+	and `__SUNPRO_C' correctly.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Check `count'.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=308
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Protect against invalid `vsindex' and `blend' values.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=305
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdVSINDEX,
+	cf2_cmdBLEND>: Implement it.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Always use Adobe CFF engine.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (FT_Global::FT_Global): Implement
+	it.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+
+	I should really stop coding late in the evening...
+
+	Thanks again to Ben for checking.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Support variation fonts.
+
+	(This ChangeLog entry was added later on.)
+
+	* src/autofit/afglobal.c (af_face_globals_free): Remove useless
+	code.
+
+	* src/base/ftmm.c (FT_Set_MM_Design_Coordinates,
+	* FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+	FT_Set_Var_Blend_Coordinates): Finalize
+	auto-hinter data to enforce recomputation.  Note that this is a
+	brute-force method which should be improved.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+
+	Don't apply deltas twice for non-phantom points.
+
+	Spotted by Ben Wagner.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Another try for #49829.
+
+	* src/cff/cffdrivr.c: Don't include
+	`FT_SERVICE_METRICS_VARIATIONS_H'.
+	(cff_get_advances): Use `ttface->variation_support'.
+
+	* src/truetype/ttdriver.c (tt_get_advances): Use
+	`ttface->variation_support'.
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+	load_truetype_glyph): Use `ttface->variation_support'.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[truetype, sfnt] Introduce font variation flags to `TT_Face'.
+
+	* include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
+	New macros describing available functionality of various OpenType
+	tables related to font variation.
+	(TT_Face): New fields `variation_support' and `mvar_support',
+	replacing and extending `use_fvar'.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face, sfnt_load_face): Use
+	`variation_support'.
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Set `variation_support'
+	field.
+	(TT_Vary_Apply_Glyph_Deltas): Updated.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+	[base] Improve sanity check for Mac resources (#49888).
+
+	* src/base/ftobjs.c (Mac_Read_sfnt_Resource): Abort if `rlen' is not
+	positive.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[base] More sanity checks for Mac resources.
+
+	We use
+
+	  https://github.com/kreativekorp/ksfl/wiki/Macintosh-Resource-File-Format
+
+	and
+
+	  https://developer.apple.com/legacy/library/documentation/mac/pdf/MoreMacintoshToolbox.pdf#page=151
+
+	as references.
+
+	* include/freetype/internal/ftrfork.h (FT_RFork_Ref): Use FT_Short
+	for `res_id'.
+
+	* src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Extract map length
+	and use it to improve sanity checks.
+	Follow the specification more closely;in particular, all data types
+	are signed, not unsigned.
+	(FT_Raccess_Get_DataOffsets): Follow the specification more closely;
+	in particular, all data types are signed, not unsigned.
+	Add some sanity checks.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Improve logic for getting fast advance widths.
+
+	* src/cff/cffdrivr.c (cff_get_advances), src/truetype/ttdriver.c
+	(tt_get_advances): Use `is_default_instance' for test; this gets
+	recomputed after changing blend coordinates.
+
+2016-12-20  Ben Wagner  <bungeman@google.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix linear metrics of GX variation fonts (#49829).
+
+	When asking for an unhinted non-default variations,
+	`linearVertAdvance' is currently the value from the `hmtx' table
+	instead of the actual value after applying the variation.  `HVAR'
+	support fixes this, but fonts will exist without that table and will
+	need sane fallback.
+
+	Problem also reported as
+
+	  https://bugs.chromium.org/p/skia/issues/detail?id=5917
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+	load_truetype_glyph): Implement linear advance adjustments if `HVAR'
+	or `VVAR' tables are missing.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Fast advance width retrieval for fonts with HVAR.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Don't handle MM.
+
+	* src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(cff_get_advances): Test for HVAR and VVAR.
+
+	* src/truetype/ttdriver.c (tt_get_advances): Test for HVAR and VVAR.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix invalid mac font recursion.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=304
+
+	* src/base/ftobjs.c (FT_Open_Face): Code moved to...
+	(ft_open_face_internal): ... this function.
+	Add a parameter to control whether we try special Mac font handling
+	in case of failure.
+	(FT_Open_Face, FT_New_Face, FT_New_Memory_Face,
+	open_face_from_buffer): Use `ft_open_face_internal'.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffobjs.c (cff_face_init): Make named instances work.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype, cff] Extend `get_var_blend' function of MM service.
+
+	In particular, we need access to named instance data.
+
+	* include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+	Add argument for `FT_MM_Var'.
+
+	* src/cff/cffload.c (cff_get_var_blend): Updated.
+	* src/cff/cffload.h: Updated.
+
+	* src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
+
+	* src/truetype/ttgxvar.c (tt_get_var_blend): Updated.
+	Accept value `NULL' for arguments.
+	* src/truetype/ttgxvar.h: Updated.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Handle `fvar' with zero axes as a non-MM font.
+
+	This is better behaviour than exiting with an error.
+
+	* include/freetype/internal/tttypes.h (TT_Face): Add `use_fvar'
+	field.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Compute `use_fvar', also
+	updating the validation code.
+	Use `use_fvar' to compute FT_FACE_FLAG_MULTIPLE_MASTERS.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Remove `fvar' validation
+	code.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	Minor GX code shuffling.
+
+	* include/freetype/internal/tttypes.h (TT_Face): Move
+	`is_default_instance' into TT_CONFIG_OPTION_GX_VAR_SUPPORT
+	block.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Updated.
+	* src/truetype/ttgload.c (IS_DEFAULT_INSTANCE): New macro.
+	(TT_Load_Glyph): Use it.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Better handling of non-CFF font formats.
+
+	* src/cff/cffload.c (cff_font_load): Pure CFFs don't have a
+	signature, so return `FT_Err_Unknown_File_Format' more often.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffload.c (cff_build_blend_vector): Remove redundant code.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttobjs.c (tt_face_init): Simplify conditional code.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Various sanitizing fixes.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): If the axis count in `fvar' is
+	zero, set `num_instances' to zero.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Handle `fvar' table with
+	zero axes as invalid.
+
+	* src/truetype/ttobjs.c (tt_face_init): Improve logic of loading
+	`loca', `cvt', `fpgm', and `prep' table.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+	Improve tracing of `FT_Open_Face'.
+
+	* src/base/ftobjs.c (FT_Open_Face): Return info on number of
+	available faces and numbered instances, or the indices of the
+	requested face and numbered instance.
+
+	* src/sfnt/sfobjs. (sfnt_open_font): Trace number of subfonts.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffload.c (cff_load_private_dict): Always init `blend'.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=295
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix `cvar' sanity test.
+
+	Reported by Dave Arnold.
+
+	* src/truetype/ttgxvar.c (tt_face_vary_cvt): Use tuple count mask.
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Remove compiler warnings; fix `make multi'.
+
+	* src/cff/cf2font.h: Include `cffload.h'.
+
+	* src/cff/cffload.c: Include FT_MULTIPLE_MASTERS_H and
+	FT_SERVICE_MULTIPLE_MASTERS_H.
+	(cff_vstore_load): Eliminate `vsSize'.
+	(cff_load_private_dict): Tag as `FT_LOCAL_DEF'.
+
+	* src/cff/cffload.h: Include `cffobjs.h'.
+	Provide declaration for `cff_load_private_dict'.
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Eliminate
+	`minorVersion' and `map_offset'.
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix heap buffer overflow (#49858).
+
+	* src/cff/cffparse.c (cff_parser_run): Add one more stack size
+	check.
+
+2016-12-15  Werner Lemberg  <wl@gnu.org>
+
+	Fix clang warnings.
+
+	* src/cff/cffload.c (cff_blend_doBlend): Add cast.
+	(cff_subfont_load): Set `error' correctly.
+
+	* src/sfnt/ttmtx.c (tt_face_get_metrics): Typo.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Implement CFF2 support (2/2).
+
+	The font variation code.  All parts dependent on the GX code in the
+	`truetype' module are guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+	In other words, you can still compile the `cff' module without
+	defining TT_CONFIG_OPTION_GX_VAR_SUPPORT (which brings you CFF2
+	support without font variation).
+
+	* src/cff/cf2font.c (cf2_font_setup): Add support for font
+	variation.
+	* src/cff/cf2font.h (CF2_Font): Add fields for variation data.
+
+	* src/cff/cf2ft.c (cf2_free_instance): Free blend data.
+	(cf2_getVStore, cf2_getNormalizedVector): New functions.
+	* src/cff/cf2ft.h: Updated.
+
+	* src/cff/cf2intrp.c: Include `cffload.h'.
+	(cf2_cmdRESERVED_15, cf2_cmdRESERVED_16): Replace with...
+	(cf2_cmdVSINDEX, cf2_cmdBLEND): ... this new enum values.
+	(cf2_doBlend): New function.
+	(cf2_interpT2CharString): Handle `vsindex' and `blend' opcodes.
+
+	* src/cff/cffload.c (FT_fdot14ToFixed): New macro.
+	(cff_vstore_done, cff_vstore_load): New functions.
+	(cff_blend_clear, cff_blend_doBlend, cff_blend_build_vector,
+	cff_blend_check_vector): New functions.
+	(cff_load_private_dict): Add arguments for blend vector.
+	Handle blend data.
+	(cff_subfont_load, cff_subfont_done): Updated.
+	(cff_font_load): Handle CFF2 variation store data.
+	(cff_font_done): Updated.
+	* src/cff/cffload.h: Include `cffparse.h'.
+	Updated.
+
+	* src/cff/cffobjs.c (cff_face_done): Updated.
+
+	* src/cff/cffparse.c: Include `cffload.h'.
+	(cff_parse_num): Handle internal value 255.
+	(cff_parse_vsindex, cff_parse_blend): New functions.
+	(CFF_FIELD_BLEND): New macro.
+	(cff_parser_run): Updated.
+	* src/cff/cffparse.h (cff_kind_blend): New enum value.
+
+	* src/cff/cfftoken.h: Handle `vstore', `vsindex', and `blend'
+	dictionary values.
+
+	* src/cff/cfftypes.h (CFF_VarData, CFF_AxisCoords, CFF_VarRegion,
+	CFF_VStore, CFF_Blend): New structures.
+	(CFF_FontRecDict): Add `vstore_offset' field.
+	(CFF_Private): Add `vsindex' field.
+	(CFF_SubFont): Add fields for blend data.
+	(CFF_Font): Add `vstore' field.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): `CFF2' is equal to `gvar',
+	since glyph variation data is directly embedded.
+	(TT_Set_MM_Blend): Don't load `gvar' table for CFF2 fonts.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Implement CFF2 support (1/2).
+
+	This commit does not contain the blend code for font variation
+	support, which follows in another commit.
+
+	You should ignore whitespace while inspecting this commit.
+
+	* include/freetype/internal/tttypes.h (TT_Face): Add `isCFF2'
+	member.
+
+	* src/cff/cf2font.h (CF2_Font): Add `isCFF2' member.
+
+	* src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Handle `isCFF2'
+	flag.
+	(cf2_getMaxstack): New function.
+	* src/cff/cf2ft.h: Updated.
+
+	* src/cff/cf2intrp.c (cf2_escRESERVED_38): New enum.
+	(cf2_interpT2CharString): Handle CFF2 differences.
+	Add tracing message for errors.
+
+	* src/cff/cffdrivr.c (cff_get_glyph_name, cff_get_name_index):
+	Update for CFF2.
+
+	* src/cff/cffload.c (FT_FIXED_ONE): New macro.
+	(cff_index_init, cff_index_load_offsets, cff_index_access_element,
+	cff_index_get_name, cff_ft_select_get, cff_load_private_dict,
+	cff_subfont_load, cff_font_load): Handle CFF2.
+	* src/cff/cffload.h: Updated.
+
+	* src/cff/cffobjs.c (cff_face_init): Handle CFF2.
+
+	* src/cff/cffparse.c (cff_parse_maxstack): New function.
+	(CFFCODE_TOPDICT, CFFCODE_PRIVATE): Removed
+	* src/cff/cffparse.h (CFF2_MAX_STACK, CFF2_DEFAULT_STACK): New
+	macros.
+	(CFF2_CODE_TOPDICT, CFF2_CODE_FONTDICT, CFF2_CODE_PRIVATE): New
+	macros.
+
+	* src/cff/cfftoken.h: Add fields for CFF2 dictionaries (but no blend
+	stuff).
+
+	* src/cff/cfftypes.h (CFF_Index): Add `hdr_size' field.
+	(CFF_FontRecDict): Add `maxstack' field.
+	(CFF_Private): Add `subfont' field.
+	(CFF_Font): Add `top_dict_length' and `cff2' fields.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Handle `CFF2' table.
+
+2016-12-15  Werner Lemberg  <wl@gnu.org>
+	    Dave Arnold  <darnold@adobe.com>
+
+	[truetype] Provide HVAR advance width variation as a service.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Prevent
+	double adjustment of advance width.
+
+	* src/sfnt/ttmtx.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(tt_face_get_metrics): Apply metrics variations.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Provide function to apply `HVAR' advance width variation.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* src/truetype/ttgxvar.c (tt_hadvance_adjust): New function.
+	* src/truetype/ttgxvar.h: Updated.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add `HVAR' table parsing.
+
+	Note that this is not complete yet; it only handles advance width
+	variation.
+
+	Activation of the code follows in another commit.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* include/freetype/ftmm.h (FT_Var_Named_Style): Add `psid' member.
+
+	* src/truetype/ttgxvar.h (GX_HVarData, GX_AxisCoords, GX_HVarRegion,
+	GX_HVStore, GX_WidthMap): New auxiliary structures for...
+	(GX_HVarTable): ... HVAR main structure.
+	(GX_BlendRec): Add data for HVAR loading.
+
+	* src/truetype/ttgxvar.c (FT_FIXED_ONE, FT_fdot14ToFixed,
+	FT_intToFixed, FT_fixedToInt): New macros.
+	(ft_var_load_hvar): New function.
+	(TT_Get_MM_Var): Updated.
+	(tt_done_blend): Deallocate HVAR data.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Extend number parsing.
+
+	The forthcoming CFF2 support needs a dynamic parsing limit.
+
+	* src/cff/cffparse.c (cff_parse_num, do_fixed, cff_parse_fixed,
+	cff_parse_fixed_scaled, cff_parse_fixed_dynamic): Add argument for
+	parser.
+	(cff_parse_font_matrix, cff_parse_font_bbox, cff_parse_private_dict,
+	cff_parse_multiple_master, cff_parse_cid_ros, cff_parser_run): Updated.
+
+	* src/cff/cffparse.h (cff_parse_num): Export locally.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+
+	[cff] Implement dynamic stack size for Adobe engine.
+
+	This also adds `cf2_stack_setReal' and `cf2_stack_pop', needed for
+	the forthcoming CFF2 support.
+
+	* src/cff/cf2stack.c (cf2_stack_init): Add argument for stack size.
+	(cf2_stack_free): Deallocate stack.
+	(cf2_stack_count, cf2_stack_pushInt, cf2_stack_pushFixed,
+	cf2_stack_popInt, cf2_stack_popFixed, cf2_stack_getReal,
+	cf2_stack_clear): Updated.
+	(cf2_stack_setReal, cf2_stack_pop): New functions.
+
+	* src/cff/cf2stack.h (CF2_Stack): Add `stackSize' member.
+	Update function declarations.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString): Updated.
+
+	* src/cff/cffparse.c (cff_parser_init): Add parameter for stack
+	size; return error code.
+	(cff_parser_done): New function.
+	(cff_parser_run): Updated.
+
+	* src/cff/cffparse.h (CFF_Parser): Add `stackSize' member and make
+	`stack' a pointer.
+	Update function declarations.
+
+	* src/cff/cffload.c (cff_load_private_dict, cff_subfont_load):
+	Updated.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[cff] Code shuffling.
+
+	* src/cff/cfftypes.h (CFF_Font): Add `library' and `base_offset'
+	fields.
+
+	* src/cff/cffload.c (cff_subfont_load): Change last argument to
+	`CFF_Font'
+	Split off parsing of private dictionary into...
+	(cff_load_private_dict): ...this new function.
+	(cff_font_load): Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Add framework for Metrics Variations service.
+
+	No effect yet; service functions will be implemented later on.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* include/freetype/internal/services/svmetric.h: New file.
+
+	* include/freetype/internal/ftserv.h
+	(FT_SERVICE_METRICS_VARIATIONS_H): New macro.
+
+	* include/freetype/internal/tttypes.h (TT_Face): New field `var'.
+
+	* src/sfnt/sfobjs.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(sfnt_init_face): Initialize `face->var'.
+
+	* src/truetype/ttdriver.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(tt_service_metrics_variations): New service.
+	(tt_services): Updated.
+
+	* src/truetype/ttpic.h: Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Add Multiple Masters service.
+
+	The code simply uses the MM functions from the `truetype' module.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* include/freetype/internal/tttypes.h (TT_Face): New field `mm'.
+
+	* src/cff/cffdrivr.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
+	(cff_set_mm_blend, cff_get_mm_blend, cff_get_mm_var,
+	cff_set_var_design, cff_get_var_design): New functions.
+	(cff_service_multi_masters): New service.
+	(cff_services): Updated.
+
+	* src/cff/cffload.c (cff_get_var_blend, cff_done_blend): New
+	functions.
+	* src/cff/cffload.h: Updated.
+
+	* src/cff/cffpic.h (CFF_SERVICE_MULTI_MASTERS_GET): New macro.
+
+	* src/sfnt/sfobjs.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
+	(sfnt_init_face): Initialize `face->mm'.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+	Extend functionality of `ft_module_get_service'.
+
+	It can now differentiate between local and global searches.
+
+	* src/base/ftobjs.c (ft_module_get_service): Add `global' argument.
+	(FT_Get_TrueType_Engine_Type): Updated.
+
+	* src/cff/cffdrivr.c (cff_get_ps_name, cff_get_cmap_info): Updated.
+
+	* include/freetype/internal/ftobjs.h: Updated.
+	* include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE):
+	Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_get_var_blend): Fix compiler warning.
+
+2016-12-14  Dave Arnold  <darnold@adobe.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, cff] Minor preparations.
+
+	* include/freetype/tttags.h (TTAG_CFF2, TTAG_HVAR, TTAG_MVAR,
+	TTAG_VVAR): New SFNT table tags.
+
+	* src/cff/cf2fixed.h (CF2_FIXED_ONE, CF2_FIXED_EPSILON): Add cast.
+
+2016-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype, type1] Add `get_var_blend' to MM service.
+
+	For internal use; we want to share code between the forthcoming CFF2
+	support and TrueType.
+
+	* include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+	New typedef.
+	(MultiMasters): Add `get_var_blend'.
+	(FT_Service_MultiMasters): Updated.
+
+	* src/truetype/ttgxvar.c (tt_get_var_blend): New function.
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
+	* src/type1/t1driver.c (t1_service_multi_masters): Updated.
+
+2016-12-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype, type1] Add `done_blend' to MM service.
+
+	For internal use; we want to share code between the forthcoming CFF2
+	support and TrueType.
+
+	* include/freetype/internal/services/svmm.h (FT_Done_Blend_Func):
+	New typedef.
+	(MultiMasters): Add `done_blend'.
+	(FT_Service_MultiMasters): Updated.
+
+	* src/truetype/ttgxvar.c (tt_done_blend): Use `TT_Face' as argument.
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/truetype/ttobjs.c (TT_Face_Done): Updated.
+
+	* src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
+	* src/type1/t1driver.c (t1_service_multi_masters): Updated.
+
+2016-12-09  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Revert change from 2016-12-08.
+
+	I missed the functionality of `ft_module_get_service', which makes
+	the change unnecessary.
+
+2016-12-08  Werner Lemberg  <wl@gnu.org>
+
+	Add framework to support services with 8 functions.
+
+	We will need this for CFF variation font support.
+
+	* include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC8):
+	New macro.
+
+2016-12-08  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Add `get_glyph_name' and `get_name_index' to SFNT interface.
+
+	CFF2 fonts will need access to those two functions.
+
+	* include/freetype/internal/sfnt.h: Include FT_SERVICE_GLYPH_DICT_H.
+	(SFNT_Interface): Add `get_glyph_name' and `get_name_index' members.
+	(FT_DEFINE_SFNT_INTERFACE): Updated.
+
+	* src/sfnt/sfdriver.c (sfnt_get_glyph_name, sfnt_get_name_index):
+	Fix signatures to exactly correspond to the glyph dict service
+	function typedefs.
+	(sfnt_interface): Updated.
+
+2016-12-06  Dave Arnold  <darnold@adobe.com>
+
+	Add `FT_Get_Var_Design_Coordinates' function.
+
+	Note that the low-level functions aren't implemented yet.
+
+	* include/freetype/ftmm.h: Declare.
+
+	* include/freetype/internal/services/svmm.h
+	(FT_Get_Var_Design_Func): New typedef.
+	(MultiMasters): New MM service function `get_var_design'.
+	(FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
+	Update all callers.
+
+	* src/base/ftmm.c (FT_Get_Var_Design_Coordinates): Implement.
+
+	* src/truetype/ttdriver.c: Updated.
+
+	* src/truetype/ttgxvar.c (TT_Get_Var_Design): New dummy function to
+	handle `get_var_design' service.
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/type1/t1driver.c: Updated.
+
+	* src/type1/t1load.c (T1_Get_Var_Design): New dump function to
+	handle `get_var_design' service.
+	* src/type1/t1load.h: Updated.
+
+2016-12-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1load.c (parse_subrs): Fix memory leak.
+
+	The `subrs' keyword might erroneously occur multiple times.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=231
+
+2016-12-01  Werner Lemberg  <wl@gnu.org>
+
+	[gzip] Improve building with external zlib (#49673).
+
+	Building FreeType with external zlib 1.2.8 makes msvc 14 stop with
+	the following error.
+
+	  ftgzip.c
+	  zlib-1.2.8\zlib.h(86): error C2061:
+	                         syntax error: identifier 'z_const'
+	  zlib-1.2.8\zlib.h(94): error C2054:
+	                         expected '(' to follow 'z_const'
+	  zlib-1.2.8\zlib.h(94): error C2085:
+	                         'msg': not in formal parameter list
+	  ...
+	  zlib-1.2.8\zlib.h(877): fatal error C1003:
+	                          error count exceeds 100; stopping compilation
+
+	The error happens because FreeType keeps an own copy of zlib-1.1.4
+	under `src/gzip'.  When building `src/gzip/ftgzip.c' with
+	FT_CONFIG_OPTION_SYSTEM_ZLIB defined, it uses
+
+	  #include <zlib.h>
+
+	which correctly finds an external `zlib.h', but `zlib.h' itself has
+	a line
+
+	  #include "zconf.h"
+
+	which makes Visual Studio 2015 find `src/gzip/zconf.h' while
+	compiling the files in `src/gzip'.
+
+	* src/gzip/zconf.h: Rename to...
+	* src/gzip/ftzconf.h: ... this.
+	* src/gzip/zlib.h, src/gzip/rules.mk (GZIP_DRV_SRCS): Updated.
+
+2016-12-01  Oleksandr Chekhovskyi  <oleksandr.chekhovskyi@gmail.com>
+
+	[autofit] Fix Emscripten crash (patch #9180).
+
+	Function calls through pointers must use a matching signature to
+	work on Emscripten, since such calls are dispatched through lookup
+	tables grouped by signature.
+
+	* src/autofit/aftypes.h (AF_WritingSystem_ApplyHintsFunc): Fix
+	typedef.
+
+2016-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Revert previous commit.  Already fixed with 6ca54c64.
+
+2016-11-29  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Avoid conditional jump on uninitialized value (#49711).
+
+	* src/smooth/ftgrays.c (gray_raster_render): Initialize `worker'.
+
+2016-11-27  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[autofit] Code shuffling.
+
+	Also improve some comments and remove unused code.
+
+	No functional change.
+
+	* src/autofit/afloader.c (af_loader_load_g): Merged with...
+	(af_loader_load_glyph): ...this function.
+	Split off emboldening code into...
+	(af_loader_embolden_glyph_in_slot): ... this function.
+
+2016-11-17  Werner Lemberg  <wl@gnu.org>
+
+	Better support of LLP64 systems with gcc (and clang).
+
+	* builds/unix/configure.raw: Call `AC_TYPE_LONG_LONG_INT'.
+
+	* builds/unix/ftconfig.in (FT_LONG64): Enable for LLP64 systems (and
+	suppress warnings) even without `FT_CONFIG_OPTION_FORCE_INT64'.
+
+2016-11-10  Werner Lemberg  <wl@gnu.org>
+
+	Fix `lcd_weights' array size.
+
+	* include/freetype/internal/ftobjs.h (FT_LibraryRec): Do it.
+
+	Reported by Nikolaus.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (FT_Render_Glyph_Internal): Fix tracing.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve FT_LOAD_BITMAP_METRICS_ONLY for `sbix' format.
+
+	It's unavoidable to call the PNG engine, but to get the metrics it
+	is sufficient to read the PNG image's header only.
+
+	* src/sfnt/pngshim.c (Load_SBit_Png): Add argument to control the
+	allocation of the glyph slot.
+	* src/sfnt/pngshim.h: Updated.
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_png,
+	tt_face_load_sbix_image, tt_face_load_sbit_image): Updated.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Speed up `sbix' lookup.
+
+	This also fixes a bug introduced in 2016-10-01 which prevents
+	display of embedded bitmap fonts that use the `sbix' format.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit): Store `sbix' size and
+	offset also in `ebdt_size' and `ebdt_start', respectively.  This
+	makes the test for an embedded bitmap data table succeed for this
+	format.
+
+	(tt_face_load_strike_metrics) <TT_SBIT_TABLE_TYPE_SBIX>: Use
+	`ebdt_size' and `ebdt_start'
+	(tt_face_load_sbix_image): Ditto.
+
+2016-11-06  Seigo Nonaka  <nona@google.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Introduce a way of quickly retrieving (embedded) bitmap metrics.
+
+	`FT_Load_Glyph' doesn't generate a bitmap for a non-bitmap glyph
+	until the user calls `FT_Render_Glyph'.  However, it always
+	allocates memory for bitmaps and copies or decodes the contents of a
+	bitmap glyph, which can be quite slow for PNG data.
+
+	* include/freetype/freetype.h (FT_LOAD_BITMAP_METRICS_ONLY): New
+	macro.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Unset FT_LOAD_RENDER if
+	FT_LOAD_BITMAP_METRICS_ONLY is used.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_alloc_bitmap,
+	tt_sbit_decoder_load_bitmap): Add argument to control allocation of
+	the glyph slot.
+	(tt_sbit_decoder_load_image, tt_sbit_decoder_load_compound,
+	tt_face_load_sbit_image): Updated.
+
+	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Quickly exit if
+	`FT_LOAD_BITMAP_METRICS_ONLY' is set.
+
+	* src/pfr/pfrsbit.c, src/pfr/pfrsbit.h (pfr_slot_load_bitmap): Add
+	argument to control allocation of the glyph slot.
+	* src/pfr/pfrobjs (pfr_slot_load): Updated.
+
+	* src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto.
+
+	* docs/CHANGES: Updated.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+	Synchronize with gnulib (#49448).
+
+	* include/freetype/config/ftconfig.h, builds/unix/ftconfig.in,
+	builds/vms/ftconfig.h (FT_TYPEOF): Update code to use definition in
+	current version of `intprops.h'.
+	Other minor synchronization to reduce code differences between the
+	three files.
+
+2016-11-03  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Clamp variation requests to valid range.
+
+	This is required by OpenType 1.8; it also avoids rounding surprises.
+
+	* src/truetype/ttgxvar.c (TT_Set_Var_Design): Clamp design coordinates
+	outside of the allowed range to always stay within the range instead
+	of producing an error.
+
+2016-10-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Remove clang warnings.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): Using `FT_ULong' for
+	loop counter handling.
+
+	* src/truetype/ttinterp.c: Updated.
+	(Ins_SCANTYPE): Use signed constant.
+	(TT_RunIns): Ensure `num_twilight_points' is 16bit.
+
+2016-10-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix commit from 2014-11-24.
+
+	Problem reported by Hin-Tak Leung  <htl10@users.sourceforge.net>.
+
+	* src/truetype/ttpload.c (tt_face_load_hdmx): Fix file checking
+	logic.
+
+2016-10-26  Werner Lemberg  <wl@gnu.org>
+
+	Add `FT_Get_{MM,Var}_Blend_Coordinates' functions.
+
+	* include/freetype/ftmm.h: Declare.
+
+	* include/freetype/internal/services/svmm.h (FT_Get_MM_Blend_Func):
+	New typedef.
+	(MultiMasters): New MM service function `get_mm_blend'.
+	(FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
+	Update all callers.
+
+	* src/base/ftmm.c (FT_Get_MM_Blend_Coordinates,
+	FT_Get_Var_Blend_Coordinates): Implement.
+
+	* src/truetype/ttdriver.c: Updated.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Blend): New function to handle
+	`get_mm_blend' service.
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/type1/t1driver.c: Updated.
+
+	* src/type1/t1load.c (T1_Get_MM_Blend): New function to handle
+	`get_mm_blend' service.
+	* src/type1/t1load.h: Updated.
+
+	* docs/CHANGES: Document.
+
+2016-10-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/type1/t1load.c (parse_subrs): Fix limit check.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=81
+
+2016-10-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[cff] Correct cmap format reporting (#24819).
+
+	* src/cff/cffdrivr.c (cff_get_cmap_info): Throw an error on synthetic
+	charmap instead of guessing its format and language.
+
+2016-10-22  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix SCANTYPE instruction (#49394).
+
+	* src/truetype/ttinterp.c (Ins_SCANTYPE): Only use lower 16bits.
+
+2016-10-22  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve handling of invalid post 2.5 tables [#49393].
+
+	* src/sfnt/ttpost.c (load_format_25): We need at least a single
+	table entry.
+
+2016-10-14  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix handling of `cvar' table data.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=53
+
+	* src/truetype/ttgxvar.c (tt_face_vary_cvt): Ignore invalid CVT
+	indices.
+
+2016-10-11  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Fix handling of invalid flex subrs.
+
+	Problem reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=52
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+	<op_callothersubr>: Set `flex_state' after error checking.
+
+2016-10-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_done_blend): Fix deallocation.
+
+2016-10-08  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidload.c (cid_face_open): Properly propagate `error'.
+
+2016-10-08  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Fix parsing of subr offsets.
+
+	Bug introduced 2016-05-16.
+
+	* src/cid/cidparse.c (cid_parser_new): Fix off-by-one error.
+
+2016-10-01  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Disable bitmap strikes if we don't have a bitmap data table.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbit): Check whether we have
+	a bitmap data table.
+
+2016-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Remove impossibility.
+
+	* src/smooth/ftgrays.c (TWorker): Rearrange fields.
+	(gray_convert_glyph): Remove impossible condition and clean up.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Enrich family name with foundry name and glyph width info.
+
+	This is a very old patch from openSuSE (from 2006, submitted to
+	FreeType in 2011) that I forgot to apply.
+
+	  https://build.opensuse.org/package/view_file/openSUSE:Factory/freetype2/freetype2-bitmap-foundry.patch
+
+	Prepend the foundry name plus a space to the family name.  There are
+	many fonts just called `Fixed' which look completely different, and
+	which have nothing to do with each other.  When selecting `Fixed' in
+	KDE or Gnome one gets results that appear rather random, the style
+	changes often if one changes the size and one cannot select some
+	fonts at all.
+
+	We also check whether we have `wide' characters; all put together,
+	we get family names like `Sony Fixed' or `Misc Fixed Wide'.
+
+	* src/pcf/pcfread.c (pcf_load_font): Implement it.
+
+	* docs/CHANGES: Document it.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Speed up.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Don't
+	check for embedded bitmaps if we have a non-default instance.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Disallow bitmap strikes for non-default instances.
+
+	Also speed up access of default instances if GX variations are
+	active.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Add
+	`is_default_instance' member.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Initialize
+	`is_default_instance'.
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+	load_truetype_glyph): Add test for default instance.
+	(TT_Load_Glyph): Load embedded bitmaps for default instance only.
+
+	* src/truetype/ttgxvar.c (TT_Set_MM_Blend): Compute
+	`is_default_instance'.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Clean up `TT_Face' structure.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
+	fields `horz_metrics' and `vert_metrics'.
+	Update documentation.
+
+	* src/sfnt/sfobjs.c (sfnt_done_face): Updated.
+
+2016-09-28  Werner Lemberg  <wl@gnu.org>
+
+	More FT_ZERO usage.
+
+	* src/gxvalid/gxvcommn.c (gxv_ClassTable_validate):
+	s/ft_memset/FT_MEM_ZERO/.
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstrings):
+	s/ft_memset/FT_ARRAY_ZERO/.
+
+	* src/raster/ftraster.c (FT_ZERO): Define.
+	(ft_black_new): Use it.
+	* src/raster/ftrend1.c (ft_raster1_get_cbox):
+	s/FT_MEM_ZERO/FT_ZERO/.
+
+	* src/smooth/ftgrays.c (FT_ZERO): Define.
+	(gray_raster_new): Use it.
+	* src/smooth/ftsmooth.c (ft_smooth_get_cbox):
+	s/FT_MEM_ZERO/FT_ZERO/.
+
+2016-09-28  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/FT_MEM_ZERO/FT_ZERO/ where appropriate.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Trace number of executed opcodes.
+
+	* src/truetype/ttinterp.c (TT_RunIns): Implement it.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Speed up `TT_Load_Glyph'.
+
+	This avoids additional calls to `tt_face_lookup_table' for the
+	`glyf' table, which can be expensive.
+
+	* include/freetype/internal/tttypes.h (TT_LoaderRec): Move
+	`glyf_offset' field to ...
+	(TT_FaceRec): ... this structure.
+	* src/truetype/ttgload.c (load_truetype_glyph): Updated.
+	(tt_loader_init): Move initialization of `glyf_offset' to ...
+	* src/truetype/ttpload.c (tt_face_load_loca): ... this function.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Introduce dynamic limits for some bytecode opcodes.
+
+	This speeds up FreeType's handling of malformed fonts.
+
+	* src/truetype/ttinterp.c (TT_RunIns): Set up limits for the number
+	of twilight points, the total number of negative jumps, and the
+	total number of loops in LOOPCALL opcodes.  The values are based on
+	the number of points and entries in the CVT table.
+	(Ins_JMPR): Test negative jump counter.
+	(Ins_LOOPCALL): Test loopcall counter.
+
+	* src/truetype/ttinterp.h (TT_ExecContext): Updated.
+
+	* docs/CHANGES: Updated.
+
+2016-09-25  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Sanitize only last entry of `loca' table.
+
+	Without this patch, a loca sequence like `0 100000 0 100000 ...',
+	where value 100000 is larger than the `glyf' table size, makes
+	FreeType handle the whole `glyf' table as a single glyph again and
+	again, which is certainly invalid (and can be very slow, too).
+
+	* src/truetype/ttpload.c (tt_face_get_location): Implement.
+	Improve tracing messages.
+
+2016-09-25  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Fix typo.
+
+2016-09-24  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Tracing fixes.
+
+	* src/autofit/afmodule.c (af_autofitter_load_glyph): Call dumping
+	functions only if we actually do tracing.
+
+2016-09-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Reduce divisions in the line renderer.
+
+	We don't need some divisions if a line segments stays within a single
+	row or a single column of pixels.
+
+	* src/smooth/ftgrays.c (gray_render_line) [FT_LONG64]: Make divisions
+	conditional.
+
+2016-09-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_sweep): Remove check for empty table.
+
+2016-09-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Another tiny speed-up.
+
+	* src/smooth/ftgrays.c (gray_find_cell): Merge into...
+	(gray_record_cell): ... this function.
+
+2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_{find,set}_cell): Remove dubious code.
+
+2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Fix valgrind warning and reoptimize.
+
+	The algorithm calls `gray_set_cell' at the start of each new contour
+	or when the contours cross the cell boundaries. Double-checking for
+	that is wasteful.
+
+	* src/smooth/ftgrays.c (gray_set_cell): Remove check for a new cell.
+	(gray_convert_glyph): Remove initialization introduced by 44b172e88.
+
+2016-09-10  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix previous commit.
+
+	Problems reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40
+
+	We now map the strike index right before accessing the physical
+	data, not earlier.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Set `face->sbit_strike_map'
+	after creating the map so that...
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics): ... this function
+	can be used before and after setting up `sbit_strike_map'.
+	(tt_face_set_sbit_strike): Revert change.
+	(tt_sbit_decoder_init, tt_face_load_sbix_image): Map strike index.
+
+	* src/truetype/ttdriver.c (tt_size_select): Revert change.
+
+2016-09-09  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Minor improvements.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Ignore
+	invalid strikes.
+	Use better values for call to `FT_Set_Char_Size'.
+
+2016-09-09  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Don't provide (completely) broken strike data.
+
+	FreeType tries to sanitize strike header data; we now reject
+	completely broken ones.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): New
+	`sbit_strike_map' array pointer.
+
+	* src/base/ftobjs.c (FT_Match_Size): Reject matches where either
+	width or height would be zero.
+	Add tracing message in case of error.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Populate `sbit_strike_map',
+	only using (more or less) valid strike header data for
+	FT_Face's `available_sizes' array.
+	(sfnt_done_face): Updated.
+
+	* src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use
+	`sbit_strike_map'.
+	(tt_face_load_strike_metrics): Improve tracing.
+
+	* src/truetype/ttdriver.c (tt_size_select): Use `sbit_strike_map'.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.7 released.
+	=======================
+
+
+	Tag sources with `VER-2-7'.
+
+	* docs/VERSION.TXT: Add entry for version 2.7.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.6.5/2.7/, s/265/27/.
+
+	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 7.
+	(FREETYPE_PATCH): Set to 0.
+
+	* builds/unix/configure.raw (version_info): Set to 18:6:12.
+	* CMakeLists.txt (VERSION_MINOR): Set to 7.
+	(VERSION_PATCH): Set to 0.
+
+	* docs/CHANGES: Updated.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c: Include `ttgxvar.h'.
+
+	This fixes the `multi' build.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Another improvement to Armenian support.
+
+	Suggested by Hrant H Papazian <hpapazian@gmail.com>.
+
+	* src/autofit/afscript.h: Use better suited characters to derive
+	default stem widths.
+
+2016-09-07  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_hline): Micro-optimize.
+
+2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Operate in absolute bitmap coordinates.
+
+	Simpler bitmap addressing improves performance by 1.5%.
+
+	* src/smooth/ftgrays.c (gray_TWorker): Remove count fields.
+	(gray_dump_cells, gray_find_cell, gray_set_cell, gray_hline,
+	gray_sweep, gray_convert_glyph, gray_raster_render): Updated.
+
+2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Improve contour start (take 2).
+
+	* src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
+	instead of...
+	(gray_start_cell): ... this function, which is removed.
+	(gray_convert_glyph): Make initial y-coordinate invalid.
+
+2016-09-06  Werner Lemberg  <wl@gnu.org>
+
+	[type1] MM fonts support exactly zero named instances (#48748).
+
+	* src/type1/t1load.c (T1_Get_MM_Var): Set `num_namedstyles' to zero.
+
+2016-09-06  Jonathan Kew  <jfkthame@gmail.com>
+
+	[cff] Fix uninitialized memory.
+
+	Problem reported as
+
+	  https://bugzilla.mozilla.org/show_bug.cgi?id=1270288
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString): Initialize `storage'
+	array to handle a `get' opcode without a previous `put'.
+
+2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_move_to, gray_start_cell): Revert.
+
+2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Improve contour start.
+
+	* src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
+	instead of...
+	(gray_start_cell): ... this function, which is removed.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix memory initialization.
+
+	* src/cff/cf2stack.c (cf2_stack_init): Use `FT_NEW'.  The `Q'
+	variants of FreeType's memory allocation macros don't do zeroing.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+	[ftrandom] Minor improvements.
+
+	* src/tools/ftrandom/ftrandom.c (_XOPEN_SOURCE): New macro, set to
+	500.
+
+	* src/tools/ftrandom/Makefile (CFLAGS): Split off include
+	directories to ...
+	(INCLUDES): ... this new variable.
+	(LDFLAGS): New variable.
+	(ftrandom.o, ftrandom): Updated.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve Armenian support.
+
+	Thanks to Hrant H Papazian <hpapazian@gmail.com> for help.
+
+	* src/autofit/afblue.dat (AF_BLUE_STRING_ARMENIAN_*): Improve
+	selection of characters.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+2016-09-04  Werner Lemberg  <wl@gnu.org>
+
+	[ftrandom] Improve Makefile.
+
+	It now supports both a normal build (`./configure && make') and a
+	development build (`make devel').
+
+	* src/tools/ftrandom/Makefile (VPATH): Set it so that
+	`libfreetype.a' gets searched in both `objs' (for the development
+	build) and `objs/.libs' (for a normal build which uses libtool).
+	(LIBS): Add missing libraries.
+	(ftrandom.o): New rule.
+	(ftrandom): Use automatic variables.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More fixes for handling of GX deltas.
+
+	Problems reported by Bob Taylor <Bob.Taylor@monotype.com>.
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix rough
+	sanity test for glyph variation array header size.
+	Always set stream position before reading packed x and y deltas.
+	Fix thinko w.r.t. `localpoints' array.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+	[ftrandom] Various fixes.
+
+	* src/tools/ftrandom/ftrandom.c (GOOD_FONTS_DIR): Provide better
+	default.
+	(error_fraction): Make it of type `double' to work as advertized –
+	this was completely broken.
+	Update all related code.
+	(error_count, fcnt): Make it unsigned to fix compiler warnings.
+	Update all related code.
+	(fontlist): Change `len' member to `long' to fix compiler warnings.
+	(FT_MoveTo, FT_LineTo, FT_ConicTo, FT_CubicTo, abort_test): Tag
+	unused variables.
+	(TestFace, FindFonts, copyfont, do_test): Fix compiler warnings.
+	(ExecuteTest): Ditto.
+	Call `FT_Done_FreeType'.
+	(getErrorCnt): Replace `ceil' with an ordinary cast to `unsigned
+	int'.
+	(usage): Improve output.
+	(main): Fix compiler warnings.
+
+	* src/tools/ftrandom/README: Updated.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+	[base] Avoid negative bitmap strike dimensions (#48985).
+
+	* src/base/ftobjs.c (FT_Open_Face): Check whether negation was
+	actually successful.  For example, this can fail for value
+	-32768 if the type is `signed short'.  If there are problems,
+	disable the strike.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Avoid null pointer passed to FT_MEM_COPY (#48984).
+
+	* src/cff/cffload.c (cff_index_get_name): Check `byte_len'.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+	[unix] Enable 64bit support in file system access (#48962).
+
+	* builds/unix/configure.raw: Call `AC_SYS_LARGEFILE'.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Avoid left shift of negative value (#48980).
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_bit_aligned): Use unsigned
+	constant.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+	* src/smooth/ftgrays.c (gray_hline): Fix clang compiler warnings.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+	Some preparations for the next release.
+
+	* include/freetype/config/ftoption.h
+	(TT_CONFIG_OPTION_SUBPIXEL_HINTING): Enable.
+
+	* docs/CHANGES: Updated.
+
+2016-09-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Simplify span rendering more.
+
+	It turns out that there is significant cost associated with `FT_Span'
+	creation and calls to `gray_render_span' because it happens so
+	frequently. This removes these steps from our internal use but leaves
+	it alone for `FT_RASTER_FLAG_DIRECT" to preserve API. The speed gain
+	is about 5%.
+
+	* src/smooth/ftgrays.c (gray_render_span): Removed. The code is
+	migrated to...
+	(gray_hline): ... here.
+
+2016-08-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Streamline pixmap drawing a bit more.
+
+	Zero coverage is unlikely (1 out of 256) to warrant checking. This
+	gives 0.5% speed improvement in rendering simple glyphs.
+
+	* src/smooth/ftgrays.c (gray_hline, gray_render_span): Remove checks.
+
+2016-08-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Streamline pixmap drawing.
+
+	This gives 2% speed improvement in rendering simple glyphs.
+
+	* src/smooth/ftgrays.c (TPixmap): Reduced pixmap descriptor with a
+	pointer to its bottom-left and pitch to be used in...
+	(gray_TWorker): ... here.
+	(gray_render_span): Move pixmap flow check from here...
+	(gray_raster_render): .. to here.
+
+2016-08-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Reduce stack of band boundaries.
+
+	* src/smooth/ftgrays.c (gray_TBand): Removed.
+	(gray_convert_glyph): Updated to stack band boundaries concisely.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/cid/cidload.c (cid_face_open): Improve handling of `SDBytes'.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[cid] Fix commit from 2016-05-16.
+
+	* src/cid/cidparse.c (cid_parser_new): Fix off-by-one errors.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Cache offset and size to bitmap data table.
+
+	This commit avoids `EBDT' and friends being looked up again and
+	again while loading a single embedded bitmap.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec)
+	[TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New fields `ebdt_start' and
+	`ebdt_size'.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_init): Move table lookup to ...
+	(tt_face_load_sbit): ... this function; also store the table size
+	and offset.
+
+2016-08-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_raster_render): Minor tweaks.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+	[type1] Fix heap buffer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36
+
+	* src/type1/t1load.c (parse_charstrings): Reject fonts that don't
+	contain glyph names.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix previous commit (#48901).
+
+	* src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Thinkos.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Speed up handling of invalid format 4 cmaps.
+
+	* src/sfnt/ttcmap.c (tt_cmap4_next, tt_cmap4_char_map_binary): Add
+	tests for `num_glyph' from `tt_cmap4_char_map_linear'.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/internal/ftdriver.h: Remove unused typedefs.
+
+2016-08-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Simplify span rendering.
+
+	This removes unnecessary complexity of span merging and buffering.
+	Instead, the spans are rendered as they come, speeding up the
+	rendering by about 5% as a result.
+
+	* src/smooth/ftgrays.c [FT_MAX_GRAY_SPANS]: Macro removed.
+	(gray_TWorker): Remove span buffer and related fields.
+	(gray_sweep, gray_hline): Updated.
+
+	* include/freetype/ftimage.h: Remove documentation note about
+	`FT_MAX_GRAY_SPANS', which was never in `ftoption.h' and is now gone.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix `MPS' instruction.
+
+	According to Greg Hitchcock, MPS in DWrite really returns the point
+	size.
+
+	* src/truetype/ttobjs.h (TT_SizeRec): Add `point_size' member.
+
+	* src/truetype/ttdriver.c (tt_size_request): Set `point_size'.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): Add `pointSize'
+	member.
+
+	* src/truetype/ttinterp.c (TT_Load_Context): Updated.
+	(Ins_MPS): Fix instruction.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+	[lzw] Optimize last commit.
+
+	* src/lzw/ftzopen.c (ft_lzwstate_get_code): Move check into
+	conditional clause.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+	[lzw] Avoid invalid left shift.
+
+	Reported as
+
+	  https://bugzilla.mozilla.org/show_bug.cgi?id=1295366
+
+	* src/lzw/ftzopen.c (ft_lzwstate_get_code): Limit `num_bits'.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+	[lzw] Avoid buffer overrun.
+
+	Reported as
+
+	  https://bugzilla.mozilla.org/show_bug.cgi?id=1273283
+
+	* src/lzw/ftzopen.c (ft_lzwstate_refill): Ensure `buf_size' doesn't
+	underflow.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix compiler warning.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Add cast.
+
+2016-08-13  Werner Lemberg  <wl@gnu.org>
+
+	[winfonts] Avoid zero bitmap width and height.
+
+	Reported as
+
+	  https://bugzilla.mozilla.org/show_bug.cgi?id=1272173
+
+	* src/winfonts/winfnt.c (FNT_Face_Init): Check zero pixel height.
+	(FNT_Load_Glyph): Check for zero pitch.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/truetype/ttinterp.c (Pop_Push_Count): Revert changes.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Minor and formatting.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/truetype/ttinterp.c (Pop_Push_Count): Fix some entries.
+
+2016-08-10  Peter Klotz  <Peter.Klotz@ith-icoserve.com>
+
+	* src/smooth/ftgrays.c (gray_hline): Fix uninitialized access.
+
+2016-08-10  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Use correct type for `italicAngle' field (#48732).
+
+	* src/sfnt/ttload.c (tt_face_load_post): Fix types.
+
+2016-08-06  Jon Spencer  <jon@jonspencer.ca>
+
+	[sfnt] Fix `FT_Get_Advance' for bitmap strikes.
+
+	`FT_Get_Advance' returns 0 for bitmap fonts.  It first gets the
+	advance value from the font table and then scales it by the
+	`font->size->metrics->x_scale' field.  But `FT_Select_Size' doesn't
+	set that value for bitmap fonts and the advance gets scaled to zero.
+
+	Taken from
+
+	  https://github.com/behdad/harfbuzz/issues/252
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
+	<TT_SBIT_TABLE_TYPE_EBLC>: Set scale values.
+
+2016-08-06  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Fix GX variation handling of composites.
+
+	* src/truetype/ttgload.c (load_truetype_glyph)
+	[TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Check `ARGS_ARE_XY_VALUES' flag.
+
+2016-08-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Minor refactoring.
+
+	* src/smooth/ftgrays.c (gray_render_scanline, gray_render_line):
+	Updated.
+
+2016-07-29  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Don't abort on invalid `maxComponentDepth'.
+
+	Since 2016-05-16 we detect infinite recursion directly.
+
+	* src/sfnt/ttload.c (tt_face_load_maxp): Don't adjust
+	`maxComponentDepth'.
+	* src/truetype/ttgload.c (load_truetype_glyph): Don't abort if
+	`maxComponentDepth' is not valid.  Instead, simply adjust its value
+	and emit a tracing message.
+
+2016-07-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_latin_metrics_scale_dim): Minor.
+
+	No functional change.
+
+2016-07-22  Hin-Tak Leung  <htl10@users.sourceforge.net>
+
+	[truetype] Record the end of IDEFs.
+
+	To match the logic in FDEF.  The value of the end is only used for
+	bound-checking in `Ins_JMPR', so it may not have been obvious that
+	it was not recorded.  Tested (as part of Font Validator 2.0) all the
+	fonts on Fedora and did not see any change.
+
+	* src/truetype/ttinterp.c (Ins_IDEF): Updated.
+
+2016-07-19  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Sanitizer fix, second try.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
+	tests and use only one slot more.
+
+2016-07-19  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Sanitizer fix.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Increase array
+	to fix nested loops.
+
+2016-07-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Make GETDATA work only for GX fonts.
+
+	* src/truetype/ttinterp.c (opcode_name): Updated.
+	(Ins_GETDATA): Only define for `TT_CONFIG_OPTION_GX_VAR_SUPPORT'.
+	(TT_RunIns): Updated.
+
+2016-07-17  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add support for Apple's
+
+	  GETDATA[], opcode 0x92
+
+	bytecode instruction.  It always returns 17, and we have absolutely
+	no idea what it is good for...
+
+	* src/truetype/ttinterp.c (Pop_Push_Count, opcode_name): Updated.
+	(Ins_GETDATA): New function.
+	(TT_RunIns): Add it.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add bytecode support for GX variation fonts.
+
+	This commit implements undocumented (but confirmed) stuff from
+	Apple's old bytecode engine.
+
+	  GETVARIATION[], opcode 0x91
+	    This opcode pushes normalized variation coordinates for all axes
+	    onto the stack (in 2.14 format).  Coordinate of first axis gets
+	    pushed first.
+
+	  GETINFO[], selector bit 3
+	    If GX variation support is enabled, bit 10 of the result is set
+	    to 1.
+
+	* src/truetype/ttinterp.c: Include FT_MULTIPLE_MASTERS_H.
+	(opcode_name) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
+	(Ins_GETINFO) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle selector
+	bit 3, checking support for variation glyph hinting.
+	(Ins_GETVARIATION) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New function
+	to implement opcode 0x91.
+	(TT_RunIns) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle opcode 0x91.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix GETINFO bytecode instruction.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO): Fix return value for
+	stretching information.
+
+2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Make all glyphs in `Zycon' GX font work.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
+	tests.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix GX delta tracing.
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Trace
+	relative point movements.
+
+2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] More fixes for GX.
+
+	This finally fixes the rendering of the cyclist and the lizard in
+	the `Zycon' font.
+
+	* src/truetype/ttgxvar.c (ft_var_readpackedpoints): `first' point
+	index is always cumulative.
+
+	(tt_handle_deltas): Rename to...
+	(tt_interpolate_deltas): ... This.
+	Add new parameter for output point array.
+	Update caller.
+
+	(TT_Vary_Apply_Glyph_Deltas): Add `points_out' array; it now holds
+	the intermediate results of `tt_interpolate_deltas' that are to be
+	added to `outline->points'.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Thinko.
+
+	`max_pos' is always larger than `min_pos' so `FT_ABS' is not needed.
+
+	Reported by Alexei.
+
+2016-07-16  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	* src/truetype/ttinterp.c (Ins_MIRP): Fix copy-and-paste error.
+
+	Problem reported by Hin-Tak Leung.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Update and improve segment and edge tracing.
+
+	* src/autofit/afhints.c (af_glyph_hints_dump_segments): Trace
+	`delta' also.
+	Don't show first point of segment as a replacement for `pos'; this
+	is (a) misleading, since the difference to `pos' can be almost
+	arbitrarily large in corner cases, and (b) it is better to have all
+	segment data in font units instead of a single value given in output
+	space coordinates.
+	Improve layout.
+	(af_glyph_hints_dump_edges): Show px->units and units->px conversion
+	values for convenience.
+	Improve layout.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] For edges, reject segments wider than 1px (#41334).
+
+	* src/autofit/afhints.h (AF_SegmentRec): New member `delta'.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Compute
+	`delta'.
+	(af_latin_hints_compute_edges): Reject segments with a delta larger
+	than 0.5px.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/freetype.h (FT_IS_NAMED_INSTANCE): New macro.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix `face_index' value in `FT_Face' for named instances.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Don't strip off higher 16bits.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix tracing.
+
+2016-07-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Fix gxvar delta interpolation.
+
+	The coordinates of the base font should be used for interpolation
+	purposes, NOT the current points (i.e., the result of accumulation
+	of previous deltas).
+
+	* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Initialize
+	`points_org' before looping over all tuples.
+
+
+----------------------------------------------------------------------------
+
+Copyright 2016-2018 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.
+
+
+Local Variables:
+version-control: never
+coding: utf-8
+End:
diff --git a/ChangeLog.28 b/ChangeLog.28
new file mode 100644
index 0000000..ca1ff38
--- /dev/null
+++ b/ChangeLog.28
@@ -0,0 +1,3136 @@
+2017-09-16  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.8.1 released.
+	=========================
+
+
+	Tag sources with `VER-2-8-1'.
+
+	* docs/VERSION.TXT: Add entry for version 2.8.1.
+	* docs/CHANGES: Updated.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.8/2.8.1/, s/28/281/.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+	* builds/unix/configure.raw (version_info): Set to 21:0:15.
+	* CMakeLists.txt (VERSION_PATCH): Set to 1.
+
+2017-09-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[sfnt] lowest gcc for vectors (e1d0249e) is changed to 4.7.
+
+	__builtin_shuffle() was introduced in gcc-4.7.  The lowest
+	gcc to enable vector operation is delayed from 4.6 to 4.7.
+
+	* src/sfnt/pngshim.c (premultiply_data): Fix cpp-macro to
+	enable the vector operation, to change the lowest gcc version
+	from 4.6 to 4.7.
+
+2017-09-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[cache] Fix a possible overflow by signed integer comparison.
+
+	Improve the code by 5d3ff05615dda6d1325ed612381a17a0df04c975 ,
+	issues are found by Behdad Esfahbod and Werner Lemberg.
+
+	* src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Replace
+	a subtraction to check higher bit by a bit operation,
+	and cpp-conditionalize for appropriate systems.  Add better
+	documentation to the comment.
+	(FTC_ImageCache_LookupScaler): Ditto.
+	(FTC_SBitCache_Lookup): Ditto.
+	(FTC_SBitCache_LookupScaler): Ditto.
+
+2017-09-13  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Really fix #41334 (#52000).
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_segments): Set
+	`segment->delta' everywhere.
+
+2017-09-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[autofit, sfnt] Fix for `make multi'.
+
+	* src/autofit/afshaper.c: Include FT_ADVANCE_H, to use
+	FT_Get_Advance() in it.
+	* src/sfnt/ttcmap.c: Include FT_SERVICE_POSTSCRIPT_CMAPS_H
+	to use PS_Unicodes in it, also include `ttpost.h' to use
+	tt_face_get_ps_name() in it.
+
+2017-09-11  Azzuro  <azzuro@team-mediaportal.com>
+
+	[build] Improve builds with different MS Visual Studio versions.
+
+	* builds/windows/vc2010/freetype.vcxproj: Switch platform toolset
+	according to the Visual Studio version.
+
+2017-09-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttkern.c (tt_face_load_kern): Reject format 2 tables.
+
+	Reported by Behdad.
+
+2017-09-09  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Improve communication with ftgrid.
+
+	* src/autofit/afhints.c (af_glyph_hints_get_segment_offset):
+	Provide values in font units.
+
+2017-09-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[base] Remove a check for resource ID in the resource fork driver.
+
+	LastResort.dfont has a marginal resource ID 0xFFFF for sfnt
+	resource.  Inside Macintosh: More Macintosh Toolbox, `Resource IDs'
+	(1-46), tells that some IDs are reserved and should not be used.
+	FreeType2 just uses resource ID to sort the fragmented resource.
+	To accept the marginal fonts, the checking is removed.
+
+	* src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Remove res_id
+	validity check, fix a trace message format.
+
+2017-09-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+	[sfnt, truetype] Register the tags for marginal fonts.
+
+	The first 32bit of standard TrueType variants is 0x00010000,
+	`OTTO', `ttcf', `true' or `typ1'.  2 marginal dfonts on legacy Mac
+	OS X, Keyboard.dfont and LastResort.dfont, have the sfnt resources
+	starting 0xA5 followed by `kbd' or `lst'.  Considering the following
+	data could be parsed as conventional TrueType fonts, the header
+	checking is updated to allow these tags.  It seems that recent Mac
+	OS X has already switched to normal TTF for these fonts.
+
+	See the discussion at
+	http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=3931.0
+
+	* include/freetype/tttags.h (TTAG_0xA5kbd, TTAG_0xA5lst): New header
+	tags for Keyboard.dfont and LastResort.dfont.
+	* src/sfnt/sfobjs.c (sfnt_open_font): Accept the sfnt resource
+	starts with TTAG_0xA5kbd or TTAG_0xA5lst.
+	* src/truetype/ttobjs.c (tt_face_init): Accept the face with the
+	format tag is TTAG_0xA5kbd or TTAG_0xA5lst.
+
+2017-09-05  Werner Lemberg  <wl@gnu.org>
+
+	Fix multiple calls of `FT_Bitmap_Convert'.
+
+	The documentation of `FT_Bitmap_Convert' says that multiple calls do
+	proper reallocation of the target FT_Bitmap object.  However, this
+	failed for the sequence
+
+	  non-empty bitmap
+	  empty bitmap
+	  non-empty bitmap
+
+	Reason was that `FT_Bitmap_Convert' only reallocated the bitmap
+	buffer if it became too small; it didn't make the buffer smaller.
+	For an empty bitmap following a non-empty one, only the buffer
+	dimension got set to zero, without deallocation.  If the next call
+	was a non-empty buffer again, an assertion in `ft_mem_qrealloc' was
+	triggered.
+
+	* src/base/ftbitmap.c (FT_Bitmap_Convert): Always reallocate target
+	buffer to the correct size.
+
+	* docs/CHANGES: Document it.
+
+2017-09-05  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Fix size and resolution handling.
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Use `SIZE' values if
+	`POINT_SIZE', `RESOLUTION_X', or `RESOLUTION_Y' properties are
+	missing.
+
+	* docs/CHANGES: Document it.
+
+2017-08-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	Swap `ALLOC_MULT' arguments (#51833).
+
+	* src/base/ftbitmap.c (ft_bitmap_assure_buffer): Updated.
+	* src/winfonts/winfnt.c (FNT_Load_Glyph): Updated.
+	* src/raster/ftrend1.c (ft_raster1_render): Updated.
+
+2017-08-23  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix clang compilation (#51788).
+
+	* src/sfnt/pngshim.c (premultiply_data): Use vectors instead of
+	scalars.
+	(vector_shuffle): New macro to take care of a different built-in
+	function name on clang.
+
+2017-08-22  Werner Lemberg  <wl@gnu.org>
+
+	[base] Don't zero out allocated memory twice (#51816).
+
+	Patch applied from bug report.
+
+	* src/base/ftutil.c (ft_mem_qrealloc): Use low-level allocation to
+	avoid unnecessary overhead.
+
+2017-08-22  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow.
+
+	Changes triggered by
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3107
+
+	* src/truetype/ttinterp.c (Ins_MDRP, Ins_MIRP, Ins_ALIGNPTS): Use
+	NEG_LONG.
+
+2017-08-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[sfnt] Avoid synthetic unicode for symbol fonts with PUA.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/chromium/issues/detail?id=754574
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Check for FT_ENCODING_MS_SYMBOL.
+
+2017-08-16  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/pngshim.c (premultiply_data): Fix compiler warnings.
+
+2017-08-15  Behdad Esfahbod  <behdad@behdad.org>
+
+	[sfnt] Speed up PNG image loading.
+
+	This reduces the overhead of `premultiply_data' by 60%.
+
+	* src/sfnt/pngshim.c (premultiply_data): Provide code which uses
+	gcc's (and clang's) `vector_byte' attribute to process 4 pixels at a
+	time.
+
+2017-08-11  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Improve handling of missing sbits.
+
+	Requested by Behdad.
+
+	Modern bitmap-only SFNTs like `NotoColorEmoji.ttf' don't contain
+	entries in the bitmap strike(s) for empty glyphs.  Instead, they
+	rely that a space glyph gets created from the font's metrics data.
+	This commit makes FreeType behave accordingly.
+
+	* include/freetype/fterrdef.h (FT_Err_Missing_Bitmap): New error
+	code.
+
+	* src/sfnt/ttsbit.c (tt_sbit_decoder_load_image): Change error codes
+	to make a distinction between a missing bitmap in a composite and a
+	simple missing bitmap.
+
+	* src/truetype/ttgload.c (TT_Load_Glyph): For a missing bitmap (in a
+	bitmap-only font), synthesize an empty bitmap glyph if metrics are
+	available.
+
+2017-08-10  Werner Lemberg  <wl@gnu.org>
+
+	[base] Minor API improvement for default variation axis setting.
+
+	* src/base/ftmm.c (FT_Set_MM_Design_Coordinates,
+	FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+	FT_Set_Var_Blend_Coordinates): Allow coords==NULL if num_coords==0.
+
+	* docs/CHANGES: Updated.
+
+2017-08-08  Werner Lemberg  <wl@gnu.org>
+
+	[psnames] Really fix issue #49949.
+
+	We now use a separate preprocessor macro to handle both definition
+	and declaration of the glyph name arrays.
+
+	* src/psnames/psmodule.c (DEFINE_PS_TABLE_DATA): New macro.
+
+	* src/tools/glnames.py (StringTable::dump,
+	StringTable::dump_sublist): Use `DEFINE_PS_TABLE_DATA'.
+	(dump_encoding): Ditto.
+	(main): Use `wb' mode for writing the output file, which works on
+	Windows also.
+
+	* src/psnames/pstables.h: Regenerated.
+
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Harmony LCD rendering.
+
+	This is a new technology for LCD-optimized rendering. It capitalizes
+	on the fact that each color channel grid is shifted by a third of a
+	pixel.  Therefore it is logical to render 3 separate monochrome
+	bitmaps shifting the outline by 1/3 pixel, and then combine them.
+	Importantly, the resulting output does not require additional LCD
+	filtering.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic)
+	[!FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Implement new LCD-optimized
+	rendering.
+
+	* include/freetype/ftlcdfil.h, include/freetype/freetype.h,
+	include/freetype/config/ftoption.h, devel/ftoption.h: Updated
+	documentation.
+
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Clean up.
+
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/sfnt/ttpost.c (format): Use otspec-compliant versions.
+
+2017-08-05  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2868
+
+	* src/truetype/ttinterp.c (Ins_ALIGNRP): Use NEG_LONG.
+
+2017-08-05  Werner Lemberg  <wl@gnu.org>
+
+	[base, truetype] New function `FT_Get_Var_Axis_Flags'.
+
+	The reserved `flags' field got a value in OpenType version 1.8.2;
+	unfortunately, the public `FT_Var_Axis' structure misses the
+	corresponding element.  Since we can't add a new field, we add an
+	access function.
+
+	* src/base/ftmm.c (FT_Get_Var_Axis_Flags): New function.
+
+	* include/freetype/ftmm.h (FT_VAR_AXIS_FLAG_HIDDEN): New macro.
+	Updated.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Increase allocated memory
+	of `mmvar' to hold axis flags.
+	Fill the axis flags array.
+
+	* docs/CHANGES: Updated.
+
+2017-08-03  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] Fix metrics of B/W hinting in v40 mode.
+
+	Phantom points are now saved outside v40 backwards compatibility
+	mode.  This fixes the jumping glyphs when switching between v35 and
+	v40 monochrome mode.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph): Fix inversed bool logic.
+
+2017-08-03  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] Do not set any ClearType flags in v40 monochrome mode.
+
+	This fixes weird behavior of instructions that resulted in rendering
+	differences between v35 and v40 in monochrome mode, e.g., in
+	`timesbi.ttf'.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO)
+	[TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL]: Check
+	`subpixel_hinting_lean'.
+
+2017-08-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix thinko.
+
+2017-08-01  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Fix loading of named instances.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Preserve file position
+	while loading the `avar' table.
+
+2017-08-01  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Minor adjustments for OpenType 1.8.2.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): The units per EM value has now
+	(tighter) limits.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): The new OpenType
+	version explicitly allows all negative values for the number of
+	contours if we have a composite glyph (this is for better backwards
+	compatibility I guess), but it still recommends value -1.
+
+2017-07-26  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2738
+
+	* src/cff/cf2hints.c (cf2_glyphpath_computeOffset,
+	cf2_glyphpath_curveTo): Use ADD_INT32.
+
+2017-07-13  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix memory leak.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/chromium/issues/detail?id=738362
+
+	* src/base/ftglyph.c (FT_Get_Glyph): Do proper deallocation in case
+	of error.
+
+2017-07-12  Werner Lemberg  <wl@gnu.org>
+
+	[base] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2573
+
+	* src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Use
+	FT_PIX_CEIL_LONG and FT_PIX_ROUND_LONG.
+
+2017-07-12  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttpload.c (tt_face_get_location): Off-by-one typo.
+
+	Also improve tracing message.
+
+	Problem reported as
+
+	  https://bugs.chromium.org/p/chromium/issues/detail?id=738919
+
+2017-07-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2517
+
+	* src/cff/cf2blues.c (cf2_blues_capture): Use SUB_INT32.
+
+2017-07-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/sfnt/ttcmap.c (tt_cmap_unicode_class_rec): Fix warning.
+
+2017-07-05  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (FT_Stream_SeekSet): Fix warning (#51395).
+
+2017-07-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Prevent address overflow (#51365).
+
+	* src/truetype/ttgxvar.c (FT_Stream_SeekSet): Add guard.
+
+2017-07-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/base/ftlcdfil.c (ft_lcd_filter_fir): Improve code.
+
+2017-07-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2455
+
+	* src/truetype/ttinterp.c (Ins_SCFS): Use SUB_LONG.
+
+2017-07-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Ignore No_Unicode_Glyph_Name.
+
+2017-06-28  Ben Wagner  <bungeman@google.com>
+
+	Avoid Microsoft compiler warnings (#51331).
+
+	While clang's sanitizer recommends a cast to unsigned for safe
+	negation (to handle -INT_MIN), both MSVC and Visualc emit warning
+	C4146 if an unsigned value gets negated.
+
+	* include/freetype/internal/ftcalc.h (NEG_LONG, NEG_INT32),
+	src/base/ftcalc.c (FT_MOVE_SIGN): Replace negation with a
+	subtraction.
+
+2017-06-27  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffparse.c (do_fixed): Fix typo.
+
+	Spotted by chris <chris@gcjd.org>.
+
+2017-06-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2384
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2391
+
+	* src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round, FT_DivFix): Use
+	NEG_LONG.
+
+	* src/truetype/ttinterp.c (Ins_SxVTL): Use NEG_LONG.
+
+2017-06-24  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2364
+
+	* src/truetype/ttinterp.c (Ins_ISECT): Use NEG_LONG.
+
+2017-06-22  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2323
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2328
+
+	* src/cff/cf2blues.c (cf2_blues_capture): Use ADD_INT32 and
+	SUB_INT32.
+
+	* src/truetype/ttinterp.c (Ins_SDPVTL): Use SUB_LONG and NEG_LONG.
+
+2017-06-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[sfnt] Synthesize a Unicode charmap if one is missing.
+
+	* src/sfnt/ttcmap.h (tt_cmap_unicode_class_rec): Declare it.
+	* src/sfnt/ttcmap.c (tt_get_glyph_name, tt_cmap_unicode_init,
+	tt_cmap_unicode_done, tt_cmap_unicode_char_index,
+	tt_cmap_unicode_char_next, tt_cmap_unicode_class_rec): Implement
+	synthetic Unicode charmap class.
+	(tt_get_cmap_info): Make sure the callback is available.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face)
+	[FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: If Unicode charmap is missing,
+	synthesize one.
+
+	* include/freetype/config/ftoption.h: Document it.
+	* devel/ftoption.h: Ditto.
+
+2017-06-20  Tony Theodore  <tonyt@logyst.com>
+
+	Fix pkg-config in freetype-config for cross-compiling (#51274).
+
+	* builds/unix/unix-def.in (PKG_CONFIG): New variable.
+	(freetype-config): Use it in sed expression.
+
+	* builds/unix/freetype-config.in: s/pkg-config/%PKG_CONFIG%/.
+
+2017-06-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2300
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2313
+
+	* src/cff/cf2hints.c (cf2_hintmap_adjustHints): Use ADD_INT32.
+
+	* src/truetype/ttinterp.c (Ins_ABS): Avoid FT_ABS.
+
+2017-06-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[base, smooth] LCD filtering cleanups.
+
+	* src/base/ftlcdfil.c (ft_lcd_filter_fir, _ft_lcd_filter_legacy):
+	Clean up, start filtering from the bottom-left origin.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Updated.
+
+2017-06-16  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2270
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2276
+
+	* src/truetype/ttinterp.c (Ins_MDRP, _iup_worker_interpolate): Use
+	ADD_LONG and SUB_LONG.
+
+2017-06-15  Werner Lemberg  <wl@gnu.org>
+
+	[bdf, cff] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2244
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2261
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Replace calls to FT_ABS with
+	direct code to avoid value negation.
+
+	* src/cff/cf2blues.c (cf2_blues_capture): Use SUB_INT32 and
+	ADD_INT32.
+
+2017-06-13  Werner Lemberg  <wl@gnu.org>
+
+	* src/winfonts/winfnt.c (FNT_Face_Init): Don't set active encoding.
+
+	FreeType only sets a default active encoding for Unicode.
+
+2017-06-13  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2216
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2218
+
+	* src/cff/cf2fixed.h (cf2_fixedAbs): Use NEG_INT32.
+
+	* src/truetype/ttinterp.c (Ins_IP): Use SUB_LONG.
+
+2017-06-11  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2200
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2210
+
+	* src/cff/cf2hints.c (cf2_hintmap_insertHint): Use SUB_INT32 and
+	ADD_INT32.
+
+	* src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdVMOVETO>: Use
+	ADD_INT32.
+
+2017-06-10  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix TT_Set_Var_Design.
+
+	Reported by Nikolaus Waxweiler <madigens@gmail.com>.
+
+	* src/truetype/ttgxvar.c (TT_Set_Var_Design): Correctly handle the
+	case where we have less input coordinates than axes.
+
+2017-06-10  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftcalc.c (FT_DivFix): Fix embarrassing typo.
+
+	Bug introduced 2017-05-28.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2144
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2151
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2153
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2173
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2186
+
+	* src/cff/cf2blues.c (cf2_blues_init): Use SUB_INT32.
+
+	* src/truetype/ttinterp.c (Round_None, Round_To_Grid,
+	Round_To_Half_Grid, Round_Down_To_Grid, Round_Up_To_Grid,
+	Round_To_Double_Grid, Round_Super, Round_Super_45): Use ADD_LONG,
+	SUB_LONG, NEG_LONG, FT_PIX_ROUND_LONG, FT_PIX_CEIL_LONG,
+	FT_PAD_ROUND_LONG
+	(Ins_SxVTL, Ins_MIRP): Use SUB_LONG.
+	(_iup_worker_shift): Use SUB_LONG and ADD_LONG.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+	Provide more macros for flooring, ceiling, and rounding.
+
+	These versions don't produce run-time errors due to integer
+	overflow.
+
+	* include/freetype/internal/ftobjs.h: Include FT_INTERNAL_CALC_H.
+	(FT_PAD_ROUND_LONG, FT_PAD_CEIL_LONG, FT_PIX_ROUND_LONG,
+	FT_PIX_CEIL_LONG): New macros.
+	(FT_PAD_ROUND_INT32, FT_PAD_CEIL_INT32, FT_PIX_ROUND_INT32,
+	FT_PIX_CEIL_INT32): New macros.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+	Remove unused macros.
+
+	* include/freetype/internal/ftcalc.h (ADD_INT, SUB_INT, MUL_INT,
+	NEG_INT): Deleted.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+	*/*: Remove `OVERFLOW_' prefix.
+
+	This increases readability.
+
+2017-06-07  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2133
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2137
+
+	* src/cff/cf2hints.c (cf2_hint_init): Use OVERFLOW_SUB_INT32.
+
+	* src/truetype/ttinterp.c (PROJECT, DUALPROJ): Use
+	OVERFLOW_SUB_LONG.
+
+2017-06-06  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2109
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2110
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2122
+
+	* src/cff/cf2blues.c (cf2_blues_init): Use OVERFLOW_SUB_INT32.
+
+	* src/cff/cf2hints.c (cf2_hintmap_map): Synchronize if-else
+	branches.
+
+2017-06-05  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Integer overflow.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2089
+
+	* src/cff/cffload.c (cff_blend_doBlend): User OVERFLOW_ADD_INT32.
+
+2017-06-04  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2075
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2088
+
+	* src/cff/cf2font.c (cf2_font_setup): Use OVERFLOW_MUL_INT32.
+
+	* src/truetype/ttinterp.c (Ins_ISECT): Use OVERFLOW_MUL_LONG,
+	OVERFLOW_ADD_LONG, and OVERFLOW_SUB_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+	[base, cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2060
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2062
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2063
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2068
+
+	* src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Use
+	OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG.
+
+	* src/cff/cf2blues.c (cf2_blues_capture), src/cff/cf2hints.c
+	(cf2_hintmap_adjustHints): Use OVERFLOW_SUB_INT32.
+
+	* src/truetype/ttgload.c (compute_glyph_metrics): User
+	OVERFLOW_SUB_LONG.
+
+	* src/truetype/ttinterp.c (Direct_Move, Direct_Move_Orig,
+	Direct_Move_X, Direct_Move_Y, Direct_Move_Orig_X,
+	Direct_Move_Orig_Y, Move_Zp2_Point, Ins_MSIRP): Use
+	OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/freetype-config.in: Fix pkg-config test (#51162).
+
+	Patch directly taken from bug report.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Synchronize sanity checks with pcf driver.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2054
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2058
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Check font ascent and descent.
+	Check AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE, RESOLUTION_X, and
+	RESOLUTION_Y properties.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2047
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2057
+
+	* src/cff/cf2hints.c (cf2_hintmap_map): Use OVERFLOW_SUB_INT32.
+
+	* src/truetype/ttinterp.c (Ins_ADD): Use OVERFLOW_ADD_LONG.
+	(Ins_SUB): Use OVERFLOW_SUB_LONG.
+	(Ins_NEG): Use NEG_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+	ftcalc.h: Avoid left-shift of negative numbers.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2055
+
+	* include/freetype/internal/ftcalc.h (INT_TO_F26DOT6,
+	INT_TO_F2DOT14, INT_TO_FIXED, F2DOT14_TO_FIXED): Use multiplication.
+
+2017-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Even more integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2046
+
+	* src/cff/cf2intrp.c (cf2_doStems, cf2_interpT2CharString): Use
+	OVERFLOW_ADD_INT32.
+
+2017-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[cff] More integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2032
+
+	* src/cff/cf2blues.c (cf2_blues_init): Use OVERFLOW_SUB_INT32.
+
+2017-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Don't left-shift negative numbers.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2031
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init): Use multiplication.
+
+2017-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[bdf] Fix integer scanning routines.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2029
+
+	* src/bdf/bdflib.c (_bdf_atoul, _bdf_atol, _bdf_atous, _bdf_atos):
+	Stop scanning if result would overflow.
+
+2017-06-02  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Fix integer overflows.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2027
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2028
+
+	* src/cff/cf2hints.c (cf2_hintmap_insertHint), src/cff/cf2intrp.c
+	(cf2_doFlex): Use OVERFLOW_ADD_INT32 and OVERFLOW_SUB_INT32.
+
+2017-06-01  Werner Lemberg  <wl@gnu.org>
+
+	[smooth] Some 32bit integer overflow run-time errors.
+
+	* src/smooth/ftgrays.c [STANDALONE] (OVERFLOW_ADD_LONG,
+	OVERFLOW_SUB_LONG, OVERFLOW_MUL_LONG, NEG_LONG): New macros.
+	[!STANDALONE]: Include FT_INTERNAL_CALC_H.
+	(gray_render_cubic): Use those macros where appropriate.
+
+2017-06-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftglyph.c (FT_Get_Glyph): Check `slot->advance'.
+
+2017-06-01  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] 32bit integer overflow tun-time errors (#46149).
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstrings): Use
+	OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG where appropriate.
+
+2017-06-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Adjust loop counter again.
+
+	Problem reported by Marek Kašík <mkasik@redhat.com>.
+
+	The problematic font that exceeds the old limit is Padauk-Bold,
+	version 3.002, containing bytecode generated by a buggy version of
+	ttfautohint.
+
+2017-05-31  Werner Lemberg  <wl@gnu.org>
+
+	[cff] 32bit integer overflow run-time errors 2/2 (#46149).
+
+	This commit handles the new engine.
+
+	* include/freetype/internal/ftcalc.h (OVERFLOW_ADD_INT32,
+	OVERFLOW_SUB_INT32, OVERFLOW_MUL_INT32, NEG_INT, NEG_LONG,
+	NEG_INT32): New macros.
+
+	* src/cff/cf2ft.c (cf2_getScaleAndHintFlag): Use OVERFLOW_ADD_INT32.
+
+	* src/cff/cf2hints.c (cf2_getWindingMomentum, cf2_hint_init,
+	cf2_hintmap_map, cf2_glyphpath_hintPoint,
+	cf2_glyphpath_computeIntersection, cf2_glyphpath_computeOffset,
+	cf2_glyphpath_lineTo, cf2_glyphpath_curveTo): Use
+	OVERFLOW_ADD_INT32, OVERFLOW_SUB_INT32, OVERFLOW_MUL_INT32, and
+	NEG_INT32 where appropriate.
+
+	* src/cff/cf2intrp.c (cf2_doFlex, cf2_doBlend,
+	cf2_interpT2CharString): Ditto.
+	Also add some other code where needed to avoid overflow.
+
+2017-05-30  Werner Lemberg  <wl@gnu.org>
+
+	[cff] 32bit integer overflow run-time errors 1/2 (#46149).
+
+	This commit handles the old engine.
+
+	* src/cff/cffgload.c: Include FT_INTERNAL_CALC_H.
+	(cff_decoder_parse_charstrings): Use OVERFLOW_ADD_LONG and
+	OVERFLOW_SUB_LONG where needed.
+
+	* src/cff/cffparse.c: Include FT_INTERNAL_CALC_H.
+	(power_ten_limits): New static array.
+	(do_fixed): Use it to prevent multiplication overflow.
+	(cff_parser_run): Use OVERFLOW_ADD_LONG.
+
+2017-05-30  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Correctly handle sequences of multiple number signs.
+
+	* src/psaux/psconv.c (PS_Conv_Strtol, PS_Conv_ToFixed): Return zero
+	if we encounter more than a single sign.
+
+2017-05-29  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] 32bit integer overflow run-time errors (#46149).
+
+	* src/pcf/pcfread.c (pcf_get_accel): Add sanity checks for
+	`fontAscent' and `fontDescent'.
+	(pcf_load_font): Add sanity checks for global height.
+	Add sanity checks for AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE,
+	RESOLUTION_X, and RESOLUTION_Y properties.
+
+2017-05-29  Werner Lemberg  <wl@gnu.org>
+
+	Handle some integer overflow run-time errors (#46149, #48979).
+
+	This commit (mainly for 32bit CPUs) is the first of a series of
+	similar commits to handle known integer overflows.  Basically, all
+	of them are harmless, since they affect rendering of glyphs only,
+	not posing security threats.  It is expected that fuzzying will show
+	up more overflows, to be fixed in due course.
+
+	The idea is to mark places where overflows can occur, using macros
+	that simply cast to unsigned integers, because overflow arithmetic
+	is well defined in this case.  Doing so suppresses run-time errors
+	of sanitizers without adding computational overhead.
+
+	* include/freetype/internal/ftcalc.h (OVERFLOW_ADD_INT,
+	OVERFLOW_SUB_INT, OVERFLOW_MUL_INT, OVERFLOW_ADD_LONG,
+	OVERFLOW_SUB_LONG, OVERFLOW_MUL_LONG): New macros.
+
+	* src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_Matrix_Multiply,
+	FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled,
+	ft_corner_orientation): Use new macros.
+
+	* src/base/ftoutln.c (FT_Outline_Get_Orientation): Use new macros.
+
+2017-05-28  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/internal/ftcalc.h (FLOAT_TO_FIXED): Remove.
+
+	This macro is not used.
+
+2017-05-28  Werner Lemberg  <wl@gnu.org>
+
+	[cff] s/cf2_floatToFixed/cf2_doubleToFixed/.
+
+	The new name better describes what the macro actually does;
+	additionally, we don't need a trailing `f' for literals (there was
+	only a single such instance in the code, but this caused a clang
+	warning because the macro itself uses `double' literals).
+
+	* src/cff/cf2blues.c, src/cff/cf2blues.h, src/cff/cf2fixed.h,
+	src/cff/cf2font.c, src/cff/cf2hints.c: Updated.
+
+2017-05-28  Werner Lemberg  <wl@gnu.org>
+
+	Fix negation of INT_MIN and LONG_MIN (#46149).
+
+	* src/base/ftcalc.c (FT_MOVE_SIGN): Add argument to pass unsigned
+	value, to be used as the result.
+	(FT_MulDiv, FT_MulDiv_No_Round, FT_DivFix, FT_MulFix,
+	FT_Vector_NormLen): Updated.
+
+2017-05-27  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix handling of design coordinates (#51127).
+
+	* src/truetype/ttgxvar.c (tt_set_mm_blend): Compute all design
+	coordinates if we have to create the `blends->coord' array.
+	(TT_Get_MM_Blend, TT_Get_Var_Design): Select default instance
+	coordinates if no instance is selected yet.
+
+2017-05-24  Werner Lemberg  <wl@gnu.org>
+
+	[bdf, pcf] Support ISO646.1991-IRV character encoding (aka ASCII).
+
+	Problem reported by Marek Kašík <mkasik@redhat.com>, cf.
+
+	  https://bugzilla.redhat.com/show_bug.cgi?id=1451795
+
+	* src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdrivr.c
+	(PCF_Face_Init): Implement it.
+
+2017-05-20  Nikolaus Waxweiler  <madigens@gmail.com>
+
+	[truetype] Always use interpreter v35 for B/W rendering (#51051).
+
+	* src/truetype/ttgload.c (tt_loader_init)
+	[TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL]: Adjust
+	`subpixel_hinting_lean', `grayscale_cleartype', and
+	`vertical_lcd_lean' accordingly.
+
+	* src/truetype/ttinterp.c (Ins_GETINFO): Updated.
+	(TT_RunIns): Update `backward_compatibility' flag.
+
+2017-05-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[smooth] Implement minimal dynamic padding for LCD filtering.
+
+	Extra bitmap padding for LCD filtering depends on the filter.  The
+	default 5-tap filter needs 2 extra subpixels.  The light 3-tap filter
+	needs only 1 extra subpixel.  This space could be already available
+	due to rounding.  In order to optimize the padding, we now expand
+	CBox for the given filter weights before rounding.
+
+	This change breaks current Skia (and Firefox).
+
+	* include/freetype/internal/ftobjs.h (FT_LibraryRec)
+	[FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Remove `lcd_extra' field.
+
+	* src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights,
+	FT_Library_SetLcdFilter): Remove `lcd_extra' initializations.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic): Implement dymanic
+	LCD padding.
+
+2017-05-15  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Return proper scaling values for SBIX bitmaps.
+
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* src/sfnt/ttsbit.c (tt_face_load_strike_metrics): Implement it.
+
+2017-05-15  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix error handling for embedded bitmaps.
+
+	Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
+
+	* src/truetype/ttgload.c (TT_Load_Glyph)
+	[TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Handle error if font is not
+	scalable.
+
+2017-05-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[autofit] Make autohint warping NORMAL option.
+
+	This moves warping option from LIGHT to NORMAL mode.  This makes LIGHT
+	truly void of hinting in x-direction, with left side bearing never
+	changed and right side bearing only altered by advance rounding.
+	Therefore, LIGHT is now ready to return fractional advance.  As a
+	NORMAL option, warping substitutes normal hinting.
+
+	* src/autofit/afcjk.c (af_cjk_hints_apply): Updated.
+	* src/autofit/aflatin.c (af_latin_hints_apply): Updated.
+	* src/autofit/aflatin2.c (af_latin2_hints_apply): Updated.
+
+	* src/autofit/afloader.c (af_loader_load_glyph): Handle warping
+	phantom points as normal.
+
+2017-05-14  Werner Lemberg  <wl@gnu.org>
+
+	Remove remnants of raster pool.
+
+	* include/freetype/internal/ftobjs.h (FT_LibraryRec): Remove
+	`raster_pool' and `raster_pool_size' fields.
+
+	* src/base/ftobjs.c (FT_New_Library), src/raster/ftrend1.c
+	(ft_raster1_init), src/smooth/ftsmooth.c (ft_smooth_init): Updated.
+
+2017-05-13  Werner Lemberg  <wl@gnu.org>
+
+	* Version 2.8 released.
+	=======================
+
+
+	Tag sources with `VER-2-8'.
+
+	* docs/VERSION.TXT: Add entry for version 2.8.
+	* docs/CHANGES: Updated.
+
+	* README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+	builds/windows/vc2005/index.html,
+	builds/windows/vc2008/freetype.vcproj,
+	builds/windows/vc2008/index.html,
+	builds/windows/vc2010/freetype.vcxproj,
+	builds/windows/vc2010/index.html,
+	builds/windows/visualc/freetype.dsp,
+	builds/windows/visualc/freetype.vcproj,
+	builds/windows/visualc/index.html,
+	builds/windows/visualce/freetype.dsp,
+	builds/windows/visualce/freetype.vcproj,
+	builds/windows/visualce/index.html,
+	builds/wince/vc2005-ce/freetype.vcproj,
+	builds/wince/vc2005-ce/index.html,
+	builds/wince/vc2008-ce/freetype.vcproj,
+	builds/wince/vc2008-ce/index.html: s/2.7.1/2.8/, s/271/28/.
+
+	* include/freetype/freetype.h (FREETYPE_MINOR): Set to 8.
+	(FREETYPE_PATCH): Set to 0.
+
+	* builds/unix/configure.raw (version_info): Set to 20:0:14.
+	* CMakeLists.txt (VERSION_MINOR): Set to 8.
+	(VERSION_PATCH): Set to 0.
+
+2017-05-12  Hin-Tak Leung  <htl10@users.sourceforge.net>
+
+	Fix `FT_UINT_TO_POINTER' macro for Windows.
+
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+	include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER) [_WIN64]:
+	Fix definition.
+
+2017-05-11  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Chakma script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Chakma.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Chakma standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Chakma data.
+
+2017-05-10  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Kayah Li script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Kayah Li.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Kayah Li standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Kayah Li data.
+
+2017-05-10  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Bamum script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Bamum.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Bamum standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Bamum data.
+
+2017-05-10  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Saurashtra script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Saurashtra.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Saurashtra standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Saurashtra
+	data.
+
+2017-05-10  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Buhid script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Buhid.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Buhid standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Buhid data.
+
+2017-05-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Shavian script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Shavian.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Shavian standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Shavian data.
+
+2017-05-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Vai script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Vai.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Vai standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Vai data.
+
+2017-05-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Osmanya script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Osmanya.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Osmanya standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Osmanya data.
+
+2017-05-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Coptic script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Coptic.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Coptic standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Coptic data.
+
+2017-05-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Carian script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Carian.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Carian standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Carian data.
+
+2017-05-07  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add tricky font `DFGirl-W6-WIN-BF' (from Dynalab).
+
+	Reported by Roy Tam <roytam@gmail.com>.
+
+	* src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
+
+2017-05-07  Roy Tam  <roytam@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More tricky fonts (mainly from Dynalab).
+
+	* src/truetype/ttobjs.c (tt_check_trickyness_family,
+	tt_check_trickyness_sfnt_ids): Add them.
+
+2017-05-07  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add tricky font `DLCHayMedium' (from Dynalab).
+
+	Reported by Roy Tam <roytam@gmail.com>.
+
+	* src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
+
+2017-05-03  Werner Lemberg  <wl@gnu.org>
+
+	*/*: s/backwards compatibility/backward compatibility/.
+
+2017-05-03  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Unified Canadian Syllabics script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Unified Canadian
+	Syllabics.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Unified Canadian Syllabics standard
+	character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Unified
+	Canadian Syllabics data.
+
+2017-05-03  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Add blue-zone support for Sundanese script.
+
+	This essentially moves the Sundanese script from the `Indic' hinter
+	to the `Latin' hinter.
+
+	* src/autofit/afblue.dat: Add blue zone data for Sundanese.
+
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Sundanese standard character and move
+	data out of AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afranges.c: Move Sundanese data out of
+	AF_CONFIG_OPTION_INDIC block.
+
+	* src/autofit/afstyles.h: Update Sundanese data; in particular, use
+	AF_WRITING_SYSTEM_LATIN.
+
+2017-05-03  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Avestan script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Avestan.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Avestan standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Avestan data.
+
+2017-05-02  Behdad Esfahbod  <behdad@behdad.org>
+
+	[truetype] Make `IUP' gvar deltas do the same as Apple (#50832).
+
+	When points are not touched by gvar interpolation deltas, FreeType
+	gave a slightly different result than Apple's CoreText.
+
+	The OpenType working group will update the specification to document
+	the following behaviour: If the two points with deltas to the `left'
+	and `right' of the untouched point have the same coordinate, then
+	the inferred delta for the untouched point should be zero.
+
+	* src/truetype/ttgxvar.c (tt_delta_interpolate): Implement new
+	behaviour.
+
+2017-05-02  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Remove `slight' auto-hint mode again.
+
+	A poll on freetype-devel favoured changes directly applied to
+	`light'.
+
+	* include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT,
+	FT_RENDER_MODE_SLIGHT): Removed.
+
+	* src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
+	(af_latin_hints_init), src/autofit/aflatin2.c
+	(af_latin2_hints_init): Revert change from 2017-04-22.
+
+	* src/autofit/afloader.c (af_loader_load_glyph) Remove references to
+	FT_RENDER_MODE_SLIGHT.
+	[AF_CONFIG_OPTION_TT_SIZE_METRICS]: Enable TrueType-like metrics
+	unconditionally.
+
+	* src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Revert change from
+	2017-04-22.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Revert change from 2017-04-22.
+
+	* src/pshinter/pshalgo.c (ps_hints_apply): Revert change from
+	2017-04-22.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render): Revert change from
+	2017-04-22.
+
+	* docs/CHANGES: Updated.
+
+2017-04-30  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix metrics computation.
+
+	Problem reported by Markus Trippelsdorf <markus@trippelsdorf.de> and
+	Nikolaus Waxweiler <madigens@gmail.com>.
+
+	* src/base/ftobjs.c (FT_Request_Size): Trigger recomputation of
+	auto-hinter metrics.  Without this change, multiple size changing
+	calls for a single face fail.
+
+2017-04-29  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttdriver.c (tt_size_request): Properly check `error'.
+
+	Reported by Earnestly <zibeon@googlemail.com> in
+
+	  https://lists.nongnu.org/archive/html/freetype/2017-04/msg00031.html
+
+2017-04-27  Werner Lemberg  <wl@gnu.org>
+
+	Introduce AF_CONFIG_OPTION_TT_SIZE_METRICS configuration option.
+
+	* include/freetype/config/ftoption.h
+	(AF_CONFIG_OPTION_TT_SIZE_METRICS): New option, commented out by
+	default.
+
+	* src/autofit/afloader.c (af_loader_load_glyph): Use
+	AF_CONFIG_OPTION_TT_SIZE_METRICS to guard the corresponding code.
+
+2017-04-26  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/freetype.h (FT_Render_Mode): Fix order.
+
+	This retains backward compatibility.
+
+	Noted by Alexei.
+
+2017-04-22  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Do linear scaling for FT_LOAD_NO_HINTING (#50470).
+
+	* src/truetype/ttobjs.h (TT_SizeRec): Add field `hinted_metrics' to
+	hold hinted metrics.
+	Make `metrics' a pointer so that `tt_glyph_load' can easily switch
+	between metrics.
+
+	* src/truetype/ttdriver.c (tt_size_request): Updated.
+	(tt_glyph_load): Use top-level metrics if FT_LOAD_NO_HINTING is
+	used.
+
+	* src/truetype/ttgload.c (TT_Hint_Glyph, TT_Process_Simple_Glyph,
+	TT_Process_Composite_Component, load_truetype_glyph,
+	compute_glyph_metrics, TT_Load_Glyph): Updated.
+
+	* src/truetype/ttinterp.c (TT_Load_Context): Updated.
+
+	* src/truetype/ttobjs.c (tt_size_reset): Updated.
+
+	* src/truetype/ttsubpix.c (sph_set_tweaks): Updated.
+
+2017-04-22  Werner Lemberg  <wl@gnu.org>
+
+	Add new `slight' auto-hinting mode.
+
+	This mode uses fractional advance widths and doesn't scale glyphs
+	horizontally, only applying vertical scaling and hinting.
+
+	At the same time, the behaviour of the `light' auto-hinter gets
+	restored for backward compatibility: Both vertical and horizontal
+	scaling is again based on rounded metrics values (this was changed
+	in a commit from 2017-03-30 as a side effect).  To be more precise,
+	the behaviour is restored for TrueType fonts only; for other font
+	formats like Type 1, this is a new feature of the `light' hinting
+	mode.
+
+	* include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT): New macro.
+	(FT_RENDER_MODE_SLIGHT): New render mode.
+
+	* include/freetype/internal/ftobjs.h (FT_Size_InternalRec): Add
+	`autohint_mode' and `autohint_metrics' fields.
+
+	* src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
+	(af_latin_hints_init), src/autofit/aflatin2 (af_latin2_hints_init):
+	Updated.
+
+	* src/autofit/afloader.c (af_loader_embolden_glyph_in_slot): Use
+	`autohint_metrics'.
+	(af_loader_load_glyph): s/internal/slot_internal/.
+	Initialize `autohint_metrics' and `autohint_mode' depending on
+	current auto-hint mode.
+	Use `autohint_metrics'.
+	Updated.
+
+	* src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Updated.
+
+	* src/base/ftobjs.c (FT_Load_Glyph): Updated.
+	(FT_New_Size): Allocate `internal' object.
+
+	* src/pshinter/pshalgo.c (ps_hints_apply): Updated.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render): Updated.
+
+2017-04-22  Werner Lemberg  <wl@gnu.org>
+
+	Introduce `FT_Size_InternalRec' structure.
+
+	We are going to extend this later on.
+
+	* include/freetype/internal/ftobjs.h (FT_Size_InternalRec): New
+	structure with a single field `module_data'.
+
+	* src/base/ftobjs.c (FT_New_Size): Allocate `internal' field of
+	`FT_Size' structure.
+
+	* src/cff/cffgload.c (cff_builder_init, cff_decoder_prepare): Use
+	`size->internal->module_data' instead of `size->internal'.
+
+	* src/cff/cffobjs.c (cff_size_done): Deallocate `module_data'.
+	(cff_size_init, cff_size_select, cff_size_request): Use
+	`size->internal->module_data' instead of `size->internal'.
+
+	* src/cif/cidobjs.c (cid_size_done, cid_size_init,
+	cid_size_request): Use `size->internal->module_data' instead of
+	`size->internal'.
+
+	* src/psaux/psobjs.c (t1_builder_ini): Use
+	`size->internal->module_data' instead of `size->internal'.
+
+	* src/type1/t1objs.c (T1_Size_Done, T1_Size_Init, T1_Size_Request):
+	Use `size->internal->module_data' instead of `size->internal'.
+
+2017-04-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftsmooth.h: Remove unused guards and declaration.
+
+2017-04-16  Hin-Tak Leung  <htl10@users.sourceforge.net>
+
+	Fix tracing messages.
+
+	* src/base/ftobjs.c (FT_Face_GetCharVariantIndex,
+	FT_Face_GetCharVariantIsDefault, FT_Face_GetVariantsOfChar): Print
+	correct function name.
+
+2017-04-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Old Turkic script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Old Turkic.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Old Turkic standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Old Turkic data.
+
+2017-04-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Gothic script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Gothic.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Gothic standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Gothic data.
+
+2017-04-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Cypriot script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Cypriot.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Cypriot standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Cypriot data.
+
+2017-04-08  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Deseret script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Deseret.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Deseret standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Deseret data.
+
+2017-04-07  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Fix invalid character range description (#50745).
+
+	Also reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1034
+
+	* src/autofit/afranges.c (af_glag_nonbase_uniranges): Fix typo in
+	recent commit.
+
+2017-04-07  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Fix clang warnings.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Add
+	casts.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Lisu script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Lisu.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Lisu standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Lisu data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Osage script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Osage.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Osage standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Osage data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Glagolitic script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Glagolitic.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Glagolitic standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Glagolitic data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Tai Viet script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Tai Viet.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Tai Viet standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Tai Viet data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for Tifinagh script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Tifinagh.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Tifinagh standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Tifinagh data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+	    Werner Lemberg  <wl@gnu.org
+
+	[autofit] Add support for N'Ko script.
+
+	* src/autofit/afblue.dat: Add blue zone data for N'Ko.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add N'Ko standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add N'Ko data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+
+	[autofit] Add support for Adlam script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Adlam.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Adlam standard characters.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Adlam data.
+
+2017-04-06  Sascha Brawer  <sascha@google.com>
+
+	[autofit] Add support for Ol Chiki script.
+
+	* src/autofit/afblue.dat: Add blue zone data for Ol Chiki.
+	* src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+	* src/autofit/afscript.h: Add Ol Chiki standard character.
+
+	* src/autofit/afranges.c, src/autofit/afstyles.h: Add Ol Chiki data.
+
+2017-04-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Avoid reexecution of `fpgm' and `prep' in case of error.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=981
+
+	* include/freetype/fterrdef.h (FT_Err_DEF_In_Glyf_Bytecode): New
+	error code.
+
+	* src/truetype/ttinterp.c (Ins_FDEF, Ins_IDEF): Prohibit execution
+	of these two opcodes in `glyf' bytecode.
+	(TT_RunIns): Don't enforce reexecution of `fpgm' and `prep' bytecode
+	in case of error since function tables can no longer be modified
+	(due to the changes in `Ins_FDEF' and `Ins_IDEF').  This change can
+	enormously speed up handling of broken fonts.
+
+2017-04-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[autofit] Disable metrics adjustment for `FT_LOAD_TARGET_LCD'.
+
+	* src/autofit/aflatin.c (af_latin_hints_init): Updated.
+	* src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
+
+2017-04-01  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgload.c: Include FT_CONFIG_CONFIG_H.
+
+	Otherwise FT_UINT_TO_POINTER might not be defined.
+
+	Problem reported by Alexei.
+
+2017-03-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	[autofit] Disable stem adjustment for `FT_LOAD_TARGET_LCD'.
+
+	* include/freetype/freetype.h (FT_LOAD_TARGET_LCD): Document it.
+	* src/autofit/afcjk.c (af_cjk_hints_init): Updated.
+	* src/autofit/aflatin.c (af_latin_hints_init): Ditto.
+	* src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
+
+2017-03-31  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffload.c (cff_font_load): Improve fix from 2017-01-04.
+
+	Allow CFFs containing a single font to have an empty font name.
+
+	Problem reported by 張俊芝 <418092625@qq.com> in
+
+	  https://lists.nongnu.org/archive/html/freetype-devel/2017-03/msg00074.html
+
+2017-03-30  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffparse.h (CFF2_DEFAULT_STACK): Set to 513 also.
+
+	Requested by Dave Arnold.
+
+2017-03-30  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix HVAR and VVAR handling (#50678).
+
+	* src/truetype/ttgxvar.c (tt_hvadvance_adjust): Handle
+	glyph indices larger than `mapCount' as described in the
+	specification.
+
+2017-03-30  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Allow linear scaling for unhinted rendering (#50470).
+
+	* src/truetype/ttdriver.c (tt_size_request): Revert change from
+	2011-07-16; the intended metrics fix seems now to be implemented in
+	a different way, making the patch unnecessary.  Note that this
+	change was usually patched out by all major GNU/Linux distributions
+	due to heavy side effects.
+
+	* src/truetype/ttgload.c (compute_glyph_metrics, TT_Load_Glyph):
+	Refer to the metrics of the `TT_Size' object.
+
+2017-03-29  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix thinko related to PS name of default named instance.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): `strid' and `psid' are
+	name ID values, not indices into the array of name entries.
+
+2017-03-27  Werner Lemberg  <wl@gnu.org>
+
+	[cid, truetype] Don't use `index' as a variable name.
+
+	At least on FreeBSD there is a global declaration of `index' in file
+	`/usr/include/strings.h'.
+
+	* src/cff/cf2intrp.c, src/truetype/ttgload.c: s/index/idx/ where
+	appropriate.
+
+2017-03-27  Wojciech Mamrak  <wmamrak@gmail.com>
+
+	[sfnt] Minor improvement for handling kern tables.
+
+	* src/sfnt/ttkern.c (tt_face_load_kern): Don't check for
+	cross-stream kerning tables since we reject format 2 tables later
+	on anyways.
+	Modify code for limit test...
+	(tt_face_get_kerning): ... to avoid a limit test here.
+
+2017-03-27  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Fix compiler warnings.
+
+	Reported by Alexander Hedges <ahedges@student.ethz.ch>.
+
+	* src/pcf/pcfdrivr.c (pcf_property_set, pcf_property_get): Tag
+	`property_name' with `FT_UNUSED' where necessary.
+
+2017-03-26  Werner Lemberg  <wl@gnu.org>
+
+	* src/psaux/psobjs.c (t1_builder_close_contour): Add safety guard.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=941
+
+2017-03-23  Werner Lemberg  <wl@gnu.org>
+
+	[psaux] Better protect `flex' handling.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=935
+
+	* src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+	<callothersubr>: Since there is not a single flex operator but a
+	series of subroutine calls, malformed fonts can call arbitrary other
+	operators after the start of a flex, possibly adding points.  For
+	this reason we have to check the available number of points before
+	inserting a point.
+
+2017-03-23  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix check for default named instance.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): A `fixed' number needs four
+	bytes, not two...
+
+2017-03-23  Werner Lemberg  <wl@gnu.org>
+
+	Make MM fonts work (again).
+
+	* src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+	FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates): Ignore
+	return value of `ft_face_get_mvar_service'; instead, check whether a
+	service is actually returned.
+
+2017-03-20  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Some variable renamings.
+
+	Too much local variables holding different structures were called
+	`metrics'.
+
+	* src/truetype/ttdriver.c (tt_size_select): s/metrics/size_metrics/.
+
+	* src/truetype/ttgload.c (tt_get_metrics_incr_overrides,
+	compute_glyph_metrics): s/metrics/incr_metrics/.
+	(load_sbit_image): s/metrics/sbit_metrics/.
+
+	* src/truetype/ttobjs.c (tt_size_run_fpgm): s/metrics/size_metrics/.
+	(tt_size_init_bytecode): s/metrics/tt_metrics/.
+	(tt_size_reset): s/metrics/size_metrics/.
+
+2017-03-20  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Don't add instances to non-variation fonts.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Fix it.
+
+2017-03-20  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffgload.c (cff_builder_init): Add safety guard (#50578).
+
+2017-03-18  Werner Lemberg  <wl@gnu.org>
+
+	Introduce FT_UINT_TO_POINTER macro (#50560).
+
+	We have to make a separate case for Windows 64's LLP64 data model.
+
+	* builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+	include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER): New macro.
+
+	* src/truetype/ttgload.c (load_truetype_glyph): Use it.
+
+2017-03-18  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Adjust loop counter (#50573).
+
+	The problematic font that exceeds the old limit is Lato-Regular,
+	version 2.007, containing bytecode generated by a buggy version of
+	ttfautohint.
+
+2017-03-18  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Another limitation for bytecode loop count maximum.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=900
+
+	* src/truetype/ttinterp.c (TT_RunIns): Limit `loopcall_counter_max'
+	by number of glyphs also.
+
+2017-03-18  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Minor improvement.
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Don't set intermediate axis if
+	bitmap strikes are active.
+
+2017-03-18  Werner Lemberg  <wl@gnu.org>
+
+	Improve `make multi'.
+
+	* src/autofit/aflatin2.c: Guard file with FT_OPTION_AUTOFIT2.
+
+	* src/base/ftmac.c: Guard more parts of the file with FT_MACINTOSH.
+
+	* src/psaux/afmparse.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
+
+	* src/sfnt/pngshim.c: Guard file with
+	TT_CONFIG_OPTION_EMBEDDED_BITMAPS also.
+
+	* src/sfnt/ttbdf.c: Avoid empty source file.
+	* src/sfnt/ttpost.c: Guard file with
+	TT_CONFIG_OPTION_POSTSCRIPT_NAMES.
+	* src/sfnt/ttsbit.c: Guard file with
+	TT_CONFIG_OPTION_EMBEDDED_BITMAPS.
+
+	* src/truetype/ttgxvar.c, src/truetype/ttinterp.c: Avoid empty
+	source file.
+
+	* src/truetype/ttsubpix.c: Guard file with
+	TT_USE_BYTECODE_INTERPRETER also.
+
+	* src/type1/t1afm.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
+
+	* src/autofit/autofit.c, src/base/ftbase.c, src/cache/ftcache.c,
+	src/cff/cff.c, src/cid/type1cid.c, src/gxvalid/gxvalid.c,
+	src/pcf/pcf.c, src/pfr/pfr.c, src/psaux/psaux.c,
+	src/pshinter/pshinter.c, src/psnames/psnames.c, src/raster/raster.c,
+	src/sfnt/sfnt.c, src/smooth/smooth.c, src/truetype/truetype.c,
+	src/type1/type1.c, src/type42/type42.c: Remove conditionals; sort
+	entries.
+
+2017-03-17  Werner Lemberg  <wl@gnu.org>
+
+	Fixes for conditional compilation.
+
+	* src/autofit/afcjk.c, src/autofit/afindic.c: Include `afcjk.h'
+	earlier.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Put `memory' variable into
+	TT_CONFIG_OPTION_GX_VAR_SUPPORT block.
+	(sfnt_done_face): Protect some code with
+	TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* src/sfnt/ttsbit.c (tt_face_load_sbix_image): Remove compiler
+	warning.
+
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Put `tmp' variable
+	into TT_USE_BYTECODE_INTERPRETER block.
+
+	(tt_loader_init): Put `error' variable into
+	TT_USE_BYTECODE_INTERPRETER block.
+
+2017-03-17  Werner Lemberg  <wl@gnu.org>
+
+	Fix preprocessor warning.
+
+	* devel/ftoption.h, include/freetype/config/ftoption.h: Test whether
+	TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined before checking its
+	value.
+
+2017-03-17  Werner Lemberg  <wl@gnu.org>
+
+	`make multi' fixes; compiler warnings.
+
+	* src/base/ftsnames.c: Include FT_INTERNAL_DEBUG_H.
+
+	* src/cff/cffobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+	FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
+
+	* src/sfnt/sfdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+	FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
+	(get_win_string, get_apple_string): Initialize `result'.
+
+2017-03-17  Dave Arnold <darnold@adobe.com>
+
+	[cff] Fix potential bugs in default NDV for CFF2.
+
+	* src/cff/cffload.c (cff_blend_build_vector): Explicitly build blend
+	vector when `lenNDV' is zero; don't rely on zero-init.
+	Save `lenNDV' as part of cache key even when `lenNDV' is zero.
+
+2017-03-17  Dave Arnold <darnold@adobe.com>
+
+	[cff] Fix CFF2 stack allocation.
+
+	* src/cff/cffparse.c (cff_parser_init) add 1 for operator.
+
+2017-03-16  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_done_blend): Free `vvar_table'.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=883
+
+2017-03-15  Werner Lemberg  <wl@gnu.org>
+
+	Remove clang compiler warnings (#50548).
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): Make
+	`var_postscript_prefix_len' unsigned.
+
+	* src/autofit/afwarp.c (af_warper_compute_line_best): Remove
+	redundant assignment.
+
+	* src/cff/cffload.c (cff_subfont_load): Add casts.
+
+	* src/cff/cffparse.c (cff_parse_blend): Remove redundant assignment.
+
+	* src/sfnt/sfdriver.c (fmix32, murmur_hash_3_128): Add `static'
+	keyword.
+	Add casts.
+	(fixed2float): Add cast.
+	(sfnt_get_var_ps_name): Make `p' always initialized.
+	Add casts.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Add casts.
+
+2017-03-15  Werner Lemberg  <wl@gnu.org>
+
+	[ftfuzzer] Limit number of tested faces and instances.
+
+	This is inspired by the discussion in and analysis of
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=859
+
+	* src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Use only
+	up to 20 face indices.
+	Use only up to 20 instance indices.
+
+2017-03-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/tools/ftfuzzer/ftfuzzer.cc: Improve readability; formatting.
+
+2017-03-14  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Implement PS names for font instances [3/3].
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* include/freetype/internal/tttypes.h (TT_FaceRec): New fields
+	`var_postscript_prefix' and `var_postscript_prefix_len'.
+
+	* src/sfnt/sfdriver.c: Include FT_TRUETYPE_IDS_H.
+	(sfnt_is_alphanumeric): New wrapperfunction for `ft_isalnum'.
+	(get_win_string, get_apple_string): Remove `const' from return
+	value.
+	(MAX_VALUE_DESCRIPTOR_LEN, MAX_PS_NAME_LEN): New macros.
+	(hexdigits): New array.
+	(sfnt_get_var_ps_name): New function, implementing Adobe TechNote
+	5902 to construct a PS name for a variation font instance.
+	(sfnt_get_ps_name): Call `sfnt_get_var_ps_name' for font instances.
+
+	* src/sfnt/sfobjs.c (sfnt_done_face): Updated.
+
+	* src/truetype/ttgxvar.c (tt_set_mm_blend): Reset
+	`face->postscript_name' to trigger recalculation for new instance
+	parameters.
+
+2017-03-14  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Implement PS names for font instances [2/3].
+
+	* src/sfnt/sfdriver.c (fix2float) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
+	New function to find the shortest representation of a 16.16
+	fractional number.
+
+2017-03-14  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Implement PS names for font instances [1/3].
+
+	Add 128bit MurmurHash 3 function.
+
+	Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+	* src/sfnt/sfdriver.c (ROTL32): New macro.
+	(fmix32, murmur_hash_3_128): New functions.
+
+2017-03-13  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Ignore invalid MVAR tags.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=838
+
+	* src/truetype/ttgxvar.c (ft_var_load_mvar): Ignore value and emit
+	warning for invalid tags.
+	(tt_apply_mvar): Ignore invalid tags.
+
+2017-03-12  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Store and use design coordinates also.
+
+	* include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+	Add `normalizedcoords' argument.
+
+	* src/truetype/ttgxvar.h (GX_BlendRec): Add `coords' field to store
+	the design coordinates of the current instance.
+	Updated.
+
+	* src/truetype/ttgxvar.c (TT_Set_MM_Blend): Move functionality to...
+	(tt_set_mm_blend): ... New function.
+	Convert data in `normalizedcoords' array to `coords' array on
+	demand.
+	(TT_Set_Var_Design): Store argument data in `coords' array.
+	(TT_Get_Var_Design): Get data from `coords' array.
+	(tt_get_var_blend): Updated.
+	(tt_done_blend): Updated.
+
+	* src/cff/cffload.c, src/cff/cffload.h (cff_get_var_blend): Updated.
+
+	* src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
+
+	* src/cff/cffobjs.c (cff_face_init): Updated.
+
+2017-03-12  Werner Lemberg  <wl@gnu.org>
+
+	src/truetype/ttgxvar.[ch]: s/avar_checked/avar_loaded/.
+
+2017-03-08  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Another fix for buggy variation fonts.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=759
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
+	instances to zero for `CFF' fonts table, ensure that there is no
+	`CFF2' present also (which gets priority).
+
+2017-03-07  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Improve handling for buggy variation fonts.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=738
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
+	instances to zero for `CFF' fonts table, ensure that there is no
+	`glyf' table present also (which gets priority).
+
+2017-03-06  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt, truetype] Always provide default instance.
+
+	As documented in the OpenType specification, an entry for the
+	default instance may be omitted in the named instance table.  In
+	particular this means that even if there is no named instance table
+	in the font we actually do have a named instance, namely the default
+	instance.
+
+	For consistency, we always want the default instance in our list of
+	named instances.  If it is missing, we try to synthesize it.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Check whether the default
+	instance is in the table of named instances.  Otherwise adjust
+	number of instances.
+
+	* src/truetype/ttgxvar.c: Include FT_TRUETYPE_IDS_H.
+	(TT_Get_MM_Var): Use `face->root.style_flags' as the number of named
+	instances.
+	Sythesize a named instance entry if necessary.
+	(tt_done_blend): Free `normalized_stylecoords'.
+
+2017-03-05  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Remove redundant code.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Remove second test for
+	`num_instances', which will always succeed.
+
+2017-03-04  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Add `get_name_id' service.
+
+	* include/freetype/internal/sfnt.h (TT_Get_Name_ID_Func): New
+	typedef.
+	(SFNT_Interface): Add `get_name_id' field.
+	(FT_DEFINE_SFNT_INTERFACE): Updated.
+
+	* src/sfnt/sfdriver.c (search_name_id): Rename to...
+	(sfnt_get_name_id): ... this.
+	(sfnt_get_ps_name, sfnt_interface): Updated.
+
+2017-03-04  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Make `TT_Set_MM_Blend' set named instance index.
+
+	* src/truetype/ttgxvar.h (GX_Blend): New array
+	`normalized_stylecoords'.
+
+	* src/truetype/ttgxvar.c (TT_Get_MM_Var): Allocate and fill
+	`normalized_stylecoords'.
+	(TT_Set_MM_Blend): Check instance tuple and adjust `face_index'
+	accordingly.
+
+2017-03-02  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Split off designer/normalized conversion routines.
+
+	* src/truetype/ttgxvar.c (TT_Set_Var_Design): Split off conversion
+	code designer->normalized coordinates to...
+	(ft_var_to_normalized): ... New function.
+	(TT_Get_Var_Design): Split off conversion code normalized->designer
+	coordinates to...
+	(ft_var_to_design): ... New function.
+
+2017-02-28  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Further generalize `sfnt_get_ps_name'; report invalid data.
+
+	* src/sfnt/sfdriver.c (sfnt_ps_map): New array.
+	(sfnt_is_postscript): New function.
+	(char_type_func): New typedef.
+	(get_win_string, get_apple_string): Add argument to specify
+	character checking function.
+	Add argument whether argument checking failures should be reported.
+	Update callers.
+	(search_name_id): Fix return value.
+
+2017-02-23  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Split off another bit of `sfnt_get_ps_name'.
+
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
+	functionality into...
+	(search_name_id): ... New function.
+
+2017-02-23  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Modularize `sfnt_get_ps_name'.
+
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
+	functionality into...
+	(IS_WIN, IS_APPLE): ... New macros.
+	(get_win_string, get_apple_string): ... New functions.
+
+2017-02-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Minor improvement.
+
+	* src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+	load_truetype_glyph): Remove unnecessary tests.
+
+2017-02-23  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/internal/tttypes.h (TT_Face): s/isCFF2/is_cff2/.
+
+	For orthogonality with other structure field names.
+
+	Update all users.
+
+2017-02-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_hline): Improve code.
+
+2017-02-20  Dominik Röttsches  <drott@google.com>
+
+	Fix some `ttnameid.h' entries (#50313).
+
+	* include/freetype/ttnameid.h:
+	s/TT_MS_LANGID_SPANISH_INTERNATIONAL_SORT/TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT/,
+	s/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIA/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN/.
+
+2017-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Finish support for `random' operator.
+
+	* src/cff/cfftypes.h (CFF_SubFontRec): Add `random' field.
+
+	* src/cff/cffobjs.c: Updated.
+	(cff_driver_init): Initialize random seed value.
+
+	* src/cff/cffload.c (cff_random): New function.
+	(cff_subfont_load): Add `face' argument.
+	Update all callers.
+	Initialize random number generator with a proper seed value.
+	(cff_font_load): Add `face' argument.
+	Update all callers.
+
+	* src/cff/cffload.h: Updated.
+
+	* src/cff/cf2intrp.c (CF2_FIXME): Removed.
+	(cf2_interpT2CharString) <cf2_escRANDOM>: Implement opcode.
+
+	* src/cff/cffgload.c (cff_decoder_parse_charstrings): Don't
+	initialize random seed value.
+	<cff_op_random>: Use new random seed framework.
+
+2017-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Sanitize `initialRandomSeed'.
+
+	* src/cff/cffload.c (cff_load_private_dict): Make
+	`initial_random_seed' value always positive.
+
+2017-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Introduce `random-seed' property (2/2).
+
+	* src/base/ftobjs.c: Include `FT_CFF_DRIVER_H'.
+	(open_face): Initialize `face->internal->random_seed'.
+	(FT_Face_Properties): Handle `FT_PARAM_TAG_RANDOM_SEED'.
+
+	* src/cff/cffdrivr.c (cff_property_set): Handle `random-seed'
+	property.
+
+2017-02-20  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Introduce `random-seed' property (1/2).
+
+	We need this for support of the `random' operator.
+
+	* include/freetype/ftcffdrv.h (FT_PARAM_TAG_RANDOM_SEED): New macro.
+
+	* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
+	field `random_seed'.
+
+	* src/cff/cffobjs.h (CFF_DriverRec): New field `random_seed'.
+
+2017-02-17  Werner Lemberg  <wl@gnu.org>
+
+	Remove clang warnings.
+
+	* src/autofit/aflatin.c (af_latin_sort_blue): Add missing `static'
+	keyword.
+
+	* src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+	FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
+	Initialize some variables.
+
+2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Add face property for stem darkening.
+
+	* include/freetype/ftautoh.h (FT_PARAM_TAG_STEM_DARKENING): New
+	macro.
+
+	* include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add
+	`no_stem_darkening' field.
+
+	* src/autofit/afloader.c (af_loader_load_glyph),
+	src/autofit/afmodule.c (af_property_set): Updated.
+
+	* src/base/ftobjs.c: Include FT_AUTOHINTER_H.
+	(ft_open_face_internal): Updated.
+	(FT_Face_Properties): Handle FT_PARAM_TAG_STEM_DARKENING.
+
+	* src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Updated.
+
+	* src/cff/cffdrivr.c (cff_property_set): Updated.
+
+2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Add face property for LCD filter weights.
+
+	* include/freetype/ftlcdfil.h (FT_PARAM_TAG_LCD_FILTER_WEIGHTS,
+	FT_LCD_FILTER_FIVE_TAPS): New macros.
+	(FT_LcdFiveTapFilter): New typedef.
+
+	* include/freetype/ftobjs.h (FT_Face_InternalRec)
+	[FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add `lcd_weights' field.
+	(FT_Bitmap_LcdFilterFunc): Change third argument to weights array.
+	(ft_lcd_filter_fir): New prototype.
+	(FT_LibraryRec): Updated.
+
+	* src/base/ftlcdfil.c (_ft_lcd_filter_fir): Renamed to...
+	(ft_lcd_filter_fir): ... this base function.
+	Updated.
+	(_ft_lcd_filter_legacy): Updated.
+	(FT_Library_SetLcdFilterWeights, FT_Library_SetLcdFilter): Updated.
+
+	* src/base/ftobjs.c (ft_open_face_internal): Updated.
+	(FT_Face_Properties): Handle FT_PARAM_TAG_LCD_FILTER_WEIGHTS.
+
+	* src/smooth/ftsmooth.c (ft_smooth_render_generic)
+	[FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Handle LCD weights from
+	`FT_Face_Internal'.
+
+2017-02-14  Nikolaus Waxweiler  <madigens@gmail.com>
+	    Werner Lemberg  <wl@gnu.org>
+
+	Add new function `FT_Face_Properties'.
+
+	This commit provides the framework, to be filled with something
+	useful in the next commits.
+
+	* include/freetype/freetype.h (FT_Face_Properties): Declare.
+
+	* src/base/ftobjs.c (FT_Face_Properties): New function.
+
+2017-02-13  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Prevent overlapping blue zones.
+
+	Problem reported as
+
+	  https://github.com/google/fonts/issues/632
+
+	The font in question (Nunito) has values 705 and 713 for the
+	reference and overshoot values, respectively, of the first blue
+	zone.  Blue zone 2, however, has value 710 for both the reference
+	and overshoot.  At 12ppem, reference and overshoot of blue zone 0
+	becomes 8px, while blue zone 2 becomes 9px.
+
+	A peculiarity of this font is that the tops of isolated vertical
+	stems like `N' have a slight overshoot also.  The auto-hinter tries
+	to find the nearest blue zone using the *original* coordinates.  For
+	vertical stems, this is value 713.  For normal horizontal tops like
+	in character `E', this is value 710.  Since value 713 is mapped to
+	8px but value 710 to 9px, `N' and similar characters are one pixel
+	higher than `E', which looks very bad.
+
+	This commit sanitizes blue zones to avoid such a behaviour.
+
+	* src/autofit/aflatin.c (af_latin_sort_blue): New function.
+	(af_latin_metrics_init_blues): Sort blue values and remove overlaps.
+
+2017-02-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_sweep): Improve code.
+
+2017-02-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Implement `VVAR' table support.
+
+	* src/truetype/ttgxvar.h (GX_HVarTable): Renamed to...
+	(GX_HVVarTable): ...This.
+	(GX_Blend): Add fields for `VVAR' table handling.
+	Other minor updates.
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Renamed to...
+	(ft_var_load_hvvar): ...This.
+	Handle VVAR loading also (controlled by an additional parameter).
+	(tt_hadvance_adjust): Renamed to...
+	(tt_hvadvance_adjust): ...This.
+	Handle application of advance height also (controlled by an
+	additional parameter).
+	(tt_hadvance_adjust, tt_vadvance_adjust): Wrappers for
+	`tt_hvadvance_adjust'.
+
+	* src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
+
+2017-02-05  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Use better blue zone characters for lowercase latin.
+
+	The number of lowercase characters for computing the top flat blue
+	zone value was too small (in most cases only `x' and `z').  If one
+	of the two characters has a large serif, say, it can happen that
+	FreeType must select between two different values, having a 50%
+	chance to use the wrong one.  As a result, rendering at larger PPEM
+	values could yield uneven lowercase glyph heights.
+
+	Problem reported by Christoph Koeberlin <christoph@koe.berlin>.
+
+	* src/autofit/afblue.dat (AF_BLUE_STRING_LATIN_SMALL): Replaced
+	with...
+	(AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_STRING_LATIN_SMALL_BOTTOM):
+	... New, extended sets.
+	(AF_BLUE_STRINGSET_LATN): Updated.
+
+	* src/autofit/afblue.c, scr/autofit/afblue.h: Regenerated.
+
+2017-02-04  Werner Lemberg  <wl@gnu.org>
+
+	Make `freetype-config' a wrapper of `pkg-config' if possible.
+
+	Based on ideas taken from
+
+	  http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-multilib.patch
+	  http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-2.5.3-freetype-config-prefix.patch
+
+	* builds/unix/freetype-config.in: Rewritten.  Use `pkg-config' to
+	set output variables if program is available.
+
+	* docs/CHANGES, docs/freetype-config.1: Updated.
+
+2017-02-04  Werner Lemberg  <wl@gnu.org>
+
+	* builds/unix/unix-def.in (freetype-config): Fix permissions.
+
+2017-02-03  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/afglobal.c (af_face_globals_free): Erase useless code.
+
+2017-02-03  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/ftgasp.h (FT_GASP_SYMMETRIC_GRIDFIT): Fix value.
+
+	Reported by Behdad.
+
+2017-02-02  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix MVAR post-action handling.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=509
+
+	* src/truetype/ttobjs.c (tt_size_reset): Do nothing for CFF2.  This
+	is important to make `tt_size_reset_iterator' (called in
+	`tt_apply_mvar') always work.
+
+2017-02-02  Werner Lemberg  <wl@gnu.org>
+
+	Make compilation with FT_CONFIG_OPTION_PIC work again.
+
+	All code committed here is guarded with `FT_CONFIG_OPTION_PIC'.
+
+	* include/freetype/internal/services/svmetric.h
+	(FT_DEFINE_SERVICE_METRICSVARIATIONSREC): Remove trailing semicolon.
+
+	* src/autofit/aflatin.c (af_latin_hints_compute_edges,
+	af_latin_hint_edges): Provide `globals' variable.
+
+	* src/autofit/afloader.c (af_loader_load_glyph): Remove shadowing
+	variable.
+
+	* src/autofit/afmodule.c (AF_SCRIPT_CLASSES_GET,
+	AF_STYLE_CLASSES_GET): Redefine.
+
+	* src/autofit/aftypes.h (AF_DEFINE_WRITING_SYSTEM_CLASS): Fix typo.
+
+	* src/cff/cffparse.c (CFF_FIELD_BLEND): Provide it.
+
+	* src/cff/cffpic.h (CffModulePIC): Fix typo.
+
+2017-01-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+	* src/smooth/ftgrays.c (gray_render_scanline): Improve code.
+
+2017-01-31  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Provide metrics variation service interface (#50196).
+
+	Only now I've got an OTF with an HVAR table for testing...
+
+	The code in `ftmm.c' uses `FT_FACE_LOOKUP_SERVICE' to get the
+	metrics variations interface.  However, this didn't work with
+	`FT_FACE_FIND_GLOBAL_SERVICE' used in `sfnt_init_face'.
+
+	* src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(cff_hadvance_adjust, cff_metrics_adjust): Wrapper functions for
+	metric service functions from the `truetype' module.
+	(cff_service_metrics_variations): New service.
+	(cff_services): Updated.
+
+	* src/cff/cffpic.h (CFF_SERVICE_METRICS_VAR_GET): New macro.
+	[FT_CONFIG_OPTION_PIC]: Synchronize code.
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Replace call to
+	FT_FACE_FIND_GLOBAL_SERVICE with `ft_module_get_service' to always
+	load the service from the `truetype' module.
+
+2017-01-31  Werner Lemberg  <wl@gnu.org>
+
+	Add framework to support services with 9 functions.
+
+	* include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC9):
+	New macro.
+
+2017-01-31  Werner Lemberg  <wl@gnu.org>
+
+	[base] Fix error handing in MM functions.
+
+	* src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+	FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
+	Implement it.
+
+2017-01-31  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Fix sanity check for `gvar' table (#50184).
+
+	* src/truetype/ttgxvar.c (ft_var_load_gvar): There might be missing
+	variation data for some glyphs.
+
+2017-01-31  Werner Lemberg  <wl@gnu.org>
+
+	[autofit] Avoid uninitialized jumps (#50191).
+
+	* src/autofit/afcjk.c (af_cjk_metrics_check_digits),
+	src/autofit/aflatin.c (af_latin_metrics_check_digits): Initialize
+	`advance'.
+
+2017-01-27  Werner Lemberg  <wl@gnu.org>
+
+	s/GB2312/PRC/.
+
+	* include/freetype/freetype.h (FT_ENCODING_PRC): New enum value.
+	(FT_ENCODING_GB2312): Deprecated.
+
+	* include/freetype/ttnameid.h (TT_MS_ID_PRC): New macro.
+	(TT_MS_ID_GB2312): Deprecated.
+
+	* src/sfnt/sfobjs.c (sfnt_find_encoding): Updated.
+
+	* docs/CHANGES: Updated.
+
+2017-01-26  Werner Lemberg  <wl@gnu.org>
+
+	[base] Add `FT_Get_Sfnt_LangTag' function.
+
+	* include/freetype/ftsnames.h (FT_SfntLangTag): New structure.
+	(FT_Get_Sfnt_LangTag): New declaration.
+
+	* src/base/ftsnames.c (FT_Get_Sfnt_LangTag): New function.
+
+	* docs/CHANGES: Updated.
+
+2017-01-26  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Support `name' table format 1.
+
+	* include/freetype/internal/tttypes.h (TT_LangTagRec): New
+	structure.
+	(TT_NameTableRec): Add fields `numLangTagRecords' and `langTags'.
+
+	* src/sfnt/ttload.c (tt_face_load_name): Add support for language
+	tags.
+	Reduce array size of name strings in case of invalid entries.
+	(tt_face_free_name): Updated.
+
+	* docs/CHANGES: Updated.
+
+2017-01-25  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] s/TT_NameEntry/TT_Name/.
+
+	* include/freetype/internal/tttypes.h (TT_NameEntryRec): Renamed
+	to...
+	(TT_NameRec): This.
+	(TT_NameTableRec): Updated.
+
+	* src/base/ftsnames.c (FT_Get_Sfnt_Name): Updated.
+
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name): Updated.
+
+	* src/sfnt/sfobjs.c (tt_name_entry_ascii_from_utf16,
+	tt_name_entry_ascii_from_other): Renamed to...
+	(tt_name_ascii_from_utf16, tt_name_entry_ascii_from_other): This,
+	respectively.
+	(TT_NameEntry_ConvertFunc): Renamed to...
+	(TT_Name_ConvertFunc): This.
+	(tt_face_get_name): Updated.
+
+	* src/sfnt/ttload.c (tt_face_load_name, tt_face_free_name):
+	Updated.
+
+2017-01-24  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Fix Postscript name service for symbol fonts.
+
+	* src/sfnt/sfdriver.c (sfnt_get_ps_name): Accept PID/EID=3/0
+	entries also.
+
+2017-01-24  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] For OpenType 1.7: s/preferred/typographic/ (sub)family.
+
+	* include/freetype/ftsnames.h
+	(FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
+	FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY): New macros.
+	(FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
+	FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Deprecated.
+
+	* include/freetype/ttnameid.h (TT_NAME_ID_TYPOGRAPHIC_FAMILY,
+	TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY): New macros.
+	(TT_NAME_ID_PREFERRED_FAMILY, TT_NAME_ID_PREFERRED_SUBFAMILY):
+	Deprecated.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Updated.
+
+	* docs/CHANGES: Updated.
+
+2017-01-23  Werner Lemberg  <wl@gnu.org>
+
+	[base] Add `FT_Set_Default_Properties' (#49187).
+
+	* include/freetype/ftmodapi.h: Add declaration.
+
+	* src/base/ftinit.c (ft_set_default_properties): Renamed to...
+	(FT_Set_Default_Properties): ... this.
+	(FT_Init_FreeType): Updated.
+
+	* docs/CHANGES: Updated.
+
+2017-01-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Minor updates for OpenType 1.8.1.
+
+	* src/truetype/ttgxvar.h (GX_MVarTable): `axisCount' has been
+	removed from the specification; it is now reserved.
+
+	* src/truetype/ttgxvar.c (ft_var_load_mvar): Updated.
+	(GX_FVar_Head): Remove `countSizePairs'; the corresponding data
+	field in the `MVAR' table is now reserved.
+	(fvar_fields): Updated.
+
+2017-01-23  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Avoid segfault for invalid variation data.
+
+	* src/truetype/ttgxvar.c (ft_var_load_item_variation_store): Assure
+	`itemCount' is not zero.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=441
+
+2017-01-20  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttinterp.c (TT_RunIns): Adjust loop detector limits.
+
+2017-01-17  Werner Lemberg  <wl@gnu.org>
+
+	* include/freetype/ttnameid.h: Updated to OpenType 1.8.1.
+
+	(TT_APPLE_ID_FULL_UNICODE): New macro.
+
+	(TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC,
+	TT_MS_LANGID_UPPER_SORBIAN_GERMANY,
+	TT_MS_LANGID_LOWER_SORBIAN_GERMANY, TT_MS_LANGID_IRISH_IRELAND,
+	TT_MS_LANGID_INUKTITUT_CANADA_LATIN, TT_MS_LANGID_BASHKIR_RUSSIA,
+	TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG,
+	TT_MS_LANGID_GREENLANDIC_GREENLAND, TT_MS_LANGID_MAPUDUNGUN_CHILE,
+	TT_MS_LANGID_MOHAWK_MOHAWK, TT_MS_LANGID_BRETON_FRANCE,
+	TT_MS_LANGID_OCCITAN_FRANCE, TT_MS_LANGID_CORSICAN_FRANCE,
+	TT_MS_LANGID_ALSATIAN_FRANCE, TT_MS_LANGID_YAKUT_RUSSIA,
+	TT_MS_LANGID_KICHE_GUATEMALA, TT_MS_LANGID_KINYARWANDA_RWANDA,
+	TT_MS_LANGID_WOLOF_SENEGAL, TT_MS_LANGID_DARI_AFGHANISTAN): New
+	macros.
+
+	(TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC): Fix value.
+
+	(TT_MS_LANGID_GERMAN_LIECHTENSTEIN, TT_MS_LANGID_CATALAN_CATALAN,
+	TT_MS_LANGID_CHINESE_MACAO, TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT,
+	TT_MS_LANGID_KOREAN_KOREA, TT_MS_LANGID_ROMANSH_SWITZERLAND,
+	TT_MS_LANGID_SLOVENIAN_SLOVENIA, TT_MS_LANGID_BASQUE_BASQUE,
+	TT_MS_LANGID_SETSWANA_SOUTH_AFRICA,
+	TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA,
+	TT_MS_LANGID_ISIZULU_SOUTH_AFRICA, TT_MS_LANGID_KAZAKH_KAZAKHSTAN,
+	TT_MS_LANGID_KYRGYZ_KYRGYZSTAN, TT_MS_LANGID_KISWAHILI_KENYA,
+	TT_MS_LANGID_TATAR_RUSSIA, TT_MS_LANGID_ODIA_INDIA,
+	TT_MS_LANGID_MONGOLIAN_PRC, TT_MS_LANGID_TIBETAN_PRC,
+	TT_MS_LANGID_WELSH_UNITED_KINGDOM, TT_MS_LANGID_GALICIAN_GALICIAN,
+	TT_MS_LANGID_SINHALA_SRI_LANKA, TT_MS_LANGID_TAMAZIGHT_ALGERIA,
+	TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA, TT_MS_LANGID_YI_PRC,
+	TT_MS_LANGID_UIGHUR_PRC): New aliases.
+
+	Remove commented out code.
+
+	(TT_NAME_ID_LIGHT_BACKGROUND, TT_NAME_ID_DARK_BACKGROUND,
+	TT_NAME_ID_VARIATIONS_PREFIX): New macros.
+
+	(HAVE_LIMIT_ON_IDENTS): Remove macro (which was useless since many
+	years), use guarded long macros by default and define short versions
+	as aliases for the long ones.
+
+2017-01-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/truetype/ttgxvar.c (tt_apply_var): Handle underline parameters
+	also.
+
+2017-01-11  Werner Lemberg  <wl@gnu.org>
+
+	* src/base/ftobjs.c (ft_open_face_internal): Improve tracing.
+
+2017-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Actually use metrics variation service.
+
+	* src/base/ftmm.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+	(ft_face_get_mvar_service): New auxiliary function to look up
+	metrics variation service.
+	(FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+	FT_Set_Var_Blend_Coordinates): Call metrics variation service.
+
+	* src/truetype/ttobjs.c (tt_face_init): Use metrics variations for
+	named instances.
+
+2017-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Provide metrics variation service.
+
+	* include/freetype/internal/services/svmetric.h
+	(FT_Metrics_Adjust_Func): Reduce number of necessary parameters.
+
+	* src/truetype/ttgxvar.c: Include FT_LIST_H.
+	(tt_size_reset_iterator): New auxiliary function for...
+	(tt_apply_var): New function.
+
+	* src/truetype/ttgxvar.h: Updated.
+
+	* src/truetype/ttdriver.c (tt_service_metrics_variations): Add
+	`tt_apply_mvar'.
+
+	* include/freetype/internal/ftserv.h (FT_ServiceCache): Add metrics
+	variation service.
+
+2017-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Parse `MVAR' table.
+
+	* src/truetype/ttgxvar.h (MVAR_TAG_XXX): New macros for MVAR tags.
+	(GX_Value, GX_MVarTable): New structures.
+	(GX_Blend): Add it.
+
+	* src/truetype/ttgxvar.c (GX_VALUE_SIZE, GX_VALUE_CASE,
+	GX_GASP_CASE): New macros.
+	(ft_var_get_value_pointer): New auxiliary function to get a pointer
+	to a value from various SFNT tables already stored in `TT_Face'.
+	(ft_var_load_mvar): New function.
+	(TT_Get_MM_Var): Call it.
+	(tt_done_blend): Updated.
+
+2017-01-11  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More preparations for MVAR support.
+
+	* src/truetype/ttobjs.c (tt_size_reset): Add argument to make
+	function only recompute ascender, descender, and height.
+
+	* src/truetype/ttobjs.h: Updated.
+
+	* src/truetype/ttdriver.c (tt_size_select, tt_size_request):
+	Updated.
+
+2017-01-09  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Disable long family names by default.
+
+	* include/freetype/config/ftoption.h
+	(PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): Comment out.
+
+2017-01-09  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Make long family names configurable.
+
+	The change from 2016-09-29 was too radical (except for people using
+	the openSuSE GNU/Linux distribution).  To ameliorate the situation,
+	PCF_CONFIG_OPTION_LONG_FAMILY_NAMES gets introduced which controls
+	the feature; if set, a new PCF property option
+	`no-long-family-names' can be used to switch this feature off.
+
+	* include/freetype/config/ftoption.h, devel/ftoption.h
+	(PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): New option.
+
+	* include/freetype/ftpcfdrv.h: New header file (only containing
+	comments currently, used for building the documentation).
+
+	* include/freetype/config/ftheader.h (FT_PCF_DRIVER_H): New macro.
+
+	* src/pcf/pcf.h (PCF_Driver): Add `no_long_family_names' field.
+
+	* src/pcf/pcfdrivr.c: Include FT_SERVICE_PROPERTIES_H and
+	FT_PCF_DRIVER_H.
+	(pcf_property_set, pcf_property_get): New functions.
+	(pcf_service_properties): New service.
+	(pcf_services): Updated.
+	(pcf_driver_init) [PCF_CONFIG_OPTION_LONG_FAMILY_NAMES]: Handle
+	`no_long_family_names'.
+
+	* src/pcf/pcfread.c (pcf_load_font): Handle `no_long_family_names'
+	and PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
+
+	* docs/CHANGES: Updated.
+
+2017-01-09  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Introduce a driver structure.
+
+	To be filled later on with something useful.
+
+	* src/pcf/pcf.h (PCF_Driver): New structure.
+
+	* src/pcf/pcfdrivr.c (pcf_driver_init, pcf_driver_done): New dummy
+	functions.
+	(pcf_driver_class): Updated.
+
+2017-01-08  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Again some GX code shuffling.
+
+	We need this later on for MVAR also.
+
+	* src/truetype/ttgxvar.c (tt_hadvance_adjust): Split off computing
+	an item store variation delta into...
+	(ft_var_get_item_delta): ...new function.
+
+2017-01-08  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Adjust font variation flags for MVAR.
+
+	* include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
+	Remove all flags related to MVAR; replace it with...
+	(TT_FACE_FLAG_VAR_MVAR): ...this new macro.
+	(TT_Face): Remove `mvar_support' field (which was still unused).
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More GX code shuffling.
+
+	We need this later on for MVAR also.
+
+	* src/truetype/ttgxvar.c (tt_done_blend): Split off handling of item
+	variation store into...
+	(ft_var_done_item_variation_store): ...new function.
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] More generalization of GX stuff.
+
+	We need this later on for MVAR also.
+
+	* src/truetype/ttgxvar.c (ft_var_load_delta_set_index_mapping): Add
+	parameters for delta-set index mapping and item variation store.
+	(ft_var_load_item_variation_store): Add parameter for item variation
+	store.
+	s/hvarData/varData/.
+	Move allocation of `hvar_table' to...
+	(ft_var_load_hvar): ...this function.
+	Updated.
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Some GX structure renames for generalization.
+
+	We need this later on for MVAR also.
+
+	* src/truetype/ttgxvar.h (GX_HVarData): Renamed to...
+	(GX_ItemVarData): ...this.
+	(GX_HVarRegion): Renamed to...
+	(GX_VarRegion): ...this.
+	(GX_HVStore): Renamed to...
+	(GX_ItemVarStore): ...this.
+	(GX_WidthMap): Renamed to...
+	(GX_DeltaSetIdxMap): ...this.
+
+	(GX_HVarTable): Updated.
+
+	* src/truetype/ttgxvar.c: Updated.
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Code shuffling.
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Split off loading of
+	item variation store and delta set index mapping into...
+	(ft_var_load_item_variation_store,
+	ft_var_load_delta_set_index_mapping): ...new functions.
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Add HVAR access without advance width map.
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Handle case where
+	`offsetToAdvanceWidthMapping' is zero.
+	(tt_hadvance_adjust): Implement direct deltaSet access by glyph
+	index.
+
+2017-01-06  Werner Lemberg  <wl@gnu.org>
+
+	[pcf] Revise driver.
+
+	This commit improves tracing and handling of malformed fonts.  In
+	particular, the changes to `pcf_get_properties' fix
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=379
+
+	* src/pcf/pcfread.c (tableNames): Use long names for better
+	readability.
+	(pcf_read_TOC): Allow at most 9 tables.
+	(pcf_get_properties): Allow at most 256 properties.
+	Limit strings array length to 256 * (65536 + 1) bytes.
+	Better tracing.
+	(pcf_get_metric): Trace metric data.
+	(pcf_get_metrics): Allow at most 65536 metrics.
+	Fix comparison of `metrics->ascent' and `metrics->descent' to avoid
+	potential overflow.
+	Better tracing.
+	(pcf_get_bitmaps): Allow at most 65536 bitmaps.
+	Better tracing.
+	(pcf_get_encodings, pcf_get_accel): Better tracing.
+
+	* src/pcf/pcfdrivr.c (PCF_Glyph_Load): Don't trace `format' details.
+	These are now shown by `pcf_get_bitmaps'.
+
+2017-01-04  Werner Lemberg  <wl@gnu.org>
+
+	* src/pcf/pcfdrivr.c (PCF_Face_Init): Trace compression format.
+
+2017-01-04  Werner Lemberg  <wl@gnu.org>
+
+	[cff] More consistency checks for pure CFFs.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=378
+
+	* src/cff/cffload.c (cff_font_load): Check element number and size
+	of Name and Top DICT indices.
+
+2017-01-04  Werner Lemberg  <wl@gnu.org>
+
+	[cff, truetype] Minor tracing improvement.
+
+	* src/cff/cffobjs.c (cff_face_init), src/truetype/ttobjs.c
+	(tt_face_init): Indent first tracing message from SFNT driver.
+
+2017-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Various minor fixes.
+
+	* src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check instruction
+	size only if we do native hinting.
+	(TT_Load_Glyph): Trace returned error code.
+
+	* src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Trace
+	returned error code.
+	(tt_size_ready_bytecode): Don't run `prep' table if `fpgm' table is
+	invalid.
+
+2017-01-03  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Don't fail if PCLT, EBLC (and similar tables) are invalid.
+
+	These tables are optional.
+
+	* src/sfnt/sfobjs.c (sfnt_load_face): Implement it.
+
+2017-01-03  Werner Lemberg  <wl@gnu.org>
+
+	* src/cff/cffparse.c (cff_parse_num): Simplify.
+
+2017-01-03  Werner Lemberg  <wl@gnu.org>
+
+	Various fixes for clang's undefined behaviour sanitizer.
+
+	* src/cff/cffload.c (FT_fdot14ToFixed): Fix casting.
+	(cff_blend_doBlend): Don't left-shift negative numbers.
+	Handle 5-byte numbers byte by byte to avoid alignment issues.
+
+	* src/cff/cffparse.c (cff_parse_num): Handle 5-byte numbers byte by
+	byte to avoid alignment issues.
+
+	* src/cid/cidload (cid_read_subrs): Do nothing if we don't have any
+	subrs.
+
+	* src/psaux/t1decode.c (t1_decode_parse_charstring): Fix tracing.
+
+	* src/tools/glnames.py (main): Put `DEFINE_PSTABLES' guard around
+	definition of `ft_get_adobe_glyph_index'.
+
+	* src/psnames/pstables.h: Regenerated.
+
+	* src/psnames/psmodule.c: Include `pstables.h' twice to get both
+	declaration and definition.
+
+	* src/truetype/ttgxvar.c (FT_fdot14ToFixed, FT_intToFixed): Fix
+	casting.
+
+2017-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[cff] Handle multiple `blend' operators in a row correctly.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=368
+
+	* src/cff/cffload.c (cff_blend_doBlend): Adjust `parser->stack'
+	pointers into `subFont->blend_stack' after reallocation.
+
+2017-01-01  Werner Lemberg  <wl@gnu.org>
+
+	[sfnt] Return correct number of named instances for TTCs.
+
+	Without this patch, requesting information for face index N returned
+	the data for face index N+1 (or index 0).
+
+	* src/sfnt/sfobjs.c (sfnt_init_face): Correctly adjust `face_index'
+	for negative `face_instance_index' values.
+
+2016-12-31  Werner Lemberg  <wl@gnu.org>
+
+	*/*: Use hex numbers for errors in tracing messages.
+
+2016-12-31  Werner Lemberg  <wl@gnu.org>
+
+	[truetype] Check axis count in HVAR table.
+
+	Reported as
+
+	  https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=362
+
+	* src/truetype/ttgxvar.c (ft_var_load_hvar): Check axis count.
+	(ft_var_load_avar): Fix tracing message.
+
+
+----------------------------------------------------------------------------
+
+Copyright 2016-2018 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.
+
+
+Local Variables:
+version-control: never
+coding: utf-8
+End:
diff --git a/Jamfile b/Jamfile
index 61fa018..9078a5f 100644
--- a/Jamfile
+++ b/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 top Jamfile.
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -73,20 +73,20 @@
 FT2_COMPONENTS ?= autofit    # auto-fitter
                   base       # base component (public APIs)
                   bdf        # BDF font driver
+                  bzip2      # support for bzip2-compressed PCF font
                   cache      # cache sub-system
                   cff        # CFF/CEF font driver
                   cid        # PostScript CID-keyed font driver
-                  pcf        # PCF font driver
-                  bzip2      # support for bzip2-compressed PCF font
                   gzip       # support for gzip-compressed PCF font
                   lzw        # support for LZW-compressed PCF font
+                  pcf        # PCF font driver
                   pfr        # PFR/TrueDoc font driver
                   psaux      # common PostScript routines module
                   pshinter   # PostScript hinter module
                   psnames    # PostScript names handling
                   raster     # monochrome rasterizer
-                  smooth     # anti-aliased rasterizer
                   sfnt       # SFNT-based format support routines
+                  smooth     # anti-aliased rasterizer
                   truetype   # TrueType font driver
                   type1      # PostScript Type 1 font driver
                   type42     # PostScript Type 42 (embedded TrueType) driver
@@ -121,17 +121,16 @@
 }
 
 
-# We need `freetype2/include' in the current include path in order to
+# We need `include' in the current include path in order to
 # compile any part of FreeType 2.
-#: updating documentation for upcoming release
-
+#
 HDRS += $(FT2_INCLUDE) ;
 
 
 # We need to #define FT2_BUILD_LIBRARY so that our sources find the
 # internal headers
 #
-DEFINES += FT2_BUILD_LIBRARY ;
+CCFLAGS += -DFT2_BUILD_LIBRARY ;
 
 # Uncomment the following line if you want to build individual source files
 # for each FreeType 2 module.  This is only useful during development, and
@@ -140,12 +139,13 @@
 # FT2_MULTI = true ;
 
 
-# The file <config/ftheader.h> is used to define macros that are later used
-# in #include statements.  It needs to be parsed in order to record these
-# definitions.
+# The files `ftheader.h', `internal.h', and `ftserv.h' are used to define
+# macros that are later used in #include statements.  They need to be parsed
+# in order to record these definitions.
 #
-HDRMACRO  [ FT2_SubDir  include freetype config ftheader.h ] ;
-HDRMACRO  [ FT2_SubDir  include freetype internal internal.h ] ;
+HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype config ftheader.h ] ;
+HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype internal internal.h ] ;
+HDRMACRO  [ FT2_SubDir  $(FT2_INCLUDE_DIR) freetype internal ftserv.h ] ;
 
 
 # Now include the Jamfile in `freetype2/src', used to drive the compilation
@@ -153,7 +153,7 @@
 #
 SubInclude  FT2_TOP $(FT2_SRC_DIR) ;
 
-# Handle the generation of the `ftexport.sym' file which contain the list
+# Handle the generation of the `ftexport.sym' file, which contains the list
 # of exported symbols.  This can be used on Unix by libtool.
 #
 SubInclude FT2_TOP $(FT2_SRC_DIR) tools ;
@@ -161,7 +161,20 @@
 rule GenExportSymbols
 {
   local  apinames = apinames$(SUFEXE) ;
-  local  headers  = [ Glob $(2) : *.h ] ;
+  local  aheader ;
+  local  headers ;
+
+  for aheader in [ Glob $(2) : *.h ]
+  {
+    switch $(aheader)
+    {
+      case */ftmac.h :
+        if ( $(MAC) || $(OS) = MACOSX ) {
+          headers += $(aheader) ;
+        }
+      case *.h : headers += $(aheader) ;
+    }
+  }
 
   LOCATE on $(1) = $(ALL_LOCATE_TARGET) ;
 
@@ -177,7 +190,7 @@
   $(APINAMES) $(2) > $(1)
 }
 
-GenExportSymbols  ftexport.sym : include include/cache ;
+GenExportSymbols  ftexport.sym : include/freetype ;
 
 # Test files (hinter debugging).  Only used by FreeType developers.
 #
@@ -195,7 +208,12 @@
 
 actions RefDoc
 {
-  python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.6 --output=$(DOC_DIR) $(FT2_INCLUDE)/*.h $(FT2_INCLUDE)/config/*.h
+  python $(FT2_SRC)/tools/docmaker/docmaker.py
+         --prefix=ft2
+         --title=FreeType-2.9.1
+         --output=$(DOC_DIR)
+         $(FT2_INCLUDE)/freetype/*.h
+         $(FT2_INCLUDE)/freetype/config/*.h
 }
 
 RefDoc  refdoc ;
diff --git a/Jamrules b/Jamrules
index 91d1966..bdd04bc 100644
--- a/Jamrules
+++ b/Jamrules
@@ -1,6 +1,6 @@
 # FreeType 2 JamRules.
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/Makefile b/Makefile
index c807b0b..0c7ee0e 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/README b/README
index ff20745..c23b99e 100644
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
-  FreeType 2.6
-  ============
+  FreeType 2.9.1
+  ==============
 
-  Homepage: http://www.freetype.org
+  Homepage: https://www.freetype.org
 
   FreeType is a freely available software library to render fonts.
 
@@ -20,17 +20,17 @@
   documentation is available as a separate package from our sites.  Go
   to
 
-    http://download.savannah.gnu.org/releases/freetype/
+    https://download.savannah.gnu.org/releases/freetype/
 
   and download one of the following files.
 
-    freetype-doc-2.6.tar.bz2
-    freetype-doc-2.6.tar.gz
-    ftdoc26.zip
+    freetype-doc-2.9.1.tar.bz2
+    freetype-doc-2.9.1.tar.gz
+    ftdoc291.zip
 
   To view the documentation online, go to
 
-    http://www.freetype.org/freetype2/documentation.html
+    https://www.freetype.org/freetype2/documentation.html
 
 
   Mailing Lists
@@ -42,10 +42,11 @@
     general use and discussion:      freetype@nongnu.org
     engine internals, porting, etc.: freetype-devel@nongnu.org
     announcements:                   freetype-announce@nongnu.org
+    git repository tracker:          freetype-commit@nongnu.org
 
   The lists are moderated; see
 
-    http://www.freetype.org/contact.html
+    https://www.freetype.org/contact.html
 
   how to subscribe.
 
@@ -70,7 +71,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2006-2015 by
+Copyright 2006-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/README.git b/README.git
index 2350e78..a3d7fc0 100644
--- a/README.git
+++ b/README.git
@@ -37,7 +37,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2005-2015 by
+Copyright 2005-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/autogen.sh b/autogen.sh
index 9729af4..ab90e64 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -139,7 +139,7 @@
 check_tool_version $AUTOCONF   autoconf   AUTOCONF   2.62
 
 # This sets freetype_major, freetype_minor, and freetype_patch.
-eval `sed -nf version.sed include/freetype.h`
+eval `sed -nf version.sed include/freetype/freetype.h`
 
 # We set freetype-patch to an empty value if it is zero.
 if test "$freetype_patch" = ".0"; then
@@ -156,7 +156,6 @@
 run $LIBTOOLIZE --force --copy --install
 run autoconf --force
 
-chmod +x mkinstalldirs
 chmod +x install-sh
 
 cd ../..
diff --git a/builds/amiga/README b/builds/amiga/README
index 1a68b10..29e97d6 100644
--- a/builds/amiga/README
+++ b/builds/amiga/README
@@ -1,7 +1,7 @@
 
 README for the builds/amiga subdirectory.
 
-Copyright 2005-2015 by
+Copyright 2005-2018 by
 Werner Lemberg and Detlef Würkner.
 
 This file is part of the FreeType project, and may only be used, modified,
@@ -51,8 +51,8 @@
 
 - ftdebug.o, an object module containing the standard version of the
   debugging code which uses vprintf() and exit() (not pure).
-  Debugging can be turned on in FT:include/config/ftoption.h and with
-  FT_SetTraceLevel().
+  Debugging can be turned on in FT:include/freetype/config/ftoption.h
+  and with FT_SetTraceLevel().
 
 - ftdebugpure.o, an object module containing the pure version of the
   debugging code which uses KVPrintf() from lib:debug.lib and no
@@ -64,14 +64,15 @@
   ftsystem.o would force ALL FreeType2 modules to be linked to your
   program, I decided to use a different scheme: You must #include
   FT:src/base/ftinit.c in your sourcecode and specify with #define
-  statements which modules you need.  See include/config/ftmodule.h.
+  statements which modules you need.  See
+  include/freetype/config/ftmodule.h.
 
 
 To use in your own programs:
 
 - Insert the #define and #include statements from top of
-  include/config/ftmodule.h in your source code and uncomment the
-  #define statements for the FreeType2 modules you need.
+  include/freetype/config/ftmodule.h in your source code and
+  uncomment the #define statements for the FreeType2 modules you need.
 
 - You can use either PARAMETERS=REGISTER or PARAMETERS=STACK for
   calling the FreeType2 functions, because the link library and the
@@ -100,8 +101,8 @@
   useful for the src directory).
 
 - An example of how to replace/workaround a problematic include file
-  is include/config/ftconfig.h; it changes a #define that would
-  prevent SAS/C from generating XDEF's where it should do that and
+  is include/freetype/config/ftconfig.h; it changes a #define that
+  would prevent SAS/C from generating XDEF's where it should do that and
   then includes the standard FreeType2 include file.
 
 Local Variables:
diff --git a/builds/amiga/include/config/ftconfig.h b/builds/amiga/include/config/ftconfig.h
index 790eeec..0217e0e 100644
--- a/builds/amiga/include/config/ftconfig.h
+++ b/builds/amiga/include/config/ftconfig.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific configuration file (specification only).              */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  Werner Lemberg and Detlef Würkner.                                     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -34,9 +34,9 @@
 /* Now include the original file */
 #ifndef __MORPHOS__
 #ifdef __SASC
-#include "FT:include/config/ftconfig.h"
+#include "FT:include/freetype/config/ftconfig.h"
 #else
-#include "/FT/include/config/ftconfig.h"
+#include "/FT/include/freetype/config/ftconfig.h"
 #endif
 #else
 /* We must define that, it seems that
@@ -45,7 +45,7 @@
  * binaries from http://www.morphos.de)
  */
 #define _LIBC_LIMITS_H_
-#include "/FT/include/config/ftconfig.h"
+#include "/FT/include/freetype/config/ftconfig.h"
 #endif
 
 /*
diff --git a/builds/amiga/include/config/ftmodule.h b/builds/amiga/include/config/ftmodule.h
index 77a66db..f8baab5 100644
--- a/builds/amiga/include/config/ftmodule.h
+++ b/builds/amiga/include/config/ftmodule.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific FreeType module selection.                            */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  Werner Lemberg and Detlef Würkner.                                     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/builds/amiga/makefile b/builds/amiga/makefile
index bcb45b9..6a7700a 100644
--- a/builds/amiga/makefile
+++ b/builds/amiga/makefile
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -43,7 +43,7 @@
 #
 # link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o
 # (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or
-# FT_DEBUG_LEVEL_TRACE in include/config/ftoption.h).
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
 
 all:	libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o
 
@@ -96,9 +96,6 @@
 ftcid.ppc.o: $(FTSRC)/base/ftcid.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-ftfntfmt.ppc.o: $(FTSRC)/base/ftfntfmt.c
-	$(CC) -c $(CFLAGS) -o $@ $<
-
 ftfstype.ppc.o: $(FTSRC)/base/ftfstype.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
@@ -111,9 +108,6 @@
 ftgxval.ppc.o: $(FTSRC)/base/ftgxval.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
-ftlcdfil.ppc.o: $(FTSRC)/base/ftlcdfil.c
-	$(CC) -c $(CFLAGS) -o $@ $<
-
 ftmm.ppc.o: $(FTSRC)/base/ftmm.c
 	$(CC) -c $(CFLAGS) -o $@ $<
 
@@ -270,8 +264,8 @@
 	$(CC) -c $(CFLAGS) -o $@ $<
 
 BASEPPC = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \
-	  ftfntfmt.ppc.oftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o          \
-	  ftgxval.ppc.o ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o            \
+	  oftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o                       \
+	  ftgxval.ppc.o ftmm.ppc.o ftotval.ppc.o                           \
 	  ftpatent.ppc.o ftpfr.ppc.o ftstroke.ppc.o ftsynth.ppc.o          \
 	  fttype1.ppc.o ftwinfnt.ppc.o
 
diff --git a/builds/amiga/makefile.os4 b/builds/amiga/makefile.os4
index 481fe59..0d340cf 100644
--- a/builds/amiga/makefile.os4
+++ b/builds/amiga/makefile.os4
@@ -4,7 +4,7 @@
 #
 
 
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -40,7 +40,7 @@
 #
 # link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o
 # (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or
-# FT_DEBUG_LEVEL_TRACE in include/config/ftoption.h).
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
 
 all:	assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o
 
@@ -99,9 +99,6 @@
 ftdebugpure.ppc.o: src/base/ftdebug.c
 	$(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c
 
-ftfntfmt.ppc.o: FT:src/base/ftfntfmt.c
-	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfntfmt.c
-
 ftfstype.ppc.o: FT:src/base/ftfstype.c
 	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfstype.c
 
@@ -114,9 +111,6 @@
 ftgxval.ppc.o: FT:src/base/ftgxval.c
 	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgxval.c
 
-ftlcdfil.ppc.o: FT:src/base/ftlcdfil.c
-	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftlcdfil.c
-
 ftmm.ppc.o: FT:src/base/ftmm.c
 	$(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c
 
@@ -274,8 +268,8 @@
 	$(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c
 
 BASE = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o \
-       ftfntfmt.ppc.o ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o         \
-       ftgxval.ppc.o ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o            \
+       ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o                        \
+       ftgxval.ppc.o ftmm.ppc.o ftotval.ppc.o                           \
        ftpatent.ppc.o ftpfr.ppc.o ftstroke.ppc.o ftsynth.ppc.o          \
        fttype1.ppc.o ftwinfnt.ppc.o
 
diff --git a/builds/amiga/smakefile b/builds/amiga/smakefile
index 156beb2..f5de308 100644
--- a/builds/amiga/smakefile
+++ b/builds/amiga/smakefile
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -40,10 +40,10 @@
 #
 # link your programs with ft2_680x0.lib and either ftsystem.o or ftsystempure.o
 # (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or
-# FT_DEBUG_LEVEL_TRACE in include/config/ftoption.h).
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
 
-OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfntfmt.o ftfstype.o \
-	  ftgasp.o ftglyph.o ftgxval.o ftlcdfil.o ftmm.o ftotval.o           \
+OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfstype.o      \
+	  ftgasp.o ftglyph.o ftgxval.o ftmm.o ftotval.o                \
 	  ftpatent.o ftpfr.o ftstroke.o ftsynth.o fttype1.o ftwinfnt.o
 
 OBJSYSTEM = ftsystem.o ftsystempure.o
@@ -133,8 +133,6 @@
 	sc $(SCFLAGS) objname=$@ $<
 ftcid.o: $(CORE)base/ftcid.c
 	sc $(SCFLAGS) objname=$@ $<
-ftfntfmt.o: $(CORE)base/ftfntfmt.c
-	sc $(SCFLAGS) objname=$@ $<
 ftfstype.o: $(CORE)base/ftfstype.c
 	sc $(SCFLAGS) objname=$@ $<
 ftgasp.o: $(CORE)base/ftgasp.c
@@ -143,8 +141,6 @@
 	sc $(SCFLAGS) objname=$@ $<
 ftgxval.o: $(CORE)base/ftgxval.c
 	sc $(SCFLAGS) objname=$@ $<
-ftlcdfil.o: $(CORE)base/ftlcdfil.c
-	sc $(SCFLAGS) objname=$@ $<
 ftmm.o: $(CORE)base/ftmm.c
 	sc $(SCFLAGS) objname=$@ $<
 ftotval.o: $(CORE)base/ftotval.c
diff --git a/builds/amiga/src/base/ftdebug.c b/builds/amiga/src/base/ftdebug.c
index 891a597..f3ba48c 100644
--- a/builds/amiga/src/base/ftdebug.c
+++ b/builds/amiga/src/base/ftdebug.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for amiga (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -176,7 +176,7 @@
   /* the memory and stream components which are set to 7 and 5,            */
   /* respectively.                                                         */
   /*                                                                       */
-  /* See the file <include/internal/fttrace.h> for details of the          */
+  /* See the file `include/freetype/internal/fttrace.h' for details of the */
   /* available toggle names.                                               */
   /*                                                                       */
   /* The level must be between 0 and 7; 0 means quiet (except for serious  */
diff --git a/builds/amiga/src/base/ftsystem.c b/builds/amiga/src/base/ftsystem.c
index bb3ccfd..babaeeb 100644
--- a/builds/amiga/src/base/ftsystem.c
+++ b/builds/amiga/src/base/ftsystem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific FreeType low-level system interface (body).           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/builds/ansi/ansi-def.mk b/builds/ansi/ansi-def.mk
index 35b9f32..1484f96 100644
--- a/builds/ansi/ansi-def.mk
+++ b/builds/ansi/ansi-def.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/ansi/ansi.mk b/builds/ansi/ansi.mk
index 2816e14..c06732c 100644
--- a/builds/ansi/ansi.mk
+++ b/builds/ansi/ansi.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/atari/ATARI.H b/builds/atari/ATARI.H
index 9f78c92..4ddd2eb 100644
--- a/builds/atari/ATARI.H
+++ b/builds/atari/ATARI.H
@@ -1,4 +1,4 @@
-#if defined( __GXVALID_H__ )
+#if defined( GXVALID_H_ )
 #pragma warn -aus /* too many unevaluated variables in gxvalid */
 #endif
 
diff --git a/builds/atari/README.TXT b/builds/atari/README.TXT
index 04eec63..ffe6545 100644
--- a/builds/atari/README.TXT
+++ b/builds/atari/README.TXT
@@ -18,8 +18,8 @@
 - The file `freetype2/include/Ft2build.h' must be patched as follows to
   include ATARI.H:
 
-    #ifndef __FT2_BUILD_GENERIC_H__
-    #define __FT2_BUILD_GENERIC_H__
+    #ifndef FT2_BUILD_GENERIC_H_
+    #define FT2_BUILD_GENERIC_H_
 
     #include "ATARI.H"
 
@@ -43,8 +43,8 @@
 - In der Datei freetype2/include/Ft2build.h muss zu Beginn
   ein #include "ATARI.H" wie folgt eingefgt werden:
 
-    #ifndef __FT2_BUILD_GENERIC_H__
-    #define __FT2_BUILD_GENERIC_H__
+    #ifndef FT2_BUILD_GENERIC_H_
+    #define FT2_BUILD_GENERIC_H_
 
     #include "ATARI.H"
 
diff --git a/builds/beos/beos-def.mk b/builds/beos/beos-def.mk
index 5ddedc0..89c54dd 100644
--- a/builds/beos/beos-def.mk
+++ b/builds/beos/beos-def.mk
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/beos/beos.mk b/builds/beos/beos.mk
index 6c7fca1..619ceaf 100644
--- a/builds/beos/beos.mk
+++ b/builds/beos/beos.mk
@@ -2,7 +2,7 @@
 # FreeType 2 configuration rules for a BeOS system
 #
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/beos/detect.mk b/builds/beos/detect.mk
index b23f94e..82f6205 100644
--- a/builds/beos/detect.mk
+++ b/builds/beos/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/cmake/FindHarfBuzz.cmake b/builds/cmake/FindHarfBuzz.cmake
new file mode 100644
index 0000000..ee0d52e
--- /dev/null
+++ b/builds/cmake/FindHarfBuzz.cmake
@@ -0,0 +1,81 @@
+# Copyright (c) 2012, Intel Corporation
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of Intel Corporation nor the names of its contributors may
+#   be used to endorse or promote products derived from this software without
+#   specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# Try to find Harfbuzz include and library directories.
+#
+# After successful discovery, this will set for inclusion where needed:
+# HARFBUZZ_INCLUDE_DIRS - containg the HarfBuzz headers
+# HARFBUZZ_LIBRARIES - containg the HarfBuzz library
+
+include(FindPkgConfig)
+pkg_check_modules(PC_HARFBUZZ QUIET harfbuzz)
+
+find_path(HARFBUZZ_INCLUDE_DIRS
+    NAMES hb.h
+    HINTS ${PC_HARFBUZZ_INCLUDEDIR}
+          ${PC_HARFBUZZ_INCLUDE_DIRS}
+    PATH_SUFFIXES harfbuzz
+)
+
+find_library(HARFBUZZ_LIBRARIES NAMES harfbuzz
+    HINTS ${PC_HARFBUZZ_LIBDIR}
+          ${PC_HARFBUZZ_LIBRARY_DIRS}
+)
+
+if (HARFBUZZ_INCLUDE_DIRS)
+    if (EXISTS "${HARFBUZZ_INCLUDE_DIRS}/hb-version.h")
+        file(READ "${HARFBUZZ_INCLUDE_DIRS}/hb-version.h" _harfbuzz_version_content)
+
+        string(REGEX MATCH "#define +HB_VERSION_STRING +\"([0-9]+\\.[0-9]+\\.[0-9]+)\"" _dummy "${_harfbuzz_version_content}")
+        set(HARFBUZZ_VERSION "${CMAKE_MATCH_1}")
+    endif ()
+endif ()
+
+if ("${harfbuzz_FIND_VERSION}" VERSION_GREATER "${HARFBUZZ_VERSION}")
+    message(FATAL_ERROR "Required version (" ${harfbuzz_FIND_VERSION} ") is higher than found version (" ${HARFBUZZ_VERSION} ")")
+endif ()
+
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
+    harfbuzz 
+        REQUIRED_VARS HARFBUZZ_INCLUDE_DIRS HARFBUZZ_LIBRARIES
+        VERSION_VAR HARFBUZZ_VERSION)
+
+mark_as_advanced(
+    HARFBUZZ_INCLUDE_DIRS
+    HARFBUZZ_LIBRARIES
+)
+
+# Allows easy linking as in 
+#   target_link_libraries(freetype PRIVATE Harfbuzz::Harfbuzz)
+if (NOT CMAKE_VERSION VERSION_LESS 3.1)
+    if (HARFBUZZ_FOUND AND NOT TARGET Harfbuzz::Harfbuzz)
+        add_library(Harfbuzz::Harfbuzz INTERFACE IMPORTED)
+        set_target_properties(
+            Harfbuzz::Harfbuzz PROPERTIES
+                INTERFACE_INCLUDE_DIRECTORIES "${HARFBUZZ_INCLUDE_DIRS}")
+    endif ()
+endif ()
diff --git a/builds/cmake/iOS.cmake b/builds/cmake/iOS.cmake
index 7970f2b..c6da70c 100644
--- a/builds/cmake/iOS.cmake
+++ b/builds/cmake/iOS.cmake
@@ -1,6 +1,6 @@
 # iOS.cmake
 #
-# Copyright 2014-2015 by
+# Copyright 2014-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # Written by David Wimsey <david@wimsey.us>
@@ -85,11 +85,6 @@
     DARWIN_MAJOR_VERSION "${CMAKE_HOST_SYSTEM_VERSION}")
 endif (CMAKE_UNAME)
 
-# force the compilers to gcc for iOS
-include(CMakeForceCompiler)
-CMAKE_FORCE_C_COMPILER(gcc gcc)
-CMAKE_FORCE_CXX_COMPILER(g++ g++)
-
 # skip the platform compiler checks for cross compiling
 set(CMAKE_CXX_COMPILER_WORKS TRUE)
 set(CMAKE_C_COMPILER_WORKS TRUE)
diff --git a/builds/cmake/testbuild.sh b/builds/cmake/testbuild.sh
new file mode 100755
index 0000000..1fa3a18
--- /dev/null
+++ b/builds/cmake/testbuild.sh
@@ -0,0 +1,157 @@
+#!/bin/sh -e
+
+# Copyright 2015-2018 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.
+
+# This script tests the CMake build. Simply run
+#
+#     builds/cmake/testbuild.sh
+#
+# or
+#
+#     BUILD_SHARED_LIBS=1 builds/cmake/testbuild.sh
+#
+# The script:
+#
+# - builds the main CMakeLists.txt
+# - builds and runs a small test app in a separate build tree so
+#   the config-module is tested, too
+#
+# Options (environment variables):
+#
+# - The variable BUILD_SHARED_LIBS will be forwarded to the CMake project
+#   that builds the library.
+#
+
+
+# prepare temporary dir
+
+cd `dirname $0`/../..
+ftdir=`pwd`
+tmpdir=/tmp/freetype-cmake-testbuild
+rm -rf $tmpdir
+mkdir -p $tmpdir
+
+
+# build and install freetype
+
+if test -n "$BUILD_SHARED_LIBS"; then
+  bsl=-DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS
+else
+  bsl=-UBUILD_SHARED_LIBS
+fi
+
+build_opts="-DWITH_ZLIB=0 \
+            -DWITH_BZip2=0 \
+            -DWITH_PNG=0 \
+            -DWITH_HarfBuzz=0 \
+            $bsl \
+            -DCMAKE_INSTALL_PREFIX=$tmpdir/out"
+
+(set -x; cmake -H$ftdir \
+               -B$tmpdir/ftb \
+               -DCMAKE_BUILD_TYPE=Debug \
+               $build_opts)
+(set -x; cmake --build $tmpdir/ftb \
+               --config Debug \
+               --target install)
+
+(set -x; cmake $tmpdir/ftb \
+               -DCMAKE_BUILD_TYPE=Release)
+(set -x; cmake --build $tmpdir/ftb \
+               --config Release \
+               --target install \
+               --clean-first)
+
+
+# create test project CMakeLists.txt
+
+cat >$tmpdir/CMakeLists.txt << END
+cmake_minimum_required(VERSION 2.6)
+project(freetype-cmake-testbuild)
+
+find_package(Freetype REQUIRED CONFIG)
+
+add_executable(freetype-cmake-test main.c)
+target_link_libraries(freetype-cmake-test freetype)
+
+enable_testing()
+add_test(freetype-cmake-test freetype-cmake-test)
+END
+
+
+# create test project main.c
+
+cat >$tmpdir/main.c << END
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_Library library;
+
+
+int main(int argc,
+         char*argv[])
+{
+  FT_Error error;
+  FT_Int major = 0;
+  FT_Int minor = 0;
+  FT_Int patch = 0;
+
+  error = FT_Init_FreeType(&library);
+  if (error)
+    return EXIT_FAILURE;
+
+  FT_Library_Version(library, &major, &minor, &patch);
+  if (major != FREETYPE_MAJOR
+      || minor != FREETYPE_MINOR
+      || patch != FREETYPE_PATCH)
+    return EXIT_FAILURE;
+
+  printf("FT_Library_Version: %d.%d.%d\n", major, minor, patch);
+
+  error = FT_Done_FreeType(library);
+  if (error)
+    return EXIT_FAILURE;
+
+  return EXIT_SUCCESS;
+}
+END
+
+
+# build and test
+
+mkdir -p $tmpdir/tb
+cd $tmpdir/tb
+
+LD_LIBRARY_PATH=$tmpdir/out/lib:$LD_LIBRARY_PATH
+DYLD_LIBRARY_PATH=$tmpdir/out/lib:$DYLD_LIBRARY_PATH
+export LD_LIBRARY_PATH
+export DYLD_LIBRARY_PATH
+
+(set -x; cmake $tmpdir \
+               -DCMAKE_BUILD_TYPE=Debug \
+               -DCMAKE_PREFIX_PATH=$tmpdir/out)
+(set -x; cmake --build . \
+               --config Debug)
+(set -x; ctest -V -C Debug)
+
+(set -x; cmake . \
+               -DCMAKE_BUILD_TYPE=Release)
+(set -x; cmake --build . \
+               --config Release \
+               --clean-first)
+(set -x; ctest -V -C Release)
+
+rm -rf $tmpdir
+
+# EOF
diff --git a/builds/compiler/ansi-cc.mk b/builds/compiler/ansi-cc.mk
index c9f6608..99fe8cb 100644
--- a/builds/compiler/ansi-cc.mk
+++ b/builds/compiler/ansi-cc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/bcc-dev.mk b/builds/compiler/bcc-dev.mk
index 8ab957e..8d67fa1 100644
--- a/builds/compiler/bcc-dev.mk
+++ b/builds/compiler/bcc-dev.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/bcc.mk b/builds/compiler/bcc.mk
index f383840..02d4833 100644
--- a/builds/compiler/bcc.mk
+++ b/builds/compiler/bcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/emx.mk b/builds/compiler/emx.mk
index 62fe35d..2926b11 100644
--- a/builds/compiler/emx.mk
+++ b/builds/compiler/emx.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/gcc-dev.mk b/builds/compiler/gcc-dev.mk
index fd789af..48d2848 100644
--- a/builds/compiler/gcc-dev.mk
+++ b/builds/compiler/gcc-dev.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/gcc.mk b/builds/compiler/gcc.mk
index 0970d1c..9c77239 100644
--- a/builds/compiler/gcc.mk
+++ b/builds/compiler/gcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/intelc.mk b/builds/compiler/intelc.mk
index 19e5962..e9236d3 100644
--- a/builds/compiler/intelc.mk
+++ b/builds/compiler/intelc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/unix-lcc.mk b/builds/compiler/unix-lcc.mk
index ebe3306..09fffeb 100644
--- a/builds/compiler/unix-lcc.mk
+++ b/builds/compiler/unix-lcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/visualage.mk b/builds/compiler/visualage.mk
index db997fa..10299da 100644
--- a/builds/compiler/visualage.mk
+++ b/builds/compiler/visualage.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/visualc.mk b/builds/compiler/visualc.mk
index 900c8be..74f498b 100644
--- a/builds/compiler/visualc.mk
+++ b/builds/compiler/visualc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/watcom.mk b/builds/compiler/watcom.mk
index f83425e..e455922 100644
--- a/builds/compiler/watcom.mk
+++ b/builds/compiler/watcom.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/compiler/win-lcc.mk b/builds/compiler/win-lcc.mk
index 9e4f79d..1356c1c 100644
--- a/builds/compiler/win-lcc.mk
+++ b/builds/compiler/win-lcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/detect.mk b/builds/detect.mk
index 4b789d3..eb7f797 100644
--- a/builds/detect.mk
+++ b/builds/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -101,54 +101,28 @@
   .PHONY: setup
 endif
 
-# The following targets are equivalent, with the exception that they use
-# a slightly different syntax for the `echo' command.
+# Flash out and copy rules.
 #
-# std_setup: defined for most (i.e. Unix-like) platforms
-# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2
-#
-.PHONY: std_setup dos_setup
+.PHONY: std_setup
 
 std_setup:
-	@echo ""
-	@echo "$(PROJECT_TITLE) build system -- automatic system detection"
-	@echo ""
-	@echo "The following settings are used:"
-	@echo ""
-	@echo "  platform                    $(PLATFORM)"
-	@echo "  compiler                    $(CC)"
-	@echo "  configuration directory     $(BUILD_DIR)"
-	@echo "  configuration rules         $(CONFIG_RULES)"
-	@echo ""
-	@echo "If this does not correspond to your system or settings please remove the file"
-	@echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help."
-	@echo ""
-	@echo "Otherwise, simply type \`$(MAKE)' again to build the library,"
-	@echo "or \`$(MAKE) refdoc' to build the API reference (this needs python >= 2.6)."
-	@echo ""
-	@$(COPY) $(CONFIG_RULES) $(CONFIG_MK)
-
-
-# Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly!
-#
-dos_setup:
-	@type builds$(SEP)newline
-	@echo $(PROJECT_TITLE) build system -- automatic system detection
-	@type builds$(SEP)newline
-	@echo The following settings are used:
-	@type builds$(SEP)newline
-	@echo   platformÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(PLATFORM)
-	@echo   compilerÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(CC)
-	@echo   configuration directoryÿÿÿÿÿÿ$(subst /,$(SEP),$(BUILD_DIR))
-	@echo   configuration rulesÿÿÿÿÿÿÿÿÿÿ$(subst /,$(SEP),$(CONFIG_RULES))
-	@type builds$(SEP)newline
-	@echo If this does not correspond to your system or settings please remove the file
-	@echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help.
-	@type builds$(SEP)newline
-	@echo Otherwise, simply type 'make' again to build the library.
-	@echo or 'make refdoc' to build the API reference (this needs python >= 2.6).
-	@type builds$(SEP)newline
-	@$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul
+	$(info )
+	$(info $(PROJECT_TITLE) build system -- automatic system detection)
+	$(info )
+	$(info The following settings are used:)
+	$(info )
+	$(info $(empty)  platform                    $(PLATFORM))
+	$(info $(empty)  compiler                    $(CC))
+	$(info $(empty)  configuration directory     $(subst /,$(SEP),$(BUILD_DIR)))
+	$(info $(empty)  configuration rules         $(subst /,$(SEP),$(CONFIG_RULES)))
+	$(info )
+	$(info If this does not correspond to your system or settings please remove the file)
+	$(info `$(CONFIG_MK)' from this directory then read the INSTALL file for help.)
+	$(info )
+	$(info Otherwise, simply type `$(MAKE)' again to build the library,)
+	$(info or `$(MAKE) refdoc' to build the API reference (this needs python >= 2.6).)
+	$(info )
+	@$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK))
 
 
 # EOF
diff --git a/builds/dos/detect.mk b/builds/dos/detect.mk
index e49ba98..0201f7b 100644
--- a/builds/dos/detect.mk
+++ b/builds/dos/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -133,7 +133,7 @@
       COPY := copy
     endif  # test NT
 
-    setup: dos_setup
+    setup: std_setup
   endif
 
 endif     # test PLATFORM dos
diff --git a/builds/dos/dos-def.mk b/builds/dos/dos-def.mk
index ac0be5e..cb1154d 100644
--- a/builds/dos/dos-def.mk
+++ b/builds/dos/dos-def.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/dos/dos-emx.mk b/builds/dos/dos-emx.mk
index c421674..dedcc3f 100644
--- a/builds/dos/dos-emx.mk
+++ b/builds/dos/dos-emx.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/dos/dos-gcc.mk b/builds/dos/dos-gcc.mk
index 991fb64..53099ab 100644
--- a/builds/dos/dos-gcc.mk
+++ b/builds/dos/dos-gcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/dos/dos-wat.mk b/builds/dos/dos-wat.mk
index 0c34a0d..1bd00e7 100644
--- a/builds/dos/dos-wat.mk
+++ b/builds/dos/dos-wat.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/exports.mk b/builds/exports.mk
index 687ced7..59fe31a 100644
--- a/builds/exports.mk
+++ b/builds/exports.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -40,7 +40,11 @@
   endif
 
   # The list of public headers we're going to parse.
-  PUBLIC_HEADERS := $(wildcard $(PUBLIC_DIR)/*.h)
+  PUBLIC_HEADERS := $(filter-out $(PUBLIC_DIR)/ftmac.h, \
+                                 $(wildcard $(PUBLIC_DIR)/*.h))
+  ifneq ($(ftmac_c),)
+    PUBLIC_HEADERS += $(PUBLIC_DIR)/ftmac.h
+  endif
 
   # The `apinames' source and executable.  We use $E_BUILD as the host
   # executable suffix, which *includes* the final dot.
diff --git a/builds/freetype.mk b/builds/freetype.mk
index 5ea13f0..6f68a0f 100644
--- a/builds/freetype.mk
+++ b/builds/freetype.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -97,7 +97,7 @@
 
 # Other derived directories.
 #
-PUBLIC_DIR   := $(TOP_DIR)/include
+PUBLIC_DIR   := $(TOP_DIR)/include/freetype
 INTERNAL_DIR := $(PUBLIC_DIR)/internal
 SERVICES_DIR := $(INTERNAL_DIR)/services
 CONFIG_DIR   := $(PUBLIC_DIR)/config
@@ -153,6 +153,9 @@
 ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),)
   FTOPTION_H    := $(OBJ_DIR)/ftoption.h
   FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="<ftoption.h>"
+else ifneq ($(wildcard $(BUILD_DIR)/ftoption.h),)
+  FTOPTION_H    := $(BUILD_DIR)/ftoption.h
+  FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="<ftoption.h>"
 endif
 
 # `CPPFLAGS' might be specified by the user in the environment.
@@ -245,6 +248,22 @@
 	$(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
 
 
+# ftver component
+#
+#  The VERSIONINFO resource `ftver.rc' contains version and copyright
+#  to be compiled by windres and tagged into DLL usually.
+#
+ifneq ($(RC),)
+  FTVER_SRC := $(BASE_DIR)/ftver.rc
+  FTVER_OBJ := $(OBJ_DIR)/ftver.$O
+
+  OBJECTS_LIST += $(FTVER_OBJ)
+
+  $(FTVER_OBJ): $(FTVER_SRC)
+	$(RC) -o $@ $<
+endif
+
+
 # All FreeType library objects.
 #
 OBJ_M := $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M)
@@ -326,10 +345,9 @@
 
 .PHONY: clean distclean
 
-# The `config.mk' file must define `clean_freetype' and
-# `distclean_freetype'.  Implementations may use to relay these to either
-# the `std' or `dos' versions from above, or simply provide their own
-# implementation.
+# The `config.mk' file must define `clean_project' and `distclean_project'.
+# Implementations may use to relay these to either the `std' or `dos'
+# versions from above, or simply provide their own implementation.
 #
 clean: clean_project
 distclean: distclean_project remove_config_mk remove_ftmodule_h
diff --git a/builds/link_dos.mk b/builds/link_dos.mk
index 694845b..3b0e8da 100644
--- a/builds/link_dos.mk
+++ b/builds/link_dos.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/link_std.mk b/builds/link_std.mk
index 886b2e6..8ba5e64 100644
--- a/builds/link_std.mk
+++ b/builds/link_std.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/mac/FreeType.m68k_cfm.make.txt b/builds/mac/FreeType.m68k_cfm.make.txt
index c0a55f5..b74565f 100644
--- a/builds/mac/FreeType.m68k_cfm.make.txt
+++ b/builds/mac/FreeType.m68k_cfm.make.txt
@@ -38,7 +38,6 @@
 				  :src:base:ftbdf.c \xB6
 				  :src:base:ftbitmap.c \xB6
 				  :src:base:ftdebug.c \xB6
-				  :src:base:ftfntfmt.c \xB6
 				  :src:base:ftfstype.c \xB6
 				  :src:base:ftglyph.c \xB6
 				  :src:base:ftgxval.c \xB6
@@ -83,7 +82,6 @@
 				  "{ObjDir}ftbdf.c.o" \xB6
 				  "{ObjDir}ftbitmap.c.o" \xB6
 				  "{ObjDir}ftdebug.c.o" \xB6
-				  "{ObjDir}ftfntfmt.c.o" \xB6
 				  "{ObjDir}ftfstype.c.o" \xB6
 				  "{ObjDir}ftglyph.c.o" \xB6
 				  "{ObjDir}ftgxval.c.o" \xB6
@@ -161,7 +159,6 @@
 "{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c
 "{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c
 "{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c
-"{ObjDir}ftfntfmt.c.o" \xC4 :src:base:ftfntfmt.c
 "{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c
 "{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c
 "{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c
diff --git a/builds/mac/FreeType.m68k_far.make.txt b/builds/mac/FreeType.m68k_far.make.txt
index e9b7f6f..d880ddb 100644
--- a/builds/mac/FreeType.m68k_far.make.txt
+++ b/builds/mac/FreeType.m68k_far.make.txt
@@ -37,7 +37,6 @@
 				  :src:base:ftbdf.c \xB6
 				  :src:base:ftbitmap.c \xB6
 				  :src:base:ftdebug.c \xB6
-				  :src:base:ftfntfmt.c \xB6
 				  :src:base:ftfstype.c \xB6
 				  :src:base:ftglyph.c \xB6
 				  :src:base:ftgxval.c \xB6
@@ -82,7 +81,6 @@
 				  "{ObjDir}ftbdf.c.o" \xB6
 				  "{ObjDir}ftbitmap.c.o" \xB6
 				  "{ObjDir}ftdebug.c.o" \xB6
-				  "{ObjDir}ftfntfmt.c.o" \xB6
 				  "{ObjDir}ftfstype.c.o" \xB6
 				  "{ObjDir}ftglyph.c.o" \xB6
 				  "{ObjDir}ftgxval.c.o" \xB6
@@ -160,7 +158,6 @@
 "{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c
 "{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c
 "{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c
-"{ObjDir}ftfntfmt.c.o" \xC4 :src:base:ftfntfmt.c
 "{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c
 "{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c
 "{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c
diff --git a/builds/mac/FreeType.ppc_carbon.make.txt b/builds/mac/FreeType.ppc_carbon.make.txt
index 9eb1dac..1fa8c30 100644
--- a/builds/mac/FreeType.ppc_carbon.make.txt
+++ b/builds/mac/FreeType.ppc_carbon.make.txt
@@ -38,7 +38,6 @@
 				  :src:base:ftbdf.c \xB6
 				  :src:base:ftbitmap.c \xB6
 				  :src:base:ftdebug.c \xB6
-				  :src:base:ftfntfmt.c \xB6
 				  :src:base:ftfstype.c \xB6
 				  :src:base:ftglyph.c \xB6
 				  :src:base:ftgxval.c \xB6
@@ -83,7 +82,6 @@
 				  "{ObjDir}ftbdf.c.x" \xB6
 				  "{ObjDir}ftbitmap.c.x" \xB6
 				  "{ObjDir}ftdebug.c.x" \xB6
-				  "{ObjDir}ftfntfmt.c.x" \xB6
 				  "{ObjDir}ftfstype.c.x" \xB6
 				  "{ObjDir}ftglyph.c.x" \xB6
 				  "{ObjDir}ftgxval.c.x" \xB6
@@ -164,7 +162,6 @@
 "{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c
 "{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c
 "{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c
-"{ObjDir}ftfntfmt.c.x" \xC4 :src:base:ftfntfmt.c
 "{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c
 "{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c
 "{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c
diff --git a/builds/mac/FreeType.ppc_classic.make.txt b/builds/mac/FreeType.ppc_classic.make.txt
index 0627eea..2550190 100644
--- a/builds/mac/FreeType.ppc_classic.make.txt
+++ b/builds/mac/FreeType.ppc_classic.make.txt
@@ -38,7 +38,6 @@
 				  :src:base:ftbdf.c \xB6
 				  :src:base:ftbitmap.c \xB6
 				  :src:base:ftdebug.c \xB6
-				  :src:base:ftfntfmt.c \xB6
 				  :src:base:ftfstype.c \xB6
 				  :src:base:ftglyph.c \xB6
 				  :src:base:ftgxval.c \xB6
@@ -83,7 +82,6 @@
 				  "{ObjDir}ftbdf.c.x" \xB6
 				  "{ObjDir}ftbitmap.c.x" \xB6
 				  "{ObjDir}ftdebug.c.x" \xB6
-				  "{ObjDir}ftfntfmt.c.x" \xB6
 				  "{ObjDir}ftfstype.c.x" \xB6
 				  "{ObjDir}ftglyph.c.x" \xB6
 				  "{ObjDir}ftgxval.c.x" \xB6
@@ -164,7 +162,6 @@
 "{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c
 "{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c
 "{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c
-"{ObjDir}ftfntfmt.c.x" \xC4 :src:base:ftfntfmt.c
 "{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c
 "{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c
 "{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c
diff --git a/builds/mac/ftmac.c b/builds/mac/ftmac.c
index 7e2f292..c45546c 100644
--- a/builds/mac/ftmac.c
+++ b/builds/mac/ftmac.c
@@ -5,7 +5,7 @@
 /*    Mac FOND support.  Written by just@letterror.com.                    */
 /*  Heavily Fixed by mpsuzuki, George Williams and Sean McBride            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -940,7 +940,7 @@
     {
       err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
                                  buff, sizeof ( buff )  );
-      if ( FT_Err_Ok == err )
+      if ( !err )
         have_lwfn = 1;
     }
 
@@ -1217,7 +1217,7 @@
     }
 
     CloseResFile( res_ref );
-    if ( FT_Err_Ok == error && NULL != aface )
+    if ( !error && aface )
       (*aface)->num_faces = num_faces_in_res;
     return error;
   }
@@ -1279,7 +1279,7 @@
 
         error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
                                      path_lwfn, sizeof ( path_lwfn ) );
-        if ( FT_Err_Ok == error )
+        if ( !error )
           have_lwfn = 1;
       }
 
@@ -1315,7 +1315,7 @@
 
         error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
                                      path_lwfn, sizeof ( path_lwfn ) );
-        if ( FT_Err_Ok == error )
+        if ( !error )
           have_lwfn = 1;
       }
 
@@ -1332,7 +1332,7 @@
       error = FT_ERR( Unknown_File_Format );
 
   found_no_lwfn_file:
-    if ( have_sfnt && FT_Err_Ok != error )
+    if ( have_sfnt && error )
       error = FT_New_Face_From_SFNT( library,
                                      sfnt_id,
                                      face_index,
@@ -1363,7 +1363,7 @@
     /* if it works, fine.                                           */
 
     error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
-    if ( error == 0 )
+    if ( !error )
       return error;
 
     /* let it fall through to normal loader (.ttf, .otf, etc.); */
@@ -1403,7 +1403,7 @@
     /* try resourcefork based font: LWFN, FFIL */
     error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
                                        face_index, aface );
-    if ( error != 0 || *aface != NULL )
+    if ( error || *aface )
       return error;
 
     /* let it fall through to normal loader (.ttf, .otf, etc.) */
@@ -1423,7 +1423,7 @@
   /*    accepts an FSRef instead of a path.                                */
   /*                                                                       */
   /* This function is deprecated because Carbon data types (FSRef)         */
-  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  /* are not cross-platform, and thus not suitable for the FreeType API.   */
   FT_EXPORT_DEF( FT_Error )
   FT_New_Face_From_FSRef( FT_Library    library,
                           const FSRef*  ref,
@@ -1458,7 +1458,7 @@
       error = FT_ERR( Cannot_Open_Resource );
 
     error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
-    if ( error != 0 || *aface != NULL )
+    if ( error || *aface )
       return error;
 
     /* fallback to datafork font */
@@ -1481,7 +1481,7 @@
   /*    accepts an FSSpec instead of a path.                               */
   /*                                                                       */
   /* This function is deprecated because Carbon data types (FSSpec)        */
-  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  /* are not cross-platform, and thus not suitable for the FreeType API.   */
   FT_EXPORT_DEF( FT_Error )
   FT_New_Face_From_FSSpec( FT_Library     library,
                            const FSSpec*  spec,
@@ -1515,7 +1515,7 @@
       error = FT_ERR( Cannot_Open_Resource );
 
     error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
-    if ( error != 0 || *aface != NULL )
+    if ( error || *aface )
       return error;
 
     /* fallback to datafork font */
diff --git a/builds/modules.mk b/builds/modules.mk
index 0b8b0c1..9a7a4a0 100644
--- a/builds/modules.mk
+++ b/builds/modules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -41,7 +41,7 @@
 
 define FTMODULE_H_INIT
 $(REMOVE_MODULE)
-@-echo Generating modules list in $(FTMODULE_H)...
+$(info Generating modules list in $(FTMODULE_H)...)
 $(OPEN_MODULE)/* This is a generated file. */$(CLOSE_MODULE)
 endef
 
@@ -56,7 +56,7 @@
 
 define FTMODULE_H_DONE
 $(OPEN_MODULE)/* EOF */$(CLOSE_MODULE)
-@echo done.
+$(info done.)
 endef
 
 
diff --git a/builds/newline b/builds/newline
deleted file mode 100644
index 8b13789..0000000
--- a/builds/newline
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/builds/os2/detect.mk b/builds/os2/detect.mk
index fde9327..aaf7848 100644
--- a/builds/os2/detect.mk
+++ b/builds/os2/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -65,7 +65,7 @@
     .PHONY: devel
   endif
 
-  setup: dos_setup
+  setup: std_setup
 
 endif   # test PLATFORM os2
 
diff --git a/builds/os2/os2-def.mk b/builds/os2/os2-def.mk
index 691036f..7ad1ffb 100644
--- a/builds/os2/os2-def.mk
+++ b/builds/os2/os2-def.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/os2/os2-dev.mk b/builds/os2/os2-dev.mk
index eacf58f..505a754 100644
--- a/builds/os2/os2-dev.mk
+++ b/builds/os2/os2-dev.mk
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/os2/os2-gcc.mk b/builds/os2/os2-gcc.mk
index 8390a36..65026b1 100644
--- a/builds/os2/os2-gcc.mk
+++ b/builds/os2/os2-gcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/symbian/bld.inf b/builds/symbian/bld.inf
index d3637f2..9c6d8dc 100644
--- a/builds/symbian/bld.inf
+++ b/builds/symbian/bld.inf
@@ -2,7 +2,7 @@
 // FreeType 2 project for the symbian platform
 //
 
-// Copyright 2008-2015 by
+// Copyright 2008-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used, modified,
@@ -18,49 +18,55 @@
 freetype.mmp
 
 PRJ_EXPORTS
-../../include/ft2build.h
-../../include/config/ftconfig.h	config/ftconfig.h
-../../include/config/ftheader.h	config/ftheader.h
-../../include/config/ftmodule.h	config/ftmodule.h
-../../include/config/ftoption.h	config/ftoption.h
-../../include/config/ftstdlib.h	config/ftstdlib.h
-../../include/freetype.h	freetype.h
-../../include/ftbbox.h		ftbbox.h
-../../include/ftbdf.h		ftbdf.h
-../../include/ftbitmap.h	ftbitmap.h
-../../include/ftcache.h		ftcache.h
-../../include/ftcid.h		ftcid.h
-../../include/fterrdef.h	fterrdef.h
-../../include/fterrors.h	fterrors.h
-../../include/ftfntfmt.h	ftfntfmt.h
-../../include/ftgasp.h		ftgasp.h
-../../include/ftglyph.h		ftglyph.h
-../../include/ftgxval.h		ftgxval.h
-../../include/ftgzip.h		ftgzip.h
-../../include/ftbzip2.h		ftbzip2.h
-../../include/ftimage.h		ftimage.h
-../../include/ftincrem.h	ftincrem.h
-../../include/ftlcdfil.h	ftlcdfil.h
-../../include/ftlist.h		ftlist.h
-../../include/ftlzw.h		ftlzw.h
-../../include/ftmac.h		ftmac.h
-../../include/ftmm.h		ftmm.h
-../../include/ftmodapi.h	ftmodapi.h
-../../include/ftmoderr.h	ftmoderr.h
-../../include/ftotval.h		ftotval.h
-../../include/ftoutln.h		ftoutln.h
-../../include/ftpfr.h		ftpfr.h
-../../include/ftrender.h	ftrender.h
-../../include/ftsizes.h		ftsizes.h
-../../include/ftsnames.h	ftsnames.h
-../../include/ftstroke.h	ftstroke.h
-../../include/ftsynth.h		ftsynth.h
-../../include/ftsystem.h	ftsystem.h
-../../include/fttrigon.h	fttrigon.h
-../../include/fttypes.h		fttypes.h
-../../include/ftwinfnt.h	ftwinfnt.h
-../../include/t1tables.h	t1tables.h
-../../include/ttnameid.h	ttnameid.h
-../../include/tttables.h	tttables.h
-../../include/tttags.h		tttags.h
-../../include/ttunpat.h		ttunpat.h
+../../include/freetype/ft2build.h
+../../include/freetype/config/ftconfig.h	config/ftconfig.h
+../../include/freetype/config/ftheader.h	config/ftheader.h
+../../include/freetype/config/ftmodule.h	config/ftmodule.h
+../../include/freetype/config/ftoption.h	config/ftoption.h
+../../include/freetype/config/ftstdlib.h	config/ftstdlib.h
+../../include/freetype/freetype.h		freetype.h
+../../include/freetype/ftadvanc.h		ftadvanc.h
+../../include/freetype/ftautoh.h		ftautoh.h
+../../include/freetype/ftbbox.h			ftbbox.h
+../../include/freetype/ftbdf.h			ftbdf.h
+../../include/freetype/ftbitmap.h		ftbitmap.h
+../../include/freetype/ftbzip2.h		ftbzip2.h
+../../include/freetype/ftcache.h		ftcache.h
+../../include/freetype/ftcffdrv.h		ftcffdrv.h
+../../include/freetype/ftcid.h			ftcid.h
+../../include/freetype/fterrdef.h		fterrdef.h
+../../include/freetype/fterrors.h		fterrors.h
+../../include/freetype/ftfntfmt.h		ftfntfmt.h
+../../include/freetype/ftgasp.h			ftgasp.h
+../../include/freetype/ftglyph.h		ftglyph.h
+../../include/freetype/ftgxval.h		ftgxval.h
+../../include/freetype/ftgzip.h			ftgzip.h
+../../include/freetype/ftimage.h		ftimage.h
+../../include/freetype/ftincrem.h		ftincrem.h
+../../include/freetype/ftlcdfil.h		ftlcdfil.h
+../../include/freetype/ftlist.h			ftlist.h
+../../include/freetype/ftlzw.h			ftlzw.h
+../../include/freetype/ftmac.h			ftmac.h
+../../include/freetype/ftmm.h			ftmm.h
+../../include/freetype/ftmodapi.h		ftmodapi.h
+../../include/freetype/ftmoderr.h		ftmoderr.h
+../../include/freetype/ftotval.h		ftotval.h
+../../include/freetype/ftoutln.h		ftoutln.h
+../../include/freetype/ftparams.h		ftparams.h
+../../include/freetype/ftpcfdrv.h		ftpcfdrv.h
+../../include/freetype/ftpfr.h			ftpfr.h
+../../include/freetype/ftrender.h		ftrender.h
+../../include/freetype/ftsizes.h		ftsizes.h
+../../include/freetype/ftsnames.h		ftsnames.h
+../../include/freetype/ftstroke.h		ftstroke.h
+../../include/freetype/ftsynth.h		ftsynth.h
+../../include/freetype/ftsystem.h		ftsystem.h
+../../include/freetype/ftt1drv.h		ftt1drv.h
+../../include/freetype/fttrigon.h		fttrigon.h
+../../include/freetype/ftttdrv.h		ftttdrv.h
+../../include/freetype/fttypes.h		fttypes.h
+../../include/freetype/ftwinfnt.h		ftwinfnt.h
+../../include/freetype/t1tables.h		t1tables.h
+../../include/freetype/ttnameid.h		ttnameid.h
+../../include/freetype/tttables.h		tttables.h
+../../include/freetype/tttags.h			tttags.h
diff --git a/builds/symbian/freetype.mmp b/builds/symbian/freetype.mmp
index b7691f0..4e4a041 100644
--- a/builds/symbian/freetype.mmp
+++ b/builds/symbian/freetype.mmp
@@ -2,7 +2,7 @@
 // FreeType 2 makefile for the symbian platform
 //
 
-// Copyright 2008-2015 by
+// Copyright 2008-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used, modified,
@@ -28,13 +28,11 @@
 source ftbdf.c
 source ftbitmap.c
 source ftcid.c
-source ftfntfmt.c
 source ftfstype.c
 source ftgasp.c
 source ftglyph.c
 source ftgxval.c
 source ftinit.c
-source ftlcdfil.c
 source ftmm.c
 source ftotval.c
 source ftpatent.c
@@ -49,6 +47,10 @@
 
 source bdf.c
 
+sourcepath ..\..\src\bzip2
+
+source ftbzip2.c
+
 sourcepath ..\..\src\cache
 
 source ftcache.c
@@ -65,10 +67,6 @@
 
 source ftgzip.c
 
-sourcepath ..\..\src\bzip2
-
-source ftbzip2.c
-
 sourcepath ..\..\src\lzw
 
 source ftlzw.c
@@ -126,12 +124,12 @@
 systeminclude		\epoc32\include\stdapis
 userinclude		..\..\src\autofit
 userinclude		..\..\src\bdf
+userinclude		..\..\src\bzip2
 userinclude		..\..\src\cache
 userinclude		..\..\src\cff
 userinclude		..\..\src\cid
 userinclude		..\..\src\gxvalid
 userinclude		..\..\src\gzip
-userinclude		..\..\src\bzip2
 userinclude		..\..\src\lzw
 userinclude		..\..\src\otvalid
 userinclude		..\..\src\pcf
diff --git a/builds/toplevel.mk b/builds/toplevel.mk
index 9fe364d..7ce0ed8 100644
--- a/builds/toplevel.mk
+++ b/builds/toplevel.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -172,7 +172,8 @@
 # get FreeType version string, using a
 # poor man's `sed' emulation with make's built-in string functions
 #
-work := $(strip $(shell $(CAT) $(TOP_DIR)/include/freetype.h))
+work := $(strip $(shell $(CAT) \
+                  $(subst /,$(SEP),$(TOP_DIR)/include/freetype/freetype.h)))
 work := $(subst |,x,$(work))
 work := $(subst $(space),|,$(work))
 work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work))
diff --git a/builds/unix/.gitignore b/builds/unix/.gitignore
index e4e0a12..f89b226 100644
--- a/builds/unix/.gitignore
+++ b/builds/unix/.gitignore
@@ -10,6 +10,7 @@
 freetype2.pc
 freetype-config
 ftconfig.h
+ftoption.h
 install-sh
 libtool
 ltmain.sh
diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw
index b828bf0..baab79d 100644
--- a/builds/unix/configure.raw
+++ b/builds/unix/configure.raw
@@ -2,7 +2,7 @@
 #
 # Process this file with autoconf to produce a configure script.
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -15,9 +15,9 @@
 AC_CONFIG_SRCDIR([ftconfig.in])
 
 
-# Don't forget to update docs/VERSION.DLL!
+# Don't forget to update `docs/VERSIONS.TXT'!
 
-version_info='18:0:12'
+version_info='22:1:16'
 AC_SUBST([version_info])
 ft_version=`echo $version_info | tr : .`
 AC_SUBST([ft_version])
@@ -37,6 +37,7 @@
 PKG_PROG_PKG_CONFIG([0.24])
 
 LT_INIT(win32-dll)
+LT_PROG_RC
 
 
 # checks for native programs to generate building tool
@@ -70,24 +71,29 @@
 AC_SUBST(EXEEXT_BUILD)
 
 
-# auxiliary programs
-
-AC_CHECK_PROG([RMDIR], [rmdir], [rmdir])
-
-
-# Since this file will be finally moved to another directory we make
-# the path of the install script absolute.  This small code snippet has
-# been taken from automake's `ylwrap' script.
+# Since these files will be eventually called from another directory (namely
+# from the top level) we make the path of the scripts absolute.
+#
+# This small code snippet has been taken from automake's `ylwrap' script.
 
 AC_PROG_INSTALL
 case "$INSTALL" in
-/*)
+[[\\/]]* | ?:[[\\/]]*)
   ;;
-*/*)
+*[[\\/]]*)
   INSTALL="`pwd`/$INSTALL"
   ;;
 esac
 
+AC_PROG_MKDIR_P
+case "$MKDIR_P" in
+[[\\/]]* | ?:[[\\/]]*)
+  ;;
+*[[\\/]]*)
+  MKDIR_P="`pwd`/$MKDIR_P"
+  ;;
+esac
+
 
 # checks for header files
 
@@ -100,21 +106,20 @@
 AC_C_CONST
 AC_CHECK_SIZEOF([int])
 AC_CHECK_SIZEOF([long])
+AC_TYPE_LONG_LONG_INT
 
 
 # check whether cpp computation of size of int and long in ftconfig.in works
 
 AC_MSG_CHECKING([whether cpp computation of bit length in ftconfig.in works])
 orig_CPPFLAGS="${CPPFLAGS}"
-CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
+CPPFLAGS="-I${srcdir} -I. -I${srcdir}/../../include/freetype/config ${CPPFLAGS}"
 
 ac_clean_files=
-for f in ft2build.h ftoption.h ftstdlib.h; do
-  if test ! -f $f; then
-    ac_clean_files="$ac_clean_files $f"
-    touch $f
-  fi
-done
+if test ! -f ft2build.h; then
+  ac_clean_files=ft2build.h
+  touch ft2build.h
+fi
 
 cat > conftest.c <<\_ACEOF
 #include <limits.h>
@@ -172,9 +177,20 @@
 
 CPPFLAGS="${orig_CPPFLAGS}"
 
+AC_ARG_ENABLE([freetype-config],
+  AS_HELP_STRING([--enable-freetype-config], [install freetype-config]),
+  [case "${enableval}" in
+    yes) enable_freetype_config="TRUE" ;;
+    no)  enable_freetype_config="FALSE" ;;
+    *)   AC_MSG_ERROR([unknown value '${enableval}' passed with --enable-freetype-config]) ;;
+   esac], [enable_freetype_config="FALSE"])
+
+AC_SUBST(INSTALL_FT2_CONFIG, [$enable_freetype_config])
 
 # checks for library functions
 
+AC_SYS_LARGEFILE
+
 # Here we check whether we can use our mmap file component.
 
 AC_ARG_ENABLE([mmap],
@@ -230,6 +246,9 @@
   *-*-mingw*)
     XX_ANSIFLAGS="-pedantic"
     ;;
+  *-*-aix*)
+    XX_ANSIFLAGS="-pedantic"
+    ;;
   *)
     GCC_VERSION=`$CC -dumpversion`
     GCC_MAJOR=`echo "$GCC_VERSION" | sed 's/\([[^.]][[^.]]*\).*/\1/'`
@@ -264,7 +283,7 @@
             }
 
           ])],
-        [AC_MSG_RESULT([ok, add it to XX_ANSIFLAGS])
+        [AC_MSG_RESULT([ok, adding to XX_ANSIFLAGS])
          XX_ANSIFLAGS="${XX_ANSIFLAGS} ${a}"
         ],
         [AC_MSG_RESULT([no])])
@@ -289,15 +308,27 @@
 AC_SUBST([XX_ANSIFLAGS])
 
 
+# It is recommended that shared libraries hide symbols except those with
+# explicit __attribute__((visibility("default"))).
+#
+AC_MSG_CHECKING([for -fvisibility=hidden compiler flag])
+orig_CFLAGS="${CFLAGS}"
+CFLAGS="${CFLAGS} -fvisibility=hidden"
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],
+                  AC_MSG_RESULT(yes),
+                  CFLAGS="${orig_CFLAGS}"
+                  AC_MSG_RESULT(no))
+
+
 # All library tests below try `pkg-config' first.  If that fails, a function
 # from the library is tested in the traditional autoconf way (zlib, bzip2),
 # or a config script is called (libpng).
 #
 # The `xxx_reqpriv' variables are for the `Requires.private' field in
-# `freetype2.pc'.  The `xxx_libpriv' variables are for the `Libs.private'
+# `freetype2.pc'.  The `xxx_libspriv' variables are for the `Libs.private'
 # field in `freetype2.pc' if pkg-config doesn't find a proper .pc file.
 #
-# The `xxx_libstaticconf' variables are for the `freetype-config' script.
+# The `xxx_libsstaticconf' variables are for the `freetype-config' script.
 #
 # Note that a call to PKG_CHECK_MODULES(XXX, ...) sets and creates the
 # output variables `XXX_CFLAGS' and `XXX_LIBS'.  In case one or both are set
@@ -326,15 +357,15 @@
   if test $have_zlib_pkg = yes; then
     # we have zlib.pc
     zlib_reqpriv="$zlib_pkg"
-    zlib_libpriv=
-    zlib_libstaticconf=`$PKG_CONFIG --static --libs "$zlib_pkg"`
+    zlib_libspriv=
+    zlib_libsstaticconf=`$PKG_CONFIG --static --libs "$zlib_pkg"`
   else
     zlib_reqpriv=
 
     if test "$have_zlib" != no; then
       # ZLIB_CFLAGS and ZLIB_LIBS are set by the user
-      zlib_libpriv="$ZLIB_LIBS"
-      zlib_libstaticconf="$ZLIB_LIBS"
+      zlib_libspriv="$ZLIB_LIBS"
+      zlib_libsstaticconf="$ZLIB_LIBS"
       have_zlib="yes (ZLIB_CFLAGS and ZLIB_LIBS)"
     else
       # fall back to standard autoconf test
@@ -342,9 +373,9 @@
                    [gzsetparams],
                    [AC_CHECK_HEADER([zlib.h],
                                     [have_zlib="yes (autoconf test)"
-                                     zlib_libpriv="-lz"
-                                     zlib_libstaticconf="$zlib_libpriv"
-                                     ZLIB_LIBS="$zlib_libpriv"])])
+                                     zlib_libspriv="-lz"
+                                     zlib_libsstaticconf="$zlib_libspriv"
+                                     ZLIB_LIBS="$zlib_libspriv"])])
     fi
   fi
 fi
@@ -375,15 +406,15 @@
   if test $have_bzip2_pkg = yes; then
     # we have bzip2.pc
     bzip2_reqpriv="$bzip2_pkg"
-    bzip2_libpriv=
-    bzip2_libstaticconf=`$PKG_CONFIG --static --libs "$bzip2_pkg"`
+    bzip2_libspriv=
+    bzip2_libsstaticconf=`$PKG_CONFIG --static --libs "$bzip2_pkg"`
   else
     bzip2_reqpriv=
 
     if test "$have_bzip2" != no; then
       # BZIP2_CFLAGS and BZIP2_LIBS are set by the user
-      bzip2_libpriv="$BZIP2_LIBS"
-      bzip2_libstaticconf="$BZIP2_LIBS"
+      bzip2_libspriv="$BZIP2_LIBS"
+      bzip2_libsstaticconf="$BZIP2_LIBS"
       have_bzip2="yes (BZIP2_CFLAGS and BZIP2_LIBS)"
     else
       # fall back to standard autoconf test
@@ -391,9 +422,9 @@
                    [BZ2_bzDecompress],
                    [AC_CHECK_HEADER([bzlib.h],
                                     [have_bzip2="yes (autoconf test)"
-                                     bzip2_libpriv="-lbz2"
-                                     bzip2_libstaticconf="$bzip2_libpriv"
-                                     BZIP2_LIBS="$bzip2_libpriv"])])
+                                     bzip2_libspriv="-lbz2"
+                                     bzip2_libsstaticconf="$bzip2_libspriv"
+                                     BZIP2_LIBS="$bzip2_libspriv"])])
     fi
   fi
 fi
@@ -424,15 +455,15 @@
   if test $have_libpng_pkg = yes; then
     # we have libpng.pc
     libpng_reqpriv="$libpng_pkg"
-    libpng_libpriv=
-    libpng_libstaticconf=`$PKG_CONFIG --static --libs "$libpng_pkg"`
+    libpng_libspriv=
+    libpng_libsstaticconf=`$PKG_CONFIG --static --libs "$libpng_pkg"`
   else
     libpng_reqpriv=
 
     if test "$have_libpng" != no; then
       # LIBPNG_CFLAGS and LIBPNG_LIBS are set by the user
-      libpng_libpriv="$LIBPNG_LIBS"
-      libpng_libstaticconf="$LIBPNG_LIBS"
+      libpng_libspriv="$LIBPNG_LIBS"
+      libpng_libsstaticconf="$LIBPNG_LIBS"
       have_libpng="yes (LIBPNG_CFLAGS and LIBPNG_LIBS)"
     else
       # fall back to config script.
@@ -440,8 +471,8 @@
       if which libpng-config > /dev/null 2>&1; then
         LIBPNG_CFLAGS=`libpng-config --cflags`
         LIBPNG_LIBS=`libpng-config --ldflags`
-        libpng_libpriv=`libpng-config --static --ldflags`
-        libpng_libstaticconf="$libpng_libpriv"
+        libpng_libspriv=`libpng-config --static --ldflags`
+        libpng_libsstaticconf="$libpng_libspriv"
         have_libpng="yes (libpng-config)"
         AC_MSG_RESULT([yes])
       else
@@ -465,7 +496,7 @@
 
 have_harfbuzz=no
 if test x"$with_harfbuzz" = xyes -o x"$with_harfbuzz" = xauto; then
-  harfbuzz_pkg="harfbuzz >= 0.9.19"
+  harfbuzz_pkg="harfbuzz >= 1.3.0"
   have_harfbuzz_pkg=no
 
   if test x"$HARFBUZZ_CFLAGS" = x -a x"$HARFBUZZ_LIBS" = x; then
@@ -477,15 +508,15 @@
   if test $have_harfbuzz_pkg = yes; then
     # we have harfbuzz.pc
     harfbuzz_reqpriv="$harfbuzz_pkg"
-    harfbuzz_libpriv=
-    harfbuzz_libstaticconf=`$PKG_CONFIG --static --libs "$harfbuzz_pkg"`
+    harfbuzz_libspriv=
+    harfbuzz_libsstaticconf=`$PKG_CONFIG --static --libs "$harfbuzz_pkg"`
   else
     harfbuzz_reqpriv=
 
     if test "$have_harfbuzz" != no; then
       # HARFBUZZ_CFLAGS and HARFBUZZ_LIBS are set by the user
-      harfbuzz_libpriv="$HARFBUZZ_LIBS"
-      harfbuzz_libstaticconf="$HARFBUZZ_LIBS"
+      harfbuzz_libspriv="$HARFBUZZ_LIBS"
+      harfbuzz_libsstaticconf="$HARFBUZZ_LIBS"
       have_harfbuzz="yes (HARFBUZZ_CFLAGS and HARFBUZZ_LIBS)"
     else
       # since HarfBuzz is quite a new library we don't fall back to a
@@ -500,6 +531,21 @@
 fi
 
 
+# check for librt
+#
+# We need `clock_gettime' for the `ftbench' demo program.
+#
+# The code is modeled after gnulib's file `clock_time.m4', ignoring
+# very old Solaris systems.
+
+LIB_CLOCK_GETTIME=
+AC_SEARCH_LIBS([clock_gettime],
+               [rt],
+               [test "$ac_cv_search_clock_gettime" = "none required" \
+                || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
+AC_SUBST([LIB_CLOCK_GETTIME])
+
+
 # Some options handling SDKs/archs in CFLAGS should be copied
 # to LDFLAGS. Apple TechNote 2137 recommends to include these
 # options in CFLAGS but not in LDFLAGS.
@@ -926,10 +972,10 @@
                         -e 's/,*$//'       \
                         -e 's/,/, /g'`
 
-LIBS_PRIVATE="$zlib_libpriv     \
-              $bzip2_libpriv    \
-              $libpng_libpriv   \
-              $harfbuzz_libpriv \
+LIBS_PRIVATE="$zlib_libspriv     \
+              $bzip2_libspriv    \
+              $libpng_libspriv   \
+              $harfbuzz_libspriv \
               $ft2_extra_libs"
 # beautify
 LIBS_PRIVATE=`echo "$LIBS_PRIVATE"  \
@@ -937,11 +983,11 @@
                     -e 's/  *$//'   \
                     -e 's/  */ /g'`
 
-LIBSSTATIC_CONFIG="-lfreetype              \
-                   $zlib_libstaticconf     \
-                   $bzip2_libstaticconf    \
-                   $libpng_libstaticconf   \
-                   $harfbuzz_libstaticconf \
+LIBSSTATIC_CONFIG="-lfreetype               \
+                   $zlib_libsstaticconf     \
+                   $bzip2_libsstaticconf    \
+                   $libpng_libsstaticconf   \
+                   $harfbuzz_libsstaticconf \
                    $ft2_extra_libs"
 # remove -L/usr/lib and -L/usr/lib64 since `freetype-config' adds them later
 # on if necessary; also beautify
@@ -966,27 +1012,63 @@
 # changing LDFLAGS value should only be done after
 # lt_cv_prog_compiler_static_works test
 
-if test "$have_zlib" != no; then
-  CFLAGS="$CFLAGS $ZLIB_CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
-  LDFLAGS="$LDFLAGS $ZLIB_LIBS"
-fi
+ftoption_set()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|#define $1|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
 
+ftoption_unset()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|/* #undef $1 */|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
+if test "$have_zlib" != no; then
+  CFLAGS="$CFLAGS $ZLIB_CFLAGS"
+  LDFLAGS="$LDFLAGS $ZLIB_LIBS"
+  ftoption_set FT_CONFIG_OPTION_SYSTEM_ZLIB
+else
+  ftoption_unset FT_CONFIG_OPTION_SYSTEM_ZLIB
+fi
 if test "$have_bzip2" != no; then
-  CFLAGS="$CFLAGS $BZIP2_CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2"
+  CFLAGS="$CFLAGS $BZIP2_CFLAGS"
   LDFLAGS="$LDFLAGS $BZIP2_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_BZIP2
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_BZIP2
 fi
 if test "$have_libpng" != no; then
-  CFLAGS="$CFLAGS $LIBPNG_CFLAGS -DFT_CONFIG_OPTION_USE_PNG"
+  CFLAGS="$CFLAGS $LIBPNG_CFLAGS"
   LDFLAGS="$LDFLAGS $LIBPNG_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_PNG
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_PNG
 fi
 if test "$have_harfbuzz" != no; then
-  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS -DFT_CONFIG_OPTION_USE_HARFBUZZ"
+  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS"
   LDFLAGS="$LDFLAGS $HARFBUZZ_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_HARFBUZZ
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_HARFBUZZ
 fi
 
 AC_SUBST([CFLAGS])
 AC_SUBST([LDFLAGS])
 
+# We don't want to use a template file for `ftoption.h', since compilation
+# should work without calling a configure script also.  For this reason, we
+# copy the `include/freetype/config/ftoption.h' file to the `unix/builds'
+# directory (using a dummy `AC_CONFIG_FILES' call) and apply the just
+# constructed $FTOPTION_H_SED regexp (using the post-action of
+# `AC_CONFIG_FILES'); this is also the version that gets installed later on.
+#
+AC_CONFIG_FILES([ftoption.h:${srcdir}/../../include/freetype/config/ftoption.h],
+  [mv ftoption.h ftoption.tmp
+   eval "sed $FTOPTION_H_SED < ftoption.tmp > ftoption.h"
+   rm ftoption.tmp],
+  [FTOPTION_H_SED="$FTOPTION_H_SED"])
+
 # configuration file -- stay in 8.3 limit
 #
 # since #undef doesn't survive in configuration header files we replace
diff --git a/builds/unix/detect.mk b/builds/unix/detect.mk
index ef007bf..54daa07 100644
--- a/builds/unix/detect.mk
+++ b/builds/unix/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -76,17 +76,14 @@
 
   have_Makefile := $(wildcard $(OBJ_DIR)/Makefile)
 
-      CONFIG_SHELL ?= /bin/sh
       setup: std_setup
   ifdef must_configure
     ifneq ($(have_Makefile),)
       # we are building FT2 not in the src tree
-	      CONFIG_SHELL="$(CONFIG_SHELL)" \
-	        $(CONFIG_SHELL) $(TOP_DIR)/builds/unix/configure $(value CFG)
+	        $(TOP_DIR)/builds/unix/configure $(value CFG)
     else
 	      cd builds/unix; \
-	      CONFIG_SHELL="$(CONFIG_SHELL)" \
-	        $(CONFIG_SHELL) ./configure $(value CFG)
+	        ./configure $(value CFG)
     endif
   endif
 
diff --git a/builds/unix/freetype-config.in b/builds/unix/freetype-config.in
index 269356c..2d5b90d 100644
--- a/builds/unix/freetype-config.in
+++ b/builds/unix/freetype-config.in
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright 2000-2015 by
+# Copyright 2000-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -12,12 +12,55 @@
 LC_ALL=C
 export LC_ALL
 
-prefix="%prefix%"
-exec_prefix="%exec_prefix%"
-exec_prefix_set="no"
-includedir="%includedir%"
-libdir="%libdir%"
-enable_shared="%build_libtool_libs%"
+
+# if `pkg-config' is available, use values from `freetype2.pc'
+%PKG_CONFIG% --atleast-pkgconfig-version 0.24 >/dev/null 2>&1
+if test $? -eq 0 ; then
+  # note that option `--variable' is not affected by the
+  # PKG_CONFIG_SYSROOT_DIR environment variable
+  if test "x$SYSROOT" != "x" ; then
+    PKG_CONFIG_SYSROOT_DIR="$SYSROOT"
+    export PKG_CONFIG_SYSROOT_DIR
+  fi
+
+  prefix=`%PKG_CONFIG% --variable prefix freetype2`
+  exec_prefix=`%PKG_CONFIG% --variable exec_prefix freetype2`
+
+  includedir=`%PKG_CONFIG% --variable includedir freetype2`
+  libdir=`%PKG_CONFIG% --variable libdir freetype2`
+
+  version=`%PKG_CONFIG% --modversion freetype2`
+
+  cflags=`%PKG_CONFIG% --cflags freetype2`
+  dynamic_libs=`%PKG_CONFIG% --libs freetype2`
+  static_libs=`%PKG_CONFIG% --static --libs freetype2`
+else
+  prefix="%prefix%"
+  exec_prefix="%exec_prefix%"
+
+  includedir="%includedir%"
+  libdir="%libdir%"
+
+  version=%ft_version%
+
+  cflags="-I${SYSROOT}$includedir/freetype2"
+  dynamic_libs="-lfreetype"
+  static_libs="%LIBSSTATIC_CONFIG%"
+  if test "${SYSROOT}$libdir" != "/usr/lib"   &&
+     test "${SYSROOT}$libdir" != "/usr/lib64" ; then
+    libs_L="-L${SYSROOT}$libdir"
+  fi
+fi
+
+orig_prefix=$prefix
+orig_exec_prefix=$exec_prefix
+
+orig_includedir=$includedir
+orig_libdir=$libdir
+
+include_suffix=`echo $includedir | sed "s|$prefix||"`
+lib_suffix=`echo $libdir | sed "s|$exec_prefix||"`
+
 
 usage()
 {
@@ -40,14 +83,17 @@
                          library
   --static               make command line options display flags
                          for static linking
+  --help                 display this help and exit
 EOF
   exit $1
 }
 
+
 if test $# -eq 0 ; then
   usage 1 1>&2
 fi
 
+
 while test $# -gt 0 ; do
   case "$1" in
   -*=*)
@@ -75,8 +121,8 @@
     echo_exec_prefix=yes
     ;;
   --version)
-    echo %ft_version%
-    exit 0
+    echo_version=yes
+    break
     ;;
   --ftversion)
     echo_ft_version=yes
@@ -93,6 +139,9 @@
   --static)
     show_static=yes
     ;;
+  --help)
+    usage 0
+    ;;
   *)
     usage 1 1>&2
     ;;
@@ -100,12 +149,27 @@
   shift
 done
 
+
 if test "$local_prefix" = "yes" ; then
   if test "$exec_prefix_set" != "yes" ; then
     exec_prefix=$prefix
   fi
 fi
 
+if test "$local_prefix" = "yes" ; then
+  includedir=${prefix}${include_suffix}
+  if test "$exec_prefix_set" = "yes" ; then
+    libdir=${exec_prefix}${lib_suffix}
+  else
+    libdir=${prefix}${lib_suffix}
+  fi
+fi
+
+
+if test "$echo_version" = "yes" ; then
+  echo $version
+fi
+
 if test "$echo_prefix" = "yes" ; then
   echo ${SYSROOT}$prefix
 fi
@@ -114,50 +178,34 @@
   echo ${SYSROOT}$exec_prefix
 fi
 
-if test "$exec_prefix_set" = "yes" ; then
-  libdir=$exec_prefix/lib
-else
-  if test "$local_prefix" = "yes" ; then
-    includedir=$prefix/include
-    libdir=$prefix/lib
-  fi
-fi
-
 if test "$echo_ft_version" = "yes" ; then
-  major=`grep define ${SYSROOT}$includedir/freetype2/freetype.h \
+  major=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
          | grep FREETYPE_MAJOR \
          | sed 's/.*[ 	]\([0-9][0-9]*\).*/\1/'`
-  minor=`grep define ${SYSROOT}$includedir/freetype2/freetype.h \
+  minor=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
          | grep FREETYPE_MINOR \
          | sed 's/.*[ 	]\([0-9][0-9]*\).*/\1/'`
-  patch=`grep define ${SYSROOT}$includedir/freetype2/freetype.h \
+  patch=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
          | grep FREETYPE_PATCH \
          | sed 's/.*[ 	]\([0-9][0-9]*\).*/\1/'`
   echo $major.$minor.$patch
 fi
 
 if test "$echo_cflags" = "yes" ; then
-  cflags="-I${SYSROOT}$includedir/freetype2"
-  echo $cflags
+  echo $cflags | sed "s|$orig_includedir/freetype2|$includedir/freetype2|"
 fi
 
 if test "$echo_libs" = "yes" ; then
-  libs="-lfreetype"
-  staticlibs="%LIBSSTATIC_CONFIG%"
   if test "$show_static" = "yes" ; then
-    libs="$staticlibs"
-  fi
-  if test "${SYSROOT}$libdir" != "/usr/lib"  &&
-     test "${SYSROOT}$libdir" != "/usr/lib64"; then
-    echo -L${SYSROOT}$libdir $libs
+    libs="$libs_L $static_libs"
   else
-    echo $libs
+    libs="$libs_L $dynamic_libs"
   fi
+  echo $libs | sed "s|$orig_libdir|$libdir|"
 fi
 
 if test "$echo_libtool" = "yes" ; then
-  convlib="libfreetype.la"
-  echo ${SYSROOT}$libdir/$convlib
+  echo ${SYSROOT}$libdir/libfreetype.la
 fi
 
 # EOF
diff --git a/builds/unix/freetype2.in b/builds/unix/freetype2.in
index a488d96..2d759ec 100644
--- a/builds/unix/freetype2.in
+++ b/builds/unix/freetype2.in
@@ -1,14 +1,14 @@
 prefix=%prefix%
 exec_prefix=%exec_prefix%
 libdir=%libdir%
-includedir=%includedir%/freetype2
+includedir=%includedir%
 
 Name: FreeType 2
-URL: http://freetype.org
+URL: https://freetype.org
 Description: A free, high-quality, and portable font engine.
 Version: %ft_version%
 Requires:
 Requires.private: %REQUIRES_PRIVATE%
 Libs: -L${libdir} -lfreetype
 Libs.private: %LIBS_PRIVATE%
-Cflags: -I${includedir}
+Cflags: -I${includedir}/freetype2
diff --git a/builds/unix/freetype2.m4 b/builds/unix/freetype2.m4
index 3dc8807..af2e659 100644
--- a/builds/unix/freetype2.m4
+++ b/builds/unix/freetype2.m4
@@ -1,7 +1,7 @@
 # Configure paths for FreeType2
 # Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/unix/ft-munmap.m4 b/builds/unix/ft-munmap.m4
index 72b0864..00eda49 100644
--- a/builds/unix/ft-munmap.m4
+++ b/builds/unix/ft-munmap.m4
@@ -1,6 +1,6 @@
 ## FreeType specific autoconf tests
 #
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/unix/ftconfig.in b/builds/unix/ftconfig.in
index f6d459f..b9c21da 100644
--- a/builds/unix/ftconfig.in
+++ b/builds/unix/ftconfig.in
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    UNIX-specific configuration file (specification only).               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -34,8 +34,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTCONFIG_H__
-#define __FTCONFIG_H__
+#ifndef FTCONFIG_H_
+#define FTCONFIG_H_
 
 #include <ft2build.h>
 #include FT_CONFIG_OPTIONS_H
@@ -86,7 +86,7 @@
 #else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */
 
   /* Following cpp computation of the bit length of int and long */
-  /* is copied from default include/config/ftconfig.h.           */
+  /* is copied from default include/freetype/config/ftconfig.h.  */
   /* If any improvement is required for this file, it should be  */
   /* applied to the original header file for the builders that   */
   /* do not use configure script.                                */
@@ -287,8 +287,8 @@
 #endif
 
 
-  /* determine whether we have a 64-bit int type for platforms without */
-  /* Autoconf                                                          */
+  /* determine whether we have a 64-bit int type  */
+  /* (mostly for environments without `autoconf') */
 #if FT_SIZEOF_LONG == 8
 
   /* FT_LONG64 must be defined if a 64-bit type is available */
@@ -296,6 +296,16 @@
 #define FT_INT64   long
 #define FT_UINT64  unsigned long
 
+  /* we handle the LLP64 scheme separately for GCC and clang, */
+  /* suppressing the `long long' warning                      */
+#elif ( FT_SIZEOF_LONG == 4 )       && \
+      defined( HAVE_LONG_LONG_INT ) && \
+      defined( __GNUC__ )
+#pragma GCC diagnostic ignored "-Wlong-long"
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
   /*************************************************************************/
   /*                                                                       */
   /* A 64-bit data type may create compilation problems if you compile     */
@@ -305,7 +315,13 @@
   /*                                                                       */
 #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 )
 
-#if defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L
+
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
 
   /* this compiler provides the __int64 type */
 #define FT_LONG64
@@ -339,7 +355,7 @@
 #define FT_INT64   long long int
 #define FT_UINT64  unsigned long long int
 
-#endif /* _MSC_VER */
+#endif /* __STDC_VERSION__ >= 199901L */
 
 #endif /* FT_SIZEOF_LONG == 8 */
 
@@ -349,6 +365,15 @@
 #endif
 
 
+#ifdef _WIN64
+  /* only 64bit Windows uses the LLP64 data model, i.e., */
+  /* 32bit integers, 64bit pointers                      */
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x)
+#else
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x)
+#endif
+
+
   /*************************************************************************/
   /*                                                                       */
   /* miscellaneous                                                         */
@@ -362,15 +387,24 @@
 
 
   /* typeof condition taken from gnulib's `intprops.h' header file */
-#if ( __GNUC__ >= 2                         || \
-      defined( __IBM__TYPEOF__ )            || \
-      ( __SUNPRO_C >= 0x5110 && !__STDC__ ) )
-#define TYPEOF( type )  (__typeof__ (type))
+#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 )                       || \
+      ( defined( __IBMC__ ) && __IBMC__ >= 1210 &&                      \
+        defined( __IBM__TYPEOF__ ) )                                 || \
+      ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) )
+#define FT_TYPEOF( type )  ( __typeof__ ( type ) )
 #else
-#define TYPEOF( type )  /* empty */
+#define FT_TYPEOF( type )  /* empty */
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -392,6 +426,12 @@
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -414,14 +454,63 @@
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL or DSO with hidden visibility      */
+  /*   some systems/compilers need a special attribute in front OR after   */
+  /*   the return type of function declarations.                           */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
-#ifdef __cplusplus
+#ifdef FT2_BUILD_LIBRARY
+
+#if defined( _WIN32 ) && ( defined( _DLL ) || defined( DLL_EXPORT ) )
+#define FT_EXPORT( x )  __declspec( dllexport )  x
+#elif defined( __GNUC__ ) && __GNUC__ >= 4
+#define FT_EXPORT( x )  __attribute__(( visibility( "default" ) ))  x
+#elif defined( __cplusplus )
 #define FT_EXPORT( x )  extern "C"  x
 #else
 #define FT_EXPORT( x )  extern  x
 #endif
 
+#else
+
+#if defined( FT2_DLLIMPORT )
+#define FT_EXPORT( x )  __declspec( dllimport )  x
+#elif defined( __cplusplus )
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif
+
 #endif /* !FT_EXPORT */
 
 
@@ -457,7 +546,13 @@
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -477,6 +572,16 @@
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
@@ -491,7 +596,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCONFIG_H__ */
+#endif /* FTCONFIG_H_ */
 
 
 /* END */
diff --git a/builds/unix/ftsystem.c b/builds/unix/ftsystem.c
index d7513d9..8fdbeb0 100644
--- a/builds/unix/ftsystem.c
+++ b/builds/unix/ftsystem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Unix-specific FreeType low-level system interface (body).            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/builds/unix/install.mk b/builds/unix/install.mk
index 35cff20..c08c3b7 100644
--- a/builds/unix/install.mk
+++ b/builds/unix/install.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -24,50 +24,58 @@
 
 # Unix installation and deinstallation targets.
 #
-# Note that we remove any data in the `freetype' subdirectory found in
-# `$(includedir)/freetype2', which was the previous location of the header
-# files up to version 2.5.0.
+# Note that we remove any data found in `$(includedir)/freetype2' before
+# installing new files to avoid interferences with files installed by
+# previous FreeType versions (which use slightly different locations).
+#
+# We also remove `$(includedir)/ft2build.h' for the same reason.
+#
+# Note that some header files get handled twice for simplicity; a special,
+# configured version overwrites the generic one.
 #
 install: $(PROJECT_LIBRARY)
-	$(MKINSTALLDIRS) $(DESTDIR)$(libdir)                      \
-                         $(DESTDIR)$(libdir)/pkgconfig            \
-                         $(DESTDIR)$(includedir)/freetype2/config \
-                         $(DESTDIR)$(bindir)                      \
-                         $(DESTDIR)$(datadir)/aclocal             \
+	-$(DELDIR) $(DESTDIR)$(includedir)/freetype2
+	-$(DELETE) $(DESTDIR)$(includedir)/ft2build.h
+	$(MKINSTALLDIRS) $(DESTDIR)$(libdir)                               \
+                         $(DESTDIR)$(libdir)/pkgconfig                     \
+                         $(DESTDIR)$(includedir)/freetype2/freetype/config \
+                         $(DESTDIR)$(datadir)/aclocal
+ifeq ($(INSTALL_FT2_CONFIG),TRUE)
+	$(MKINSTALLDIRS) $(DESTDIR)$(bindir)                               \
                          $(DESTDIR)$(mandir)/man1
+endif
 	$(LIBTOOL) --mode=install $(INSTALL)                             \
                                   $(PROJECT_LIBRARY) $(DESTDIR)$(libdir)
-	-for P in $(PUBLIC_H) ; do                  \
-          $(INSTALL_DATA)                           \
-            $$P $(DESTDIR)$(includedir)/freetype2 ; \
+	-for P in $(PUBLIC_H) ; do                           \
+          $(INSTALL_DATA)                                    \
+            $$P $(DESTDIR)$(includedir)/freetype2/freetype ; \
         done
-	-for P in $(CONFIG_H) ; do                         \
-          $(INSTALL_DATA)                                  \
-            $$P $(DESTDIR)$(includedir)/freetype2/config ; \
+	-for P in $(CONFIG_H) ; do                                  \
+          $(INSTALL_DATA)                                           \
+            $$P $(DESTDIR)$(includedir)/freetype2/freetype/config ; \
         done
-	-$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/config/*
-	-$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/config
-	-$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/*
-	-$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype
-	$(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h               \
-          $(DESTDIR)$(includedir)/freetype2/config/ftconfig.h
-	$(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h                 \
-          $(DESTDIR)$(includedir)/freetype2/config/ftmodule.h
-	$(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \
-          $(DESTDIR)$(bindir)/freetype-config
-	$(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \
+	$(INSTALL_DATA) $(TOP_DIR)/include/ft2build.h                  \
+          $(DESTDIR)$(includedir)/freetype2/ft2build.h
+	$(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h                        \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h
+	$(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h                          \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h
+	$(INSTALL_DATA) $(OBJ_BUILD)/ftoption.h                        \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftoption.h
+	$(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4             \
           $(DESTDIR)$(datadir)/aclocal/freetype2.m4
-	$(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc \
+	$(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc             \
           $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc
-	$(INSTALL_DATA) $(TOP_DIR)/docs/freetype-config.1 \
+ifeq ($(INSTALL_FT2_CONFIG),TRUE)
+	$(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config          \
+          $(DESTDIR)$(bindir)/freetype-config
+	$(INSTALL_DATA) $(TOP_DIR)/docs/freetype-config.1              \
           $(DESTDIR)$(mandir)/man1/freetype-config.1
+endif
 
 
 uninstall:
 	-$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIBRARY).$A
-	-$(DELETE) $(DESTDIR)$(includedir)/freetype2/config/*
-	-$(DELDIR) $(DESTDIR)$(includedir)/freetype2/config
-	-$(DELETE) $(DESTDIR)$(includedir)/freetype2/*
 	-$(DELDIR) $(DESTDIR)$(includedir)/freetype2
 	-$(DELETE) $(DESTDIR)$(bindir)/freetype-config
 	-$(DELETE) $(DESTDIR)$(datadir)/aclocal/freetype2.m4
@@ -76,7 +84,7 @@
 
 
 check:
-	@echo There is no validation suite for this package.
+	$(info There is no validation suite for this package.)
 
 
 .PHONY: clean_project_unix distclean_project_unix
@@ -84,14 +92,11 @@
 # Unix cleaning and distclean rules.
 #
 clean_project_unix:
-	-$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)
-	-$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \
-                   $(CLEAN)
+	-$(LIBTOOL) --mode=clean $(RM) $(OBJECTS_LIST)
+	-$(DELETE) $(CLEAN)
 
 distclean_project_unix: clean_project_unix
-	-$(DELETE) $(PROJECT_LIBRARY)
-	-$(DELETE) $(OBJ_DIR)/.libs/*
-	-$(DELDIR) $(OBJ_DIR)/.libs
+	-$(LIBTOOL) --mode=clean $(RM) $(PROJECT_LIBRARY)
 	-$(DELETE) *.orig *~ core *.core $(DISTCLEAN)
 
 # EOF
diff --git a/builds/unix/mkinstalldirs b/builds/unix/mkinstalldirs
deleted file mode 100755
index ef7e16f..0000000
--- a/builds/unix/mkinstalldirs
+++ /dev/null
@@ -1,161 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-
-scriptversion=2006-05-11.19
-
-# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain.
-#
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-nl='
-'
-IFS=" ""	$nl"
-errstatus=0
-dirmode=
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
-
-Create each directory DIR (with mode MODE, if specified), including all
-leading file name components.
-
-Report bugs to <bug-automake@gnu.org>."
-
-# process command line arguments
-while test $# -gt 0 ; do
-  case $1 in
-    -h | --help | --h*)         # -h for help
-      echo "$usage"
-      exit $?
-      ;;
-    -m)                         # -m PERM arg
-      shift
-      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
-      dirmode=$1
-      shift
-      ;;
-    --version)
-      echo "$0 $scriptversion"
-      exit $?
-      ;;
-    --)                         # stop option processing
-      shift
-      break
-      ;;
-    -*)                         # unknown option
-      echo "$usage" 1>&2
-      exit 1
-      ;;
-    *)                          # first non-opt arg
-      break
-      ;;
-  esac
-done
-
-for file
-do
-  if test -d "$file"; then
-    shift
-  else
-    break
-  fi
-done
-
-case $# in
-  0) exit 0 ;;
-esac
-
-# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
-# mkdir -p a/c at the same time, both will detect that a is missing,
-# one will create a, then the other will try to create a and die with
-# a "File exists" error.  This is a problem when calling mkinstalldirs
-# from a parallel make.  We use --version in the probe to restrict
-# ourselves to GNU mkdir, which is thread-safe.
-case $dirmode in
-  '')
-    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
-      echo "mkdir -p -- $*"
-      exec mkdir -p -- "$@"
-    else
-      # On NextStep and OpenStep, the `mkdir' command does not
-      # recognize any option.  It will interpret all options as
-      # directories to create, and then abort because `.' already
-      # exists.
-      test -d ./-p && rmdir ./-p
-      test -d ./--version && rmdir ./--version
-    fi
-    ;;
-  *)
-    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
-       test ! -d ./--version; then
-      echo "mkdir -m $dirmode -p -- $*"
-      exec mkdir -m "$dirmode" -p -- "$@"
-    else
-      # Clean up after NextStep and OpenStep mkdir.
-      for d in ./-m ./-p ./--version "./$dirmode";
-      do
-        test -d $d && rmdir $d
-      done
-    fi
-    ;;
-esac
-
-for file
-do
-  case $file in
-    /*) pathcomp=/ ;;
-    *)  pathcomp= ;;
-  esac
-  oIFS=$IFS
-  IFS=/
-  set fnord $file
-  shift
-  IFS=$oIFS
-
-  for d
-  do
-    test "x$d" = x && continue
-
-    pathcomp=$pathcomp$d
-    case $pathcomp in
-      -*) pathcomp=./$pathcomp ;;
-    esac
-
-    if test ! -d "$pathcomp"; then
-      echo "mkdir $pathcomp"
-
-      mkdir "$pathcomp" || lasterr=$?
-
-      if test ! -d "$pathcomp"; then
-	errstatus=$lasterr
-      else
-	if test ! -z "$dirmode"; then
-	  echo "chmod $dirmode $pathcomp"
-	  lasterr=
-	  chmod "$dirmode" "$pathcomp" || lasterr=$?
-
-	  if test ! -z "$lasterr"; then
-	    errstatus=$lasterr
-	  fi
-	fi
-      fi
-    fi
-
-    pathcomp=$pathcomp/
-  done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/builds/unix/pkg.m4 b/builds/unix/pkg.m4
index f26f84c..260e1fb 100644
--- a/builds/unix/pkg.m4
+++ b/builds/unix/pkg.m4
@@ -53,7 +53,7 @@
 # to PKG_CHECK_MODULES(), but does not set variables or print errors.
 #
 # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-# only at the first occurence in configure.ac, so if the first place
+# only at the first occurrence in configure.ac, so if the first place
 # it's called might be skipped (such as if it is within an "if", you
 # have to call PKG_CHECK_EXISTS manually
 # --------------------------------------------------------------
diff --git a/builds/unix/unix-cc.in b/builds/unix/unix-cc.in
index d53b25f..5675866 100644
--- a/builds/unix/unix-cc.in
+++ b/builds/unix/unix-cc.in
@@ -2,7 +2,7 @@
 # FreeType 2 template for Unix-specific compiler definitions
 #
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -87,19 +87,26 @@
 
 # C compiler to use -- we use libtool!
 #
-#
 CCraw := $(CC)
 CC    := $(LIBTOOL) --mode=compile $(CCraw)
 
+# Resource compiler to use on Cygwin/MinGW, usually windres.
+#
+RCraw := @RC@
+ifneq ($(RCraw),)
+  RC := $(LIBTOOL) --tag=RC --mode=compile $(RCraw)
+endif
+
 # Linker flags.
 #
-LDFLAGS := @LDFLAGS@
+LDFLAGS           := @LDFLAGS@
+LIB_CLOCK_GETTIME := @LIB_CLOCK_GETTIME@  # for ftbench
 
 
 # export symbols
 #
 CCraw_build  := @CC_BUILD@	# native CC of building system
-E_BUILD      := @EXEEXT_BUILD@	# extension for exexutable on building system
+E_BUILD      := @EXEEXT_BUILD@	# extension for executable on building system
 EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym
 CCexe        := $(CCraw_build)	# used to compile `apinames' only
 
@@ -109,6 +116,6 @@
 LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \
                           -rpath $(libdir) -version-info $(version_info) \
                           $(LDFLAGS) -no-undefined \
-                          # -export-symbols $(EXPORTS_LIST)
+                          -export-symbols $(EXPORTS_LIST)
 
 # EOF
diff --git a/builds/unix/unix-def.in b/builds/unix/unix-def.in
index ed9fd1e..6957053 100644
--- a/builds/unix/unix-def.in
+++ b/builds/unix/unix-def.in
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -17,7 +17,7 @@
 TOP_DIR := $(shell cd $(TOP_DIR); pwd)
 
 DELETE := rm -f
-DELDIR := @RMDIR@
+DELDIR := rm -rf
 CAT    := cat
 SEP    := /
 
@@ -32,7 +32,7 @@
 INSTALL_DATA    := @INSTALL_DATA@
 INSTALL_PROGRAM := @INSTALL_PROGRAM@
 INSTALL_SCRIPT  := @INSTALL_SCRIPT@
-MKINSTALLDIRS   := $(BUILD_DIR)/mkinstalldirs
+MKINSTALLDIRS   := @MKDIR_P@
 
 CLEAN += $(OBJ_BUILD)/freetype-config \
          $(OBJ_BUILD)/freetype2.pc
@@ -43,6 +43,7 @@
              $(OBJ_BUILD)/unix-def.mk   \
              $(OBJ_BUILD)/unix-cc.mk    \
              $(OBJ_BUILD)/ftconfig.h    \
+             $(OBJ_BUILD)/ftoption.h    \
              $(LIBTOOL)                 \
              $(OBJ_BUILD)/Makefile
 
@@ -62,6 +63,7 @@
 
 # Variables needed for `freetype-config' and `freetype.pc'.
 #
+PKG_CONFIG         := @PKG_CONFIG@
 REQUIRES_PRIVATE   := @REQUIRES_PRIVATE@
 LIBS_PRIVATE       := @LIBS_PRIVATE@
 LIBSSTATIC_CONFIG  := @LIBSSTATIC_CONFIG@
@@ -102,6 +104,7 @@
 $(OBJ_BUILD)/freetype-config: $(TOP_DIR)/builds/unix/freetype-config.in
 	rm -f $@ $@.tmp
 	sed -e 's|%LIBSSTATIC_CONFIG%|$(LIBSSTATIC_CONFIG)|'   \
+	    -e 's|%PKG_CONFIG%|$(PKG_CONFIG)|'                 \
 	    -e 's|%build_libtool_libs%|$(build_libtool_libs)|' \
 	    -e 's|%exec_prefix%|$(exec_prefix)|'               \
 	    -e 's|%ft_version%|$(ft_version)|'                 \
@@ -111,7 +114,7 @@
 	    $<                                                 \
 	    > $@.tmp
 	chmod +x $@.tmp
-	chmod a-w $@.tmp
+	chmod go-w $@.tmp
 	mv $@.tmp $@
 
 # To support directory names with spaces (as might easily happen on Windows
@@ -142,7 +145,10 @@
 	chmod a-w $@.tmp
 	mv $@.tmp $@
 
-all: $(OBJ_BUILD)/freetype-config \
+# defines whether we should install `freetype-config' or not
+INSTALL_FT2_CONFIG = @INSTALL_FT2_CONFIG@
+
+all install: $(OBJ_BUILD)/freetype-config \
      $(OBJ_BUILD)/freetype2.pc
 
 # EOF
diff --git a/builds/unix/unix-dev.mk b/builds/unix/unix-dev.mk
index 62de344..5a516ad 100644
--- a/builds/unix/unix-dev.mk
+++ b/builds/unix/unix-dev.mk
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/unix/unix-lcc.mk b/builds/unix/unix-lcc.mk
index 328cc80..73a02d4 100644
--- a/builds/unix/unix-lcc.mk
+++ b/builds/unix/unix-lcc.mk
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/unix/unix.mk b/builds/unix/unix.mk
index 542aa7f..acd54d3 100644
--- a/builds/unix/unix.mk
+++ b/builds/unix/unix.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/unix/unixddef.mk b/builds/unix/unixddef.mk
index f333640..a8da63a 100644
--- a/builds/unix/unixddef.mk
+++ b/builds/unix/unixddef.mk
@@ -4,7 +4,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/vms/ftconfig.h b/builds/vms/ftconfig.h
index eff898f..021e2c6 100644
--- a/builds/vms/ftconfig.h
+++ b/builds/vms/ftconfig.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    VMS-specific configuration file (specification only).                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -33,8 +33,9 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __FTCONFIG_H__
-#define __FTCONFIG_H__
+
+#ifndef FTCONFIG_H_
+#define FTCONFIG_H_
 
 #include <ft2build.h>
 #include FT_CONFIG_OPTIONS_H
@@ -116,6 +117,14 @@
 #endif
 
 
+  /* Fix compiler warning with sgi compiler */
+#if defined( __sgi ) && !defined( __GNUC__ )
+#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 )
+#pragma set woff 3505
+#endif
+#endif
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Section>                                                             */
@@ -201,12 +210,12 @@
 
 #endif
 
-#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT == 4
 
   typedef signed int      FT_Int32;
   typedef unsigned int    FT_UInt32;
 
-#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG == 4
 
   typedef signed long     FT_Int32;
   typedef unsigned long   FT_UInt32;
@@ -217,12 +226,12 @@
 
 
   /* look up an integer type that is at least 32 bits */
-#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT >= 4
 
   typedef int            FT_Fast;
   typedef unsigned int   FT_UFast;
 
-#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG >= 4
 
   typedef long           FT_Fast;
   typedef unsigned long  FT_UFast;
@@ -230,15 +239,25 @@
 #endif
 
 
-  /* determine whether we have a 64-bit int type for platforms without */
-  /* Autoconf                                                          */
-#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+  /* determine whether we have a 64-bit int type  */
+  /* (mostly for environments without `autoconf') */
+#if FT_SIZEOF_LONG == 8
 
   /* FT_LONG64 must be defined if a 64-bit type is available */
 #define FT_LONG64
 #define FT_INT64   long
 #define FT_UINT64  unsigned long
 
+  /* we handle the LLP64 scheme separately for GCC and clang, */
+  /* suppressing the `long long' warning                      */
+#elif ( FT_SIZEOF_LONG == 4 )       && \
+      defined( HAVE_LONG_LONG_INT ) && \
+      defined( __GNUC__ )
+#pragma GCC diagnostic ignored "-Wlong-long"
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
   /*************************************************************************/
   /*                                                                       */
   /* A 64-bit data type may create compilation problems if you compile     */
@@ -248,7 +267,13 @@
   /*                                                                       */
 #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 )
 
-#if defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L
+
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
 
   /* this compiler provides the __int64 type */
 #define FT_LONG64
@@ -282,9 +307,9 @@
 #define FT_INT64   long long int
 #define FT_UINT64  unsigned long long int
 
-#endif /* _MSC_VER */
+#endif /* __STDC_VERSION__ >= 199901L */
 
-#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+#endif /* FT_SIZEOF_LONG == 8 */
 
 #ifdef FT_LONG64
   typedef FT_INT64   FT_Int64;
@@ -292,6 +317,15 @@
 #endif
 
 
+#ifdef _WIN64
+  /* only 64bit Windows uses the LLP64 data model, i.e., */
+  /* 32bit integers, 64bit pointers                      */
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x)
+#else
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x)
+#endif
+
+
   /*************************************************************************/
   /*                                                                       */
   /* miscellaneous                                                         */
@@ -305,15 +339,24 @@
 
 
   /* typeof condition taken from gnulib's `intprops.h' header file */
-#if ( __GNUC__ >= 2                         || \
-      defined( __IBM__TYPEOF__ )            || \
-      ( __SUNPRO_C >= 0x5110 && !__STDC__ ) )
-#define TYPEOF( type )  (__typeof__ (type))
+#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 )                       || \
+      ( defined( __IBMC__ ) && __IBMC__ >= 1210 &&                      \
+        defined( __IBM__TYPEOF__ ) )                                 || \
+      ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) )
+#define FT_TYPEOF( type )  ( __typeof__ ( type ) )
 #else
-#define TYPEOF( type )  /* empty */
+#define FT_TYPEOF( type )  /* empty */
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -335,6 +378,12 @@
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -357,14 +406,63 @@
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL or DSO with hidden visibility      */
+  /*   some systems/compilers need a special attribute in front OR after   */
+  /*   the return type of function declarations.                           */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
-#ifdef __cplusplus
+#ifdef FT2_BUILD_LIBRARY
+
+#if defined( _WIN32 ) && ( defined( _DLL ) || defined( DLL_EXPORT ) )
+#define FT_EXPORT( x )  __declspec( dllexport )  x
+#elif defined( __GNUC__ ) && __GNUC__ >= 4
+#define FT_EXPORT( x )  __attribute__(( visibility( "default" ) ))  x
+#elif defined( __cplusplus )
 #define FT_EXPORT( x )  extern "C"  x
 #else
 #define FT_EXPORT( x )  extern  x
 #endif
 
+#else
+
+#if defined( FT2_DLLIMPORT )
+#define FT_EXPORT( x )  __declspec( dllimport )  x
+#elif defined( __cplusplus )
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif
+
 #endif /* !FT_EXPORT */
 
 
@@ -400,7 +498,13 @@
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -420,6 +524,16 @@
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
@@ -434,7 +548,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCONFIG_H__ */
+#endif /* FTCONFIG_H_ */
 
 
 /* END */
diff --git a/builds/vms/ftsystem.c b/builds/vms/ftsystem.c
index 74d3392..7d79f9a 100644
--- a/builds/vms/ftsystem.c
+++ b/builds/vms/ftsystem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    VMS-specific FreeType low-level system interface (body).             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/builds/wince/ftdebug.c b/builds/wince/ftdebug.c
index 74c73b5..83c5f44 100644
--- a/builds/wince/ftdebug.c
+++ b/builds/wince/ftdebug.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for WinCE (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -79,7 +79,7 @@
 
 
     va_start( ap, fmt );
-    vprintf( fmt, ap );
+    vfprintf( stderr, fmt, ap );
     /* send the string to the debugger as well */
     vsprintf( buf, fmt, ap );
     OutputDebugStringEx( buf );
@@ -148,8 +148,8 @@
   /* for the memory and stream components which are set to 6 and 5,        */
   /* respectively.                                                         */
   /*                                                                       */
-  /* See the file <internal/fttrace.h> for details of the available toggle */
-  /* names.                                                                */
+  /* See the file `include/freetype/internal/fttrace.h' for details of the */
+  /* available toggle names.                                               */
   /*                                                                       */
   /* The level must be between 0 and 6; 0 means quiet (except for serious  */
   /* runtime errors), and 6 means _very_ verbose.                          */
diff --git a/builds/wince/vc2005-ce/freetype.sln b/builds/wince/vc2005-ce/freetype.sln
index 76e52d8..ff45463 100644
--- a/builds/wince/vc2005-ce/freetype.sln
+++ b/builds/wince/vc2005-ce/freetype.sln
@@ -1,4 +1,3 @@
-

 Microsoft Visual Studio Solution File, Format Version 9.00

 # Visual Studio 2005

 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"

diff --git a/builds/wince/vc2005-ce/freetype.vcproj b/builds/wince/vc2005-ce/freetype.vcproj
index a1993b4..1ca45a8 100644
--- a/builds/wince/vc2005-ce/freetype.vcproj
+++ b/builds/wince/vc2005-ce/freetype.vcproj
@@ -21,7 +21,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -41,7 +41,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -61,7 +61,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -81,7 +81,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -101,7 +101,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -121,7 +121,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -141,7 +141,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -161,7 +161,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -181,7 +181,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -201,7 +201,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -221,7 +221,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -241,7 +241,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -261,7 +261,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -281,7 +281,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -301,7 +301,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -321,7 +321,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -341,7 +341,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -361,7 +361,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -381,7 +381,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -401,7 +401,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -421,7 +421,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -441,7 +441,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -461,7 +461,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -481,7 +481,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -501,7 +501,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -521,7 +521,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -541,7 +541,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -561,7 +561,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -581,7 +581,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -601,7 +601,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -621,7 +621,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -641,7 +641,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -661,7 +661,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -681,7 +681,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -701,7 +701,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -721,7 +721,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -741,7 +741,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -758,7 +758,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -773,585 +773,18 @@
       <File RelativePath="..\..\..\src\autofit\autofit.c">

       </File>

       <File RelativePath="..\..\..\src\bdf\bdf.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\cff\cff.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftbase.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftbitmap.c">

       </File>

       <File RelativePath="..\..\..\src\cache\ftcache.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\ftdebug.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

+        <FileConfiguration>

+          <Tool Name="VCCLCompilerTool" DisableLanguageExtensions="false" />

         </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftfstype.c">

@@ -1359,774 +792,18 @@
       <File RelativePath="..\..\..\src\base\ftgasp.c">

       </File>

       <File RelativePath="..\..\..\src\base\ftglyph.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\gzip\ftgzip.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftinit.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\lzw\ftlzw.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftstroke.c">

       </File>

       <File RelativePath="..\..\..\src\base\ftsystem.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\smooth\smooth.c">

-        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <Filter Name="FT_MODULES">

         <File RelativePath="..\..\..\src\base\ftbbox.c">

@@ -2135,139 +812,9 @@
         </File>

         <File RelativePath="..\..\..\src\base\ftcid.c">

         </File>

-        <File RelativePath="..\..\..\src\base\ftfntfmt.c">

-        </File>

         <File RelativePath="..\..\..\src\base\ftgxval.c">

         </File>

-        <File RelativePath="..\..\..\src\base\ftlcdfil.c">

-        </File>

         <File RelativePath="..\..\..\src\base\ftmm.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\base\ftotval.c">

         </File>

@@ -2282,1558 +829,46 @@
         <File RelativePath="..\..\..\src\base\ftwinfnt.c">

         </File>

         <File RelativePath="..\..\..\src\pcf\pcf.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\pfr\pfr.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\psaux\psaux.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\pshinter\pshinter.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\psnames\psmodule.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\raster\raster.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\sfnt\sfnt.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\truetype\truetype.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\type1\type1.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\cid\type1cid.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\type42\type42.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\winfonts\winfnt.c">

-          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

       </Filter>

     </Filter>

     <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl">

       <File RelativePath="..\..\..\include\ft2build.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftconfig.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftconfig.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftheader.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftheader.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftmodule.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftmodule.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftoption.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftoption.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftstdlib.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftstdlib.h">

       </File>

     </Filter>

   </Files>

   <Globals>

   </Globals>

-</VisualStudioProject>
\ No newline at end of file
+</VisualStudioProject>

diff --git a/builds/wince/vc2005-ce/index.html b/builds/wince/vc2005-ce/index.html
index a8e92d7..02a1caf 100644
--- a/builds/wince/vc2005-ce/index.html
+++ b/builds/wince/vc2005-ce/index.html
@@ -21,22 +21,22 @@
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.6 sources:</p>
+It compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/wince/vc2008-ce/freetype.sln b/builds/wince/vc2008-ce/freetype.sln
index d8efd96..2391432 100644
--- a/builds/wince/vc2008-ce/freetype.sln
+++ b/builds/wince/vc2008-ce/freetype.sln
@@ -1,4 +1,3 @@
-

 Microsoft Visual Studio Solution File, Format Version 10.00

 # Visual Studio 2008

 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"

diff --git a/builds/wince/vc2008-ce/freetype.vcproj b/builds/wince/vc2008-ce/freetype.vcproj
index 4faf5b4..7a5445e 100644
--- a/builds/wince/vc2008-ce/freetype.vcproj
+++ b/builds/wince/vc2008-ce/freetype.vcproj
@@ -88,7 +88,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -177,7 +177,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -266,7 +266,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -355,7 +355,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -444,7 +444,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -533,7 +533,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -621,7 +621,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -709,7 +709,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -797,7 +797,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -885,7 +885,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -973,7 +973,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1061,7 +1061,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1149,7 +1149,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1236,7 +1236,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1323,7 +1323,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1410,7 +1410,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1497,7 +1497,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1584,7 +1584,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1668,7 +1668,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1753,7 +1753,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1838,7 +1838,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1923,7 +1923,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2008,7 +2008,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2093,7 +2093,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2178,7 +2178,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2263,7 +2263,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2348,7 +2348,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2433,7 +2433,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2518,7 +2518,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2603,7 +2603,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2689,7 +2689,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2775,7 +2775,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2861,7 +2861,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2947,7 +2947,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3033,7 +3033,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3119,7 +3119,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3205,7 +3205,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3279,7 +3279,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\wince\vc2008-ce\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3313,1115 +3313,14 @@
 			<File

 				RelativePath="..\..\..\src\bdf\bdf.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\cff\cff.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbase.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbitmap.c"

@@ -4430,854 +3329,13 @@
 			<File

 				RelativePath="..\..\..\src\cache\ftcache.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\ftdebug.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

+				<FileConfiguration>

 					<Tool

 						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

 						DisableLanguageExtensions="false"

 					/>

 				</FileConfiguration>

@@ -5293,1710 +3351,18 @@
 			<File

 				RelativePath="..\..\..\src\base\ftglyph.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\gzip\ftgzip.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftinit.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\lzw\ftlzw.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftstroke.c"

@@ -7005,856 +3371,10 @@
 			<File

 				RelativePath="..\..\..\src\base\ftsystem.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\smooth\smooth.c"

 				>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<Filter

 				Name="FT_MODULES"

@@ -7872,443 +3392,12 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftfntfmt.c"

-					>

-				</File>

-				<File

 					RelativePath="..\..\..\src\base\ftgxval.c"

 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftlcdfil.c"

-					>

-				</File>

-				<File

 					RelativePath="..\..\..\src\base\ftmm.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftotval.c"

@@ -8337,5126 +3426,50 @@
 				<File

 					RelativePath="..\..\..\src\pcf\pcf.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pfr\pfr.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psaux\psaux.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pshinter\pshinter.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psnames\psmodule.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\raster\raster.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\sfnt\sfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\truetype\truetype.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type1\type1.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\cid\type1cid.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type42\type42.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\winfonts\winfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 			</Filter>

 		</Filter>

@@ -13469,23 +3482,23 @@
 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftconfig.h"

+				RelativePath="..\..\..\include\freetype\config\ftconfig.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftheader.h"

+				RelativePath="..\..\..\include\freetype\config\ftheader.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftmodule.h"

+				RelativePath="..\..\..\include\freetype\config\ftmodule.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftoption.h"

+				RelativePath="..\..\..\include\freetype\config\ftoption.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftstdlib.h"

+				RelativePath="..\..\..\include\freetype\config\ftstdlib.h"

 				>

 			</File>

 		</Filter>

diff --git a/builds/wince/vc2008-ce/index.html b/builds/wince/vc2008-ce/index.html
index ebf1376..f7a3583 100644
--- a/builds/wince/vc2008-ce/index.html
+++ b/builds/wince/vc2008-ce/index.html
@@ -21,22 +21,22 @@
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.6 sources:</p>
+It compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/windows/detect.mk b/builds/windows/detect.mk
index 26297f2..dd5669c 100644
--- a/builds/windows/detect.mk
+++ b/builds/windows/detect.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -77,7 +77,7 @@
   # So we need to hack.
   #
   # Kudos to Eli Zaretskii (DJGPP guru) that helped debug it.
-  # Details are available in threads of the freetype mailing list
+  # Details are available in threads of the FreeType mailing list
   # (2004-11-11), and then in the devel mailing list (2004-11-20 to -23).
   #
   ifeq ($(OS),Windows_NT)
@@ -95,22 +95,22 @@
 
   ifneq ($(findstring list,$(MAKECMDGOALS)),)  # test for the "list" target
     dump_target_list:
-	    @echo ÿ
-	    @echo $(PROJECT_TITLE) build system -- supported compilers
-	    @echo ÿ
-	    @echo Several command-line compilers are supported on Win32:
-	    @echo ÿ
-	    @echo ÿÿmake setupÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgcc (with Mingw)
-	    @echo ÿÿmake setup visualcÿÿÿÿÿÿÿÿÿÿÿÿÿMicrosoft Visual C++
-	    @echo ÿÿmake setup bcc32ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBorland C/C++
-	    @echo ÿÿmake setup lccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWin32-LCC
-	    @echo ÿÿmake setup intelcÿÿÿÿÿÿÿÿÿÿÿÿÿÿIntel C/C++
-	    @echo ÿ
+	    $(info )
+	    $(info $(PROJECT_TITLE) build system -- supported compilers)
+	    $(info )
+	    $(info Several command-line compilers are supported on Win32:)
+	    $(info )
+	    $(info $(empty)  make setup                     gcc (with Mingw))
+	    $(info $(empty)  make setup visualc             Microsoft Visual C++)
+	    $(info $(empty)  make setup bcc32               Borland C/C++)
+	    $(info $(empty)  make setup lcc                 Win32-LCC)
+	    $(info $(empty)  make setup intelc              Intel C/C++)
+	    $(info )
 
     setup: dump_target_list
     .PHONY: dump_target_list list
   else
-    setup: dos_setup
+    setup: std_setup
   endif
 
   # additionally, we provide hooks for various other compilers
diff --git a/builds/windows/ftdebug.c b/builds/windows/ftdebug.c
index 2adcc52..ec70a0e 100644
--- a/builds/windows/ftdebug.c
+++ b/builds/windows/ftdebug.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for Win32 (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -65,7 +65,7 @@
 
 
     va_start( ap, fmt );
-    vprintf( fmt, ap );
+    vfprintf( stderr, fmt, ap );
     /* send the string to the debugger as well */
     vsprintf( buf, fmt, ap );
     OutputDebugStringA( buf );
@@ -137,8 +137,8 @@
   /* for the memory and stream components which are set to 6 and 5,        */
   /* respectively.                                                         */
   /*                                                                       */
-  /* See the file <internal/fttrace.h> for details of the available toggle */
-  /* names.                                                                */
+  /* See the file `include/freetype/internal/fttrace.h' for details of the */
+  /* available toggle names.                                               */
   /*                                                                       */
   /* The level must be between 0 and 6; 0 means quiet (except for serious  */
   /* runtime errors), and 6 means _very_ verbose.                          */
diff --git a/builds/windows/vc2005/freetype.vcproj b/builds/windows/vc2005/freetype.vcproj
index eb52ab5..b1e2ae6 100644
--- a/builds/windows/vc2005/freetype.vcproj
+++ b/builds/windows/vc2005/freetype.vcproj
@@ -16,7 +16,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -33,7 +33,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26MT.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291MT.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -50,7 +50,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26ST.lib" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291ST.lib" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -67,7 +67,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -84,7 +84,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26ST_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291ST_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -101,7 +101,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />

       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />

       <Tool Name="VCPreLinkEventTool" />

-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype26MT_D.lib" SuppressStartupBanner="true" />

+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype291MT_D.lib" SuppressStartupBanner="true" />

       <Tool Name="VCALinkTool" />

       <Tool Name="VCXDCMakeTool" />

       <Tool Name="VCBscMakeTool" />

@@ -116,105 +116,18 @@
       <File RelativePath="..\..\..\src\autofit\autofit.c">

       </File>

       <File RelativePath="..\..\..\src\bdf\bdf.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\cff\cff.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftbase.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftbitmap.c">

       </File>

       <File RelativePath="..\..\..\src\cache\ftcache.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\ftdebug.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />

+        <FileConfiguration>

+          <Tool Name="VCCLCompilerTool" DisableLanguageExtensions="false" />

         </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftfstype.c">

@@ -222,151 +135,27 @@
       <File RelativePath="..\..\..\src\base\ftgasp.c">

       </File>

       <File RelativePath="..\..\..\src\base\ftglyph.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\gzip\ftgzip.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftinit.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\lzw\ftlzw.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\base\ftstroke.c">

       </File>

       <File RelativePath="..\..\..\src\base\ftsystem.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <File RelativePath="..\..\..\src\smooth\smooth.c">

-        <FileConfiguration Name="Release|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Release Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Singlethreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

-        <FileConfiguration Name="Debug Multithreaded|Win32">

-          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-        </FileConfiguration>

       </File>

       <Filter Name="FT_MODULES">

+        <File RelativePath="..\..\..\src\base\ftbdf.c">

+        </File>

         <File RelativePath="..\..\..\src\base\ftbbox.c">

         </File>

-        <File RelativePath="..\..\..\src\base\ftfntfmt.c">

+        <File RelativePath="..\..\..\src\base\ftcid.c">

         </File>

         <File RelativePath="..\..\..\src\base\ftmm.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\base\ftpfr.c">

         </File>

@@ -376,8 +165,6 @@
         </File>

         <File RelativePath="..\..\..\src\base\ftwinfnt.c">

         </File>

-        <File RelativePath="..\..\..\src\base\ftlcdfil.c">

-        </File>

         <File RelativePath="..\..\..\src\base\ftgxval.c">

         </File>

         <File RelativePath="..\..\..\src\base\ftotval.c">

@@ -385,262 +172,46 @@
         <File RelativePath="..\..\..\src\base\ftpatent.c">

         </File>

         <File RelativePath="..\..\..\src\pcf\pcf.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\pfr\pfr.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\psaux\psaux.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\pshinter\pshinter.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\psnames\psmodule.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\raster\raster.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\sfnt\sfnt.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\truetype\truetype.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\type1\type1.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\cid\type1cid.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\type42\type42.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

         <File RelativePath="..\..\..\src\winfonts\winfnt.c">

-          <FileConfiguration Name="Release|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Release Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Singlethreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

-          <FileConfiguration Name="Debug Multithreaded|Win32">

-            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />

-          </FileConfiguration>

         </File>

       </Filter>

     </Filter>

     <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl">

       <File RelativePath="..\..\..\include\ft2build.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftconfig.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftconfig.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftheader.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftheader.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftmodule.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftmodule.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftoption.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftoption.h">

       </File>

-      <File RelativePath="..\..\..\include\config\ftstdlib.h">

+      <File RelativePath="..\..\..\include\freetype\config\ftstdlib.h">

       </File>

     </Filter>

   </Files>

   <Globals>

   </Globals>

-</VisualStudioProject>
\ No newline at end of file
+</VisualStudioProject>

diff --git a/builds/windows/vc2005/index.html b/builds/windows/vc2005/index.html
index 7d47e39..c5e182e 100644
--- a/builds/windows/vc2005/index.html
+++ b/builds/windows/vc2005/index.html
@@ -11,22 +11,22 @@
 
 <p>This directory contains project files for Visual C++, named
 <tt>freetype.vcproj</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
-compiles the following libraries from the FreeType 2.6 sources:</p>
+compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/windows/vc2008/freetype.vcproj b/builds/windows/vc2008/freetype.vcproj
index 738fe7c..f526cd2 100644
--- a/builds/windows/vc2008/freetype.vcproj
+++ b/builds/windows/vc2008/freetype.vcproj
@@ -70,7 +70,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -145,7 +145,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26MT.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -220,7 +220,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26ST.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -292,7 +292,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26_D.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -365,7 +365,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -439,7 +439,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\win32\vc2008\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\win32\vc2008\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -473,203 +473,14 @@
 			<File

 				RelativePath="..\..\..\src\bdf\bdf.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\cff\cff.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbase.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbitmap.c"

@@ -678,139 +489,13 @@
 			<File

 				RelativePath="..\..\..\src\cache\ftcache.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\ftdebug.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

+				<FileConfiguration>

 					<Tool

 						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

 						DisableLanguageExtensions="false"

 					/>

 				</FileConfiguration>

@@ -826,270 +511,18 @@
 			<File

 				RelativePath="..\..\..\src\base\ftglyph.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\gzip\ftgzip.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftinit.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\lzw\ftlzw.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftstroke.c"

@@ -1098,136 +531,10 @@
 			<File

 				RelativePath="..\..\..\src\base\ftsystem.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\smooth\smooth.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<Filter

 				Name="FT_MODULES"

@@ -1237,75 +544,16 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftfntfmt.c"

+					RelativePath="..\..\..\src\base\ftbdf.c"

+					>

+				</File>

+				<File

+					RelativePath="..\..\..\src\base\ftcid.c"

 					>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftmm.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftpfr.c"

@@ -1324,10 +572,6 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftlcdfil.c"

-					>

-				</File>

-				<File

 					RelativePath="..\..\..\src\base\ftgxval.c"

 					>

 				</File>

@@ -1342,806 +586,50 @@
 				<File

 					RelativePath="..\..\..\src\pcf\pcf.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pfr\pfr.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psaux\psaux.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pshinter\pshinter.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psnames\psmodule.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\raster\raster.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\sfnt\sfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\truetype\truetype.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type1\type1.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\cid\type1cid.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type42\type42.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\winfonts\winfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 			</Filter>

 		</Filter>

@@ -2154,23 +642,23 @@
 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftconfig.h"

+				RelativePath="..\..\..\include\freetype\config\ftconfig.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftheader.h"

+				RelativePath="..\..\..\include\freetype\config\ftheader.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftmodule.h"

+				RelativePath="..\..\..\include\freetype\config\ftmodule.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftoption.h"

+				RelativePath="..\..\..\include\freetype\config\ftoption.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftstdlib.h"

+				RelativePath="..\..\..\include\freetype\config\ftstdlib.h"

 				>

 			</File>

 		</Filter>

diff --git a/builds/windows/vc2008/index.html b/builds/windows/vc2008/index.html
index 533337f..25c6f9b 100644
--- a/builds/windows/vc2008/index.html
+++ b/builds/windows/vc2008/index.html
@@ -11,22 +11,22 @@
 
 <p>This directory contains project files for Visual C++, named
 <tt>freetype.vcproj</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
-compiles the following libraries from the FreeType 2.6 sources:</p>
+compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/windows/vc2010/freetype.sln b/builds/windows/vc2010/freetype.sln
index 3bd176a..8698207 100644
--- a/builds/windows/vc2010/freetype.sln
+++ b/builds/windows/vc2010/freetype.sln
@@ -1,4 +1,3 @@
-

 Microsoft Visual Studio Solution File, Format Version 11.00

 # Visual Studio Express 2012 for Windows Desktop

 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"

@@ -7,42 +6,30 @@
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

 		Debug|Win32 = Debug|Win32

 		Debug|x64 = Debug|x64

-		Debug Multithreaded|Win32 = Debug Multithreaded|Win32

-		Debug Multithreaded|x64 = Debug Multithreaded|x64

-		Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32

-		Debug Singlethreaded|x64 = Debug Singlethreaded|x64

+		Debug Static|Win32 = Debug Static|Win32

+		Debug Static|x64 = Debug Static|x64

 		Release|Win32 = Release|Win32

 		Release|x64 = Release|x64

-		Release Multithreaded|Win32 = Release Multithreaded|Win32

-		Release Multithreaded|x64 = Release Multithreaded|x64

-		Release Singlethreaded|Win32 = Release Singlethreaded|Win32

-		Release Singlethreaded|x64 = Release Singlethreaded|x64

+		Release Static|Win32 = Release Static|Win32

+		Release Static|x64 = Release Static|x64

 	EndGlobalSection

 	GlobalSection(ProjectConfigurationPlatforms) = postSolution

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.ActiveCfg = Debug|x64

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|x64.Build.0 = Debug|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|x64.ActiveCfg = Debug Multithreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|x64.Build.0 = Debug Multithreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|x64.ActiveCfg = Debug Singlethreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|x64.Build.0 = Debug Singlethreaded|x64

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Static|Win32.ActiveCfg = Debug Static|Win32

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Static|Win32.Build.0 = Debug Static|Win32

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Static|x64.ActiveCfg = Debug Static|x64

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Static|x64.Build.0 = Debug Static|x64

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.ActiveCfg = Release|x64

 		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|x64.Build.0 = Release|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|x64.ActiveCfg = Release Multithreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|x64.Build.0 = Release Multithreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|x64.ActiveCfg = Release Singlethreaded|x64

-		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|x64.Build.0 = Release Singlethreaded|x64

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Static|Win32.ActiveCfg = Release Static|Win32

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Static|Win32.Build.0 = Release Static|Win32

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Static|x64.ActiveCfg = Release Static|x64

+		{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Static|x64.Build.0 = Release Static|x64

 	EndGlobalSection

 	GlobalSection(SolutionProperties) = preSolution

 		HideSolutionNode = FALSE

diff --git a/builds/windows/vc2010/freetype.vcxproj b/builds/windows/vc2010/freetype.vcxproj
index 3fa8cd2..521e847 100644
--- a/builds/windows/vc2010/freetype.vcxproj
+++ b/builds/windows/vc2010/freetype.vcxproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>

+<?xml version="1.0" encoding="utf-8"?>

 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   <ItemGroup Label="ProjectConfigurations">

     <ProjectConfiguration Include="Debug|Win32">

@@ -9,20 +9,12 @@
       <Configuration>Debug</Configuration>

       <Platform>x64</Platform>

     </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug Multithreaded|Win32">

-      <Configuration>Debug Multithreaded</Configuration>

+    <ProjectConfiguration Include="Debug Static|Win32">

+      <Configuration>Debug Static</Configuration>

       <Platform>Win32</Platform>

     </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug Multithreaded|x64">

-      <Configuration>Debug Multithreaded</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug Singlethreaded|Win32">

-      <Configuration>Debug Singlethreaded</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Debug Singlethreaded|x64">

-      <Configuration>Debug Singlethreaded</Configuration>

+    <ProjectConfiguration Include="Debug Static|x64">

+      <Configuration>Debug Static</Configuration>

       <Platform>x64</Platform>

     </ProjectConfiguration>

     <ProjectConfiguration Include="Release|Win32">

@@ -33,183 +25,103 @@
       <Configuration>Release</Configuration>

       <Platform>x64</Platform>

     </ProjectConfiguration>

-    <ProjectConfiguration Include="Release Multithreaded|Win32">

-      <Configuration>Release Multithreaded</Configuration>

+    <ProjectConfiguration Include="Release Static|Win32">

+      <Configuration>Release Static</Configuration>

       <Platform>Win32</Platform>

     </ProjectConfiguration>

-    <ProjectConfiguration Include="Release Multithreaded|x64">

-      <Configuration>Release Multithreaded</Configuration>

-      <Platform>x64</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release Singlethreaded|Win32">

-      <Configuration>Release Singlethreaded</Configuration>

-      <Platform>Win32</Platform>

-    </ProjectConfiguration>

-    <ProjectConfiguration Include="Release Singlethreaded|x64">

-      <Configuration>Release Singlethreaded</Configuration>

+    <ProjectConfiguration Include="Release Static|x64">

+      <Configuration>Release Static</Configuration>

       <Platform>x64</Platform>

     </ProjectConfiguration>

   </ItemGroup>

+    <!--

+    Switch the PlatformToolset based on the Visual Studio Version

+-->

+<PropertyGroup>

+    <!-- Assume Visual Studio 2010 / 4.0 as the default -->

+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">4.0</VisualStudioVersion>

+</PropertyGroup>

+<!-- Visual Studio 2010 (4.0) -->

+<PropertyGroup Condition="'$(VisualStudioVersion)' == '4.0'">

+    <PlatformToolset>v100</PlatformToolset>

+</PropertyGroup>

+<!-- Visual Studio 2013 (12.0) -->

+<PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'">

+    <PlatformToolset>v120</PlatformToolset>

+</PropertyGroup>

+<!-- Visual Studio 2015 (14.0) -->

+<PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'">

+    <PlatformToolset>v140</PlatformToolset>

+</PropertyGroup>

+<!-- Visual Studio 2017 (15.0) -->

+<PropertyGroup Condition="'$(VisualStudioVersion)' == '15.0'">

+    <PlatformToolset>v141</PlatformToolset>

+</PropertyGroup>

+<!--

+    End of: Switch the PlatformToolset based on the Visual Studio Version

+-->

   <PropertyGroup Label="Globals">

-    <ProjectGuid>{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}</ProjectGuid>

+     <ProjectGuid>{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}</ProjectGuid>

+     <RootNamespace>FreeType</RootNamespace>

   </PropertyGroup>

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />

   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" Label="Configuration">

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="Configuration">

     <ConfigurationType>StaticLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" Label="Configuration">

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="Configuration">

     <ConfigurationType>StaticLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

+    <ConfigurationType>DynamicLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" Label="Configuration">

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="Configuration">

     <ConfigurationType>StaticLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" Label="Configuration">

+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="Configuration">

     <ConfigurationType>StaticLibrary</ConfigurationType>

     <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

-  </PropertyGroup>

-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" Label="Configuration">

-    <ConfigurationType>StaticLibrary</ConfigurationType>

-    <UseOfMfc>false</UseOfMfc>

-    <CharacterSet>MultiByte</CharacterSet>

-    <PlatformToolset>v100</PlatformToolset>

+    <CharacterSet>Unicode</CharacterSet>

   </PropertyGroup>

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

   <ImportGroup Label="ExtensionSettings">

   </ImportGroup>

   <PropertyGroup>

-    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>

-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" />

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" />

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" />

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />

-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />

-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" />

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">freetype26d</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">freetype26d</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">freetype26MTd</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">freetype26MTd</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">freetype26STd</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">freetype26STd</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">freetype26</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">freetype26</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">freetype26MT</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">freetype26MT</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">freetype26ST</TargetName>

-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">freetype26ST</TargetName>

+    <OutDir>..\..\..\objs\$(Platform)\$(Configuration)\</OutDir>

+    <IntDir>..\..\..\objs\$(Platform)\$(Configuration)\</IntDir>

+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>

+    <CodeAnalysisRules />

+    <CodeAnalysisRuleAssemblies />

+    <TargetName>freetype</TargetName>

   </PropertyGroup>

   <Import Project="$(SolutionDir)\freetype.user.props" Condition="exists('$(SolutionDir)\freetype.user.props')" Label="UserProperties" />

   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">

     <ClCompile>

       <Optimization>Disabled</Optimization>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>

       <DisableLanguageExtensions>true</DisableLanguageExtensions>

@@ -223,7 +135,7 @@
       <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>

     </ClCompile>

     <ResourceCompile>

-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>_DEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <Culture>0x0409</Culture>

     </ResourceCompile>

     <Lib>

@@ -237,7 +149,7 @@
     <ClCompile>

       <Optimization>Disabled</Optimization>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>

       <DisableLanguageExtensions>true</DisableLanguageExtensions>

@@ -251,7 +163,7 @@
       <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>

     </ClCompile>

     <ResourceCompile>

-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>_DEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <Culture>0x0409</Culture>

     </ResourceCompile>

     <Lib>

@@ -261,13 +173,11 @@
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

     </Lib>

   </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">

     <ClCompile>

       <Optimization>Disabled</Optimization>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessToFile>false</PreprocessToFile>

-      <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

       <DisableLanguageExtensions>true</DisableLanguageExtensions>

@@ -291,69 +201,11 @@
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

     </Lib>

   </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">

     <ClCompile>

       <Optimization>Disabled</Optimization>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessToFile>false</PreprocessToFile>

-      <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>

-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

-      <DisableLanguageExtensions>true</DisableLanguageExtensions>

-      <WarningLevel>Level4</WarningLevel>

-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>

-      <CompileAs>Default</CompileAs>

-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>

-      <MultiProcessorCompilation>true</MultiProcessorCompilation>

-      <CompileAsManaged>false</CompileAsManaged>

-      <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>

-      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>

-    </ClCompile>

-    <ResourceCompile>

-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Culture>0x0409</Culture>

-    </ResourceCompile>

-    <Lib>

-      <SuppressStartupBanner>true</SuppressStartupBanner>

-      <TargetMachine>MachineX64</TargetMachine>

-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

-    </Lib>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">

-    <ClCompile>

-      <Optimization>Disabled</Optimization>

-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

-      <DisableLanguageExtensions>true</DisableLanguageExtensions>

-      <WarningLevel>Level4</WarningLevel>

-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>

-      <CompileAs>Default</CompileAs>

-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>

-      <MultiProcessorCompilation>true</MultiProcessorCompilation>

-      <CompileAsManaged>false</CompileAsManaged>

-      <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>

-      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>

-    </ClCompile>

-    <ResourceCompile>

-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Culture>0x0409</Culture>

-    </ResourceCompile>

-    <Lib>

-      <SuppressStartupBanner>true</SuppressStartupBanner>

-      <TargetMachine>MachineX86</TargetMachine>

-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

-    </Lib>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">

-    <ClCompile>

-      <Optimization>Disabled</Optimization>

-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>

       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>

       <DisableLanguageExtensions>true</DisableLanguageExtensions>

@@ -379,10 +231,10 @@
   </ItemDefinitionGroup>

   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

     <ClCompile>

-      <Optimization>Full</Optimization>

+      <Optimization>MaxSpeed</Optimization>

       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <StringPooling>true</StringPooling>

       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>

       <FunctionLevelLinking>true</FunctionLevelLinking>

@@ -406,7 +258,7 @@
       <OmitFramePointers>true</OmitFramePointers>

     </ClCompile>

     <ResourceCompile>

-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>NDEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <Culture>0x0409</Culture>

     </ResourceCompile>

     <Lib>

@@ -419,10 +271,10 @@
   </ItemDefinitionGroup>

   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

     <ClCompile>

-      <Optimization>Full</Optimization>

+      <Optimization>MaxSpeed</Optimization>

       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <StringPooling>true</StringPooling>

       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>

       <FunctionLevelLinking>true</FunctionLevelLinking>

@@ -446,7 +298,7 @@
       <OmitFramePointers>true</OmitFramePointers>

     </ClCompile>

     <ResourceCompile>

-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>NDEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <Culture>0x0409</Culture>

     </ResourceCompile>

     <Lib>

@@ -457,12 +309,12 @@
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

     </Lib>

   </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">

     <ClCompile>

-      <Optimization>Full</Optimization>

+      <Optimization>MaxSpeed</Optimization>

       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <StringPooling>true</StringPooling>

       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

       <FunctionLevelLinking>true</FunctionLevelLinking>

@@ -498,12 +350,12 @@
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

     </Lib>

   </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">

+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">

     <ClCompile>

-      <Optimization>Full</Optimization>

+      <Optimization>MaxSpeed</Optimization>

       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

       <StringPooling>true</StringPooling>

       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

       <FunctionLevelLinking>true</FunctionLevelLinking>

@@ -539,1180 +391,54 @@
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

     </Lib>

   </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">

-    <ClCompile>

-      <Optimization>Full</Optimization>

-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <StringPooling>true</StringPooling>

-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <DisableLanguageExtensions>true</DisableLanguageExtensions>

-      <WarningLevel>Level4</WarningLevel>

-      <CompileAs>Default</CompileAs>

-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>

-      <MultiProcessorCompilation>true</MultiProcessorCompilation>

-      <WholeProgramOptimization>false</WholeProgramOptimization>

-      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>

-      <FloatingPointExceptions>false</FloatingPointExceptions>

-      <CreateHotpatchableImage>false</CreateHotpatchableImage>

-      <CompileAsManaged>false</CompileAsManaged>

-      <ProgramDataBaseFileName>

-      </ProgramDataBaseFileName>

-      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>

-      <DebugInformationFormat>

-      </DebugInformationFormat>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>

-      <OmitFramePointers>true</OmitFramePointers>

-    </ClCompile>

-    <ResourceCompile>

-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Culture>0x0409</Culture>

-    </ResourceCompile>

-    <Lib />

-    <Lib>

-      <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>

-      <TargetMachine>MachineX86</TargetMachine>

-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

-    </Lib>

-  </ItemDefinitionGroup>

-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">

-    <ClCompile>

-      <Optimization>Full</Optimization>

-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>

-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <StringPooling>true</StringPooling>

-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>

-      <FunctionLevelLinking>true</FunctionLevelLinking>

-      <DisableLanguageExtensions>true</DisableLanguageExtensions>

-      <WarningLevel>Level4</WarningLevel>

-      <CompileAs>Default</CompileAs>

-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>

-      <MultiProcessorCompilation>true</MultiProcessorCompilation>

-      <WholeProgramOptimization>false</WholeProgramOptimization>

-      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>

-      <FloatingPointExceptions>false</FloatingPointExceptions>

-      <CreateHotpatchableImage>false</CreateHotpatchableImage>

-      <CompileAsManaged>false</CompileAsManaged>

-      <ProgramDataBaseFileName>

-      </ProgramDataBaseFileName>

-      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>

-      <DebugInformationFormat>

-      </DebugInformationFormat>

-      <IntrinsicFunctions>true</IntrinsicFunctions>

-      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>

-      <OmitFramePointers>true</OmitFramePointers>

-    </ClCompile>

-    <ResourceCompile>

-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Culture>0x0409</Culture>

-    </ResourceCompile>

-    <Lib />

-    <Lib>

-      <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>

-      <TargetMachine>MachineX64</TargetMachine>

-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>

-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>

-    </Lib>

-  </ItemDefinitionGroup>

   <ItemGroup>

     <ClCompile Include="..\..\..\src\autofit\autofit.c" />

-    <ClCompile Include="..\..\..\src\bdf\bdf.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\cff\cff.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftbase.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftbase.c" />

+    <ClCompile Include="..\..\..\src\base\ftbbox.c" />

+    <ClCompile Include="..\..\..\src\base\ftbdf.c" />

     <ClCompile Include="..\..\..\src\base\ftbitmap.c" />

-    <ClCompile Include="..\..\..\src\cache\ftcache.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\ftdebug.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">false</DisableLanguageExtensions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">false</DisableLanguageExtensions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">false</DisableLanguageExtensions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">false</DisableLanguageExtensions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>

-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>

-    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftcid.c" />

     <ClCompile Include="..\..\..\src\base\ftfstype.c" />

     <ClCompile Include="..\..\..\src\base\ftgasp.c" />

-    <ClCompile Include="..\..\..\src\base\ftglyph.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftinit.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftstroke.c" />

-    <ClCompile Include="..\..\..\src\base\ftsystem.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\smooth\smooth.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftbbox.c" />

-    <ClCompile Include="..\..\..\src\base\ftfntfmt.c" />

-    <ClCompile Include="..\..\..\src\base\ftmm.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftpfr.c" />

-    <ClCompile Include="..\..\..\src\base\ftsynth.c" />

-    <ClCompile Include="..\..\..\src\base\fttype1.c" />

-    <ClCompile Include="..\..\..\src\base\ftwinfnt.c" />

-    <ClCompile Include="..\..\..\src\base\ftlcdfil.c" />

+    <ClCompile Include="..\..\..\src\base\ftglyph.c" />

     <ClCompile Include="..\..\..\src\base\ftgxval.c" />

+    <ClCompile Include="..\..\..\src\base\ftinit.c" />

+    <ClCompile Include="..\..\..\src\base\ftmm.c" />

     <ClCompile Include="..\..\..\src\base\ftotval.c" />

     <ClCompile Include="..\..\..\src\base\ftpatent.c" />

-    <ClCompile Include="..\..\..\src\pcf\pcf.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

+    <ClCompile Include="..\..\..\src\base\ftpfr.c" />

+    <ClCompile Include="..\..\..\src\base\ftstroke.c" />

+    <ClCompile Include="..\..\..\src\base\ftsynth.c" />

+    <ClCompile Include="..\..\..\src\base\ftsystem.c" />

+    <ClCompile Include="..\..\..\src\base\fttype1.c" />

+    <ClCompile Include="..\..\..\src\base\ftwinfnt.c" />

+    <ClCompile Include="..\..\..\src\bdf\bdf.c" />

+    <ClCompile Include="..\..\..\src\cache\ftcache.c" />

+    <ClCompile Include="..\..\..\src\cff\cff.c" />

+    <ClCompile Include="..\..\..\src\cid\type1cid.c" />

+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c" />

+    <ClCompile Include="..\..\..\src\lzw\ftlzw.c" />

+    <ClCompile Include="..\..\..\src\pcf\pcf.c" />

+    <ClCompile Include="..\..\..\src\pfr\pfr.c" />

+    <ClCompile Include="..\..\..\src\psaux\psaux.c" />

+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c" />

+    <ClCompile Include="..\..\..\src\psnames\psmodule.c" />

+    <ClCompile Include="..\..\..\src\raster\raster.c" />

+    <ClCompile Include="..\..\..\src\sfnt\sfnt.c" />

+    <ClCompile Include="..\..\..\src\smooth\smooth.c" />

+    <ClCompile Include="..\..\..\src\truetype\truetype.c" />

+    <ClCompile Include="..\..\..\src\type1\type1.c" />

+    <ClCompile Include="..\..\..\src\type42\type42.c" />

+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c" />

+    <ClCompile Include="..\ftdebug.c">

+      <DisableLanguageExtensions>false</DisableLanguageExtensions>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\pfr\pfr.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\psaux\psaux.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\psnames\psmodule.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\raster\raster.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\truetype\truetype.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\type1\type1.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\cid\type1cid.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\type42\type42.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>

-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>

-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>

-    </ClCompile>

-  </ItemGroup>

-  <ItemGroup>

-    <ClInclude Include="..\..\..\include\ft2build.h" />

-    <ClInclude Include="..\..\..\include\config\ftconfig.h" />

-    <ClInclude Include="..\..\..\include\config\ftheader.h" />

-    <ClInclude Include="..\..\..\include\config\ftmodule.h" />

-    <ClInclude Include="..\..\..\include\config\ftoption.h" />

-    <ClInclude Include="..\..\..\include\config\ftstdlib.h" />

+    <ResourceCompile Include="..\..\..\src\base\ftver.rc" />

   </ItemGroup>

   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

   <ImportGroup Label="ExtensionTargets">

   </ImportGroup>

-</Project>
\ No newline at end of file
+  <Target Name="AfterBuild">

+    <Copy SourceFiles="$(TargetPath)" DestinationFolder="..\..\..\objs" />

+  </Target>

+</Project>

diff --git a/builds/windows/vc2010/freetype.vcxproj.filters b/builds/windows/vc2010/freetype.vcxproj.filters
index f762b0b..8ba3673 100644
--- a/builds/windows/vc2010/freetype.vcxproj.filters
+++ b/builds/windows/vc2010/freetype.vcxproj.filters
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>

+<?xml version="1.0" encoding="utf-8"?>

 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

   <ItemGroup>

     <Filter Include="Source Files">

@@ -17,63 +17,111 @@
     <ClCompile Include="..\..\..\src\autofit\autofit.c">

       <Filter>Source Files</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\bdf\bdf.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\cff\cff.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftbase.c">

       <Filter>Source Files</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftbitmap.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\cache\ftcache.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\ftdebug.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftfstype.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftgasp.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftglyph.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">

-      <Filter>Source Files</Filter>

-    </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftinit.c">

       <Filter>Source Files</Filter>

     </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftsystem.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\bdf\bdf.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\cache\ftcache.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\cff\cff.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\cid\type1cid.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

     <ClCompile Include="..\..\..\src\lzw\ftlzw.c">

       <Filter>Source Files</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftstroke.c">

+    <ClCompile Include="..\..\..\src\pfr\pfr.c">

       <Filter>Source Files</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftsystem.c">

+    <ClCompile Include="..\..\..\src\pcf\pcf.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\psaux\psaux.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\psnames\psmodule.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\raster\raster.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">

       <Filter>Source Files</Filter>

     </ClCompile>

     <ClCompile Include="..\..\..\src\smooth\smooth.c">

       <Filter>Source Files</Filter>

     </ClCompile>

+    <ClCompile Include="..\..\..\src\truetype\truetype.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\type1\type1.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\type42\type42.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

+    <ClCompile Include="..\ftdebug.c">

+      <Filter>Source Files</Filter>

+    </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftbbox.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftfntfmt.c">

+    <ClCompile Include="..\..\..\src\base\ftbdf.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftbitmap.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftcid.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftfstype.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftgasp.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftglyph.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftgxval.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftmm.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftotval.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftpatent.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftpfr.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

+    <ClCompile Include="..\..\..\src\base\ftstroke.c">

+      <Filter>Source Files\FT_MODULES</Filter>

+    </ClCompile>

     <ClCompile Include="..\..\..\src\base\ftsynth.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

@@ -83,72 +131,24 @@
     <ClCompile Include="..\..\..\src\base\ftwinfnt.c">

       <Filter>Source Files\FT_MODULES</Filter>

     </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftlcdfil.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftgxval.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftotval.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\base\ftpatent.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\pcf\pcf.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\pfr\pfr.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\psaux\psaux.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\psnames\psmodule.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\raster\raster.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\truetype\truetype.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\type1\type1.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\cid\type1cid.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\type42\type42.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

-    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">

-      <Filter>Source Files\FT_MODULES</Filter>

-    </ClCompile>

   </ItemGroup>

   <ItemGroup>

     <ClInclude Include="..\..\..\include\ft2build.h">

       <Filter>Header Files</Filter>

     </ClInclude>

-    <ClInclude Include="..\..\..\include\config\ftconfig.h">

+    <ClInclude Include="..\..\..\include\freetype\config\ftconfig.h">

       <Filter>Header Files</Filter>

     </ClInclude>

-    <ClInclude Include="..\..\..\include\config\ftheader.h">

+    <ClInclude Include="..\..\..\include\freetype\config\ftheader.h">

       <Filter>Header Files</Filter>

     </ClInclude>

-    <ClInclude Include="..\..\..\include\config\ftmodule.h">

+    <ClInclude Include="..\..\..\include\freetype\config\ftmodule.h">

       <Filter>Header Files</Filter>

     </ClInclude>

-    <ClInclude Include="..\..\..\include\config\ftoption.h">

+    <ClInclude Include="..\..\..\include\freetype\config\ftoption.h">

       <Filter>Header Files</Filter>

     </ClInclude>

-    <ClInclude Include="..\..\..\include\config\ftstdlib.h">

+    <ClInclude Include="..\..\..\include\freetype\config\ftstdlib.h">

       <Filter>Header Files</Filter>

     </ClInclude>

   </ItemGroup>

diff --git a/builds/windows/vc2010/index.html b/builds/windows/vc2010/index.html
index 37e642d..c3e6040 100644
--- a/builds/windows/vc2010/index.html
+++ b/builds/windows/vc2010/index.html
@@ -1,45 +1,29 @@
 <html>
 <header>
 <title>
-  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2010 or newer
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++&nbsp;2010 or newer
 </title>
 
 <body>
 <h1>
-  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2010 or newer
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++&nbsp;2010 or newer
 </h1>
 
-<p>This directory contains a project file for Visual C++ (VS.NET&nbsp;2010
-or newer), named <tt>freetype.vcxproj</tt>, and Visual Studio, called
-<tt>freetype.sln</tt>.  It compiles the following libraries from the
-FreeType 2.6 sources:</p>
+<p>This directory contains solution and project files for
+Visual&nbsp;C++&nbsp;2010 or newer, named <tt>freetype.sln</tt>,
+and <tt>freetype.vcxproj</tt>.  It compiles the following libraries
+from the FreeType 2.9.1 sources:</p>
 
 <ul>
-  <pre>
-freetype26.lib     - release build
-freetype26d.lib    - debug build
-freetype26ST.lib   - release build; single threaded
-freetype26STd.lib  - debug build;   single threaded
-freetype26MT.lib   - release build; multi-threaded
-freetype26MTd.lib  - debug build;   multi-threaded</pre>
+  <li>freetype.dll using 'Release' or 'Debug' configurations</li>
+  <li>freetype.lib using 'Release Static' or 'Debug Static' configurations</li>
 </ul>
 
-<p>Both Win32 and x64 builds are supported.</p>
-
-<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
-archives are already stored this way, so no further action is required.  If
-you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
-tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
-file smart CR/LF Conversion</em> option.  Alternatively, you may consider
-using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
-around, which specifically deal with this particular problem.
-
-<p>Build directories are placed in the top-level <tt>objs\vc2010</tt>
-directory.</p>
+<p>Both Win32 and x64 builds are supported.  Build directories and target
+files are placed in the top-level <tt>objs</tt> directory.</p>
 
 <p>Customization of the FreeType library is done by editing the
-<tt>ftoptions.h</tt> header file in the top-level <tt>devel</tt> path.
+<tt>ftoption.h</tt> header file in the top-level <tt>devel</tt> path.
 Alternatively, you may copy the file to another directory and change the
 include directory in <tt>freetype.users.props</tt>.</p>
 
@@ -48,5 +32,9 @@
 simplifies automated (command-line) builds using <a
 href="http://msdn.microsoft.com/library/dd393574%28v=vs.100%29.aspx">msbuild</a>.</p>
 
+<p>To link your executable with FreeType DLL, you may want to define
+FT2_DLLIMPORT so that the imported functions are appropriately
+attributed with <tt>dllimport<tt>.</p>
+
 </body>
 </html>
diff --git a/builds/windows/visualc/freetype.dsp b/builds/windows/visualc/freetype.dsp
index 6f03105..dac3d25 100644
--- a/builds/windows/visualc/freetype.dsp
+++ b/builds/windows/visualc/freetype.dsp
@@ -54,7 +54,7 @@
 # ADD BSC32 /nologo

 LIB32=link.exe -lib

 # ADD BASE LIB32 /nologo

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug"

 

@@ -78,7 +78,7 @@
 # ADD BSC32 /nologo

 LIB32=link.exe -lib

 # ADD BASE LIB32 /nologo

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291_D.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"

 

@@ -102,8 +102,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"lib\freetype26_D.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT_D.lib"

+# ADD BASE LIB32 /nologo /out:"lib\freetype291_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291MT_D.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"

 

@@ -126,8 +126,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"lib\freetype26.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT.lib"

+# ADD BASE LIB32 /nologo /out:"lib\freetype291.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291MT.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"

 

@@ -151,8 +151,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26.lib"

-# ADD LIB32 /out:"..\..\..\objs\freetype26ST.lib"

+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype291.lib"

+# ADD LIB32 /out:"..\..\..\objs\freetype291ST.lib"

 # SUBTRACT LIB32 /nologo

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"

@@ -177,8 +177,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26ST_D.lib"

+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype291_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291ST_D.lib"

 

 !ENDIF

 

@@ -200,17 +200,14 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\bdf\bdf.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\cff\cff.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftbase.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -226,7 +223,11 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\src\base\ftfntfmt.c

+SOURCE=..\..\..\src\base\ftcid.c

+# End Source File

+# Begin Source File

+

+SOURCE=..\..\..\src\base\ftpatent.c

 # End Source File

 # Begin Source File

 

@@ -239,18 +240,15 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\cache\ftcache.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\ftdebug.c

 # ADD CPP /Ze

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftglyph.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -263,7 +261,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftinit.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -272,7 +269,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftmm.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -293,7 +289,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftsystem.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -306,7 +301,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\pcf\pcf.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -315,57 +309,46 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\psaux\psaux.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\pshinter\pshinter.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\psnames\psmodule.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\raster\raster.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\sfnt\sfnt.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\smooth\smooth.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\truetype\truetype.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\type1\type1.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\cid\type1cid.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\type42\type42.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\winfonts\winfnt.c

-# SUBTRACT CPP /Fr

 # End Source File

 # End Group

 # Begin Group "Header Files"

@@ -377,23 +360,23 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftconfig.h

+SOURCE=..\..\..\include\freetype\config\ftconfig.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftheader.h

+SOURCE=..\..\..\include\freetype\config\ftheader.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftmodule.h

+SOURCE=..\..\..\include\freetype\config\ftmodule.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftoption.h

+SOURCE=..\..\..\include\freetype\config\ftoption.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftstdlib.h

+SOURCE=..\..\..\include\freetype\config\ftstdlib.h

 # End Source File

 # End Group

 # End Target

diff --git a/builds/windows/visualc/freetype.vcproj b/builds/windows/visualc/freetype.vcproj
index f434964..dd0c418 100644
--- a/builds/windows/visualc/freetype.vcproj
+++ b/builds/windows/visualc/freetype.vcproj
@@ -69,7 +69,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -144,7 +144,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -219,7 +219,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -291,7 +291,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -364,7 +364,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -438,7 +438,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -472,203 +472,14 @@
 			<File

 				RelativePath="..\..\..\src\bdf\bdf.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\cff\cff.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbase.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbitmap.c"

@@ -685,139 +496,13 @@
 			<File

 				RelativePath="..\..\..\src\cache\ftcache.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\ftdebug.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

+				<FileConfiguration>

 					<Tool

 						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

 						DisableLanguageExtensions="false"

 					/>

 				</FileConfiguration>

@@ -825,270 +510,18 @@
 			<File

 				RelativePath="..\..\..\src\base\ftglyph.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\gzip\ftgzip.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftinit.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\lzw\ftlzw.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftstroke.c"

@@ -1097,136 +530,10 @@
 			<File

 				RelativePath="..\..\..\src\base\ftsystem.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\smooth\smooth.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

 			</File>

 			<Filter

 				Name="FT_MODULES"

@@ -1236,75 +543,16 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftfntfmt.c"

+					RelativePath="..\..\..\src\base\ftbdf.c"

+					>

+				</File>

+				<File

+					RelativePath="..\..\..\src\base\ftcid.c"

 					>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftmm.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftpfr.c"

@@ -1323,10 +571,6 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftlcdfil.c"

-					>

-				</File>

-				<File

 					RelativePath="..\..\..\src\base\ftgxval.c"

 					>

 				</File>

@@ -1341,806 +585,50 @@
 				<File

 					RelativePath="..\..\..\src\pcf\pcf.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pfr\pfr.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psaux\psaux.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pshinter\pshinter.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psnames\psmodule.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\raster\raster.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\sfnt\sfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\truetype\truetype.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type1\type1.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\cid\type1cid.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type42\type42.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\winfonts\winfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

 				</File>

 			</Filter>

 		</Filter>

@@ -2153,23 +641,23 @@
 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftconfig.h"

+				RelativePath="..\..\..\include\freetype\config\ftconfig.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftheader.h"

+				RelativePath="..\..\..\include\freetype\config\ftheader.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftmodule.h"

+				RelativePath="..\..\..\include\freetype\config\ftmodule.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftoption.h"

+				RelativePath="..\..\..\include\freetype\config\ftoption.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftstdlib.h"

+				RelativePath="..\..\..\include\freetype\config\ftstdlib.h"

 				>

 			</File>

 		</Filter>

diff --git a/builds/windows/visualc/index.html b/builds/windows/visualc/index.html
index 2beb8a9..c0611d2 100644
--- a/builds/windows/visualc/index.html
+++ b/builds/windows/visualc/index.html
@@ -11,22 +11,22 @@
 
 <p>This directory contains project files for Visual C++, named
 <tt>freetype.dsp</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
-compiles the following libraries from the FreeType 2.6 sources:</p>
+compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/windows/visualce/freetype.dsp b/builds/windows/visualce/freetype.dsp
index 6f03105..5fe2b5a 100644
--- a/builds/windows/visualce/freetype.dsp
+++ b/builds/windows/visualce/freetype.dsp
@@ -54,7 +54,7 @@
 # ADD BSC32 /nologo

 LIB32=link.exe -lib

 # ADD BASE LIB32 /nologo

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug"

 

@@ -78,7 +78,7 @@
 # ADD BSC32 /nologo

 LIB32=link.exe -lib

 # ADD BASE LIB32 /nologo

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291_D.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"

 

@@ -102,8 +102,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"lib\freetype26_D.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT_D.lib"

+# ADD BASE LIB32 /nologo /out:"lib\freetype291_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291MT_D.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"

 

@@ -126,8 +126,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"lib\freetype26.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26MT.lib"

+# ADD BASE LIB32 /nologo /out:"lib\freetype291.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291MT.lib"

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"

 

@@ -151,8 +151,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26.lib"

-# ADD LIB32 /out:"..\..\..\objs\freetype26ST.lib"

+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype291.lib"

+# ADD LIB32 /out:"..\..\..\objs\freetype291ST.lib"

 # SUBTRACT LIB32 /nologo

 

 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"

@@ -177,8 +177,8 @@
 # ADD BASE BSC32 /nologo

 # ADD BSC32 /nologo

 LIB32=link.exe -lib

-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype26_D.lib"

-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype26ST_D.lib"

+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype291_D.lib"

+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype291ST_D.lib"

 

 !ENDIF

 

@@ -200,17 +200,14 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\bdf\bdf.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\cff\cff.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftbase.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -226,7 +223,7 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\src\base\ftfntfmt.c

+SOURCE=..\..\..\src\base\ftcid.c

 # End Source File

 # Begin Source File

 

@@ -239,18 +236,15 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\cache\ftcache.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\ftdebug.c

 # ADD CPP /Ze

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftglyph.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -263,7 +257,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftinit.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -272,7 +265,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftmm.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -280,6 +272,10 @@
 # End Source File

 # Begin Source File

 

+SOURCE=..\..\..\src\base\ftpatent.c

+# End Source File

+# Begin Source File

+

 SOURCE=..\..\..\src\base\ftpfr.c

 # End Source File

 # Begin Source File

@@ -293,7 +289,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\base\ftsystem.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -306,7 +301,6 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\pcf\pcf.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

@@ -315,57 +309,46 @@
 # Begin Source File

 

 SOURCE=..\..\..\src\psaux\psaux.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\pshinter\pshinter.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\psnames\psmodule.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\raster\raster.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\sfnt\sfnt.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\smooth\smooth.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\truetype\truetype.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\type1\type1.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\cid\type1cid.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\type42\type42.c

-# SUBTRACT CPP /Fr

 # End Source File

 # Begin Source File

 

 SOURCE=..\..\..\src\winfonts\winfnt.c

-# SUBTRACT CPP /Fr

 # End Source File

 # End Group

 # Begin Group "Header Files"

@@ -377,23 +360,23 @@
 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftconfig.h

+SOURCE=..\..\..\include\freetype\config\ftconfig.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftheader.h

+SOURCE=..\..\..\include\freetype\config\ftheader.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftmodule.h

+SOURCE=..\..\..\include\freetype\config\ftmodule.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftoption.h

+SOURCE=..\..\..\include\freetype\config\ftoption.h

 # End Source File

 # Begin Source File

 

-SOURCE=..\..\..\include\config\ftstdlib.h

+SOURCE=..\..\..\include\freetype\config\ftstdlib.h

 # End Source File

 # End Group

 # End Target

diff --git a/builds/windows/visualce/freetype.vcproj b/builds/windows/visualce/freetype.vcproj
index 69a9e97..b797311 100644
--- a/builds/windows/visualce/freetype.vcproj
+++ b/builds/windows/visualce/freetype.vcproj
@@ -87,7 +87,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -162,7 +162,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -237,7 +237,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -309,7 +309,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -382,7 +382,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -456,7 +456,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -534,7 +534,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -619,7 +619,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -704,7 +704,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -785,7 +785,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -867,7 +867,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -950,7 +950,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1036,7 +1036,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1121,7 +1121,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1206,7 +1206,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1287,7 +1287,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1369,7 +1369,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1452,7 +1452,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1538,7 +1538,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1623,7 +1623,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1708,7 +1708,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -1789,7 +1789,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1871,7 +1871,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -1954,7 +1954,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2040,7 +2040,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2125,7 +2125,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2210,7 +2210,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -2291,7 +2291,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2373,7 +2373,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2456,7 +2456,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2542,7 +2542,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2627,7 +2627,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2712,7 +2712,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -2793,7 +2793,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2875,7 +2875,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -2958,7 +2958,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3044,7 +3044,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26.lib"

+				OutputFile="..\..\..\objs\freetype291.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3129,7 +3129,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT.lib"

+				OutputFile="..\..\..\objs\freetype291MT.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3214,7 +3214,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST.lib"

+				OutputFile="..\..\..\objs\freetype291ST.lib"

 			/>

 			<Tool

 				Name="VCALinkTool"

@@ -3295,7 +3295,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26_D.lib"

+				OutputFile="..\..\..\objs\freetype291_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3377,7 +3377,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26ST_D.lib"

+				OutputFile="..\..\..\objs\freetype291ST_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3460,7 +3460,7 @@
 			/>

 			<Tool

 				Name="VCLibrarianTool"

-				OutputFile="..\..\..\objs\freetype26MT_D.lib"

+				OutputFile="..\..\..\objs\freetype291MT_D.lib"

 				SuppressStartupBanner="true"

 			/>

 			<Tool

@@ -3502,1283 +3502,14 @@
 			<File

 				RelativePath="..\..\..\src\bdf\bdf.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\cff\cff.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbase.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftbitmap.c"

@@ -4791,895 +3522,13 @@
 			<File

 				RelativePath="..\..\..\src\cache\ftcache.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\ftdebug.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

+				<FileConfiguration>

 					<Tool

 						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						DisableLanguageExtensions="false"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

 						DisableLanguageExtensions="false"

 					/>

 				</FileConfiguration>

@@ -5691,1710 +3540,18 @@
 			<File

 				RelativePath="..\..\..\src\base\ftglyph.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\gzip\ftgzip.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftinit.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\lzw\ftlzw.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\base\ftstroke.c"

@@ -7403,856 +3560,10 @@
 			<File

 				RelativePath="..\..\..\src\base\ftsystem.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<File

 				RelativePath="..\..\..\src\smooth\smooth.c"

 				>

-				<FileConfiguration

-					Name="Release|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Win32"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-						BasicRuntimeChecks="3"

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="2"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

-				<FileConfiguration

-					Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-					>

-					<Tool

-						Name="VCCLCompilerTool"

-						Optimization="0"

-						AdditionalIncludeDirectories=""

-						PreprocessorDefinitions=""

-					/>

-				</FileConfiguration>

 			</File>

 			<Filter

 				Name="FT_MODULES"

@@ -8262,435 +3573,16 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftfntfmt.c"

+					RelativePath="..\..\..\src\base\ftbdf.c"

+					>

+				</File>

+				<File

+					RelativePath="..\..\..\src\base\ftcid.c"

 					>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftmm.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\base\ftpfr.c"

@@ -8709,10 +3601,6 @@
 					>

 				</File>

 				<File

-					RelativePath="..\..\..\src\base\ftlcdfil.c"

-					>

-				</File>

-				<File

 					RelativePath="..\..\..\src\base\ftgxval.c"

 					>

 				</File>

@@ -8727,5126 +3615,50 @@
 				<File

 					RelativePath="..\..\..\src\pcf\pcf.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pfr\pfr.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psaux\psaux.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\pshinter\pshinter.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\psnames\psmodule.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\raster\raster.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\sfnt\sfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\truetype\truetype.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type1\type1.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\cid\type1cid.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\type42\type42.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 				<File

 					RelativePath="..\..\..\src\winfonts\winfnt.c"

 					>

-					<FileConfiguration

-						Name="Release|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Win32"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-							BasicRuntimeChecks="3"

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="2"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

-					<FileConfiguration

-						Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"

-						>

-						<Tool

-							Name="VCCLCompilerTool"

-							Optimization="0"

-							AdditionalIncludeDirectories=""

-							PreprocessorDefinitions=""

-						/>

-					</FileConfiguration>

 				</File>

 			</Filter>

 		</Filter>

@@ -13859,23 +3671,23 @@
 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftconfig.h"

+				RelativePath="..\..\..\include\freetype\config\ftconfig.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftheader.h"

+				RelativePath="..\..\..\include\freetype\config\ftheader.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftmodule.h"

+				RelativePath="..\..\..\include\freetype\config\ftmodule.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftoption.h"

+				RelativePath="..\..\..\include\freetype\config\ftoption.h"

 				>

 			</File>

 			<File

-				RelativePath="..\..\..\include\config\ftstdlib.h"

+				RelativePath="..\..\..\include\freetype\config\ftstdlib.h"

 				>

 			</File>

 		</Filter>

diff --git a/builds/windows/visualce/index.html b/builds/windows/visualce/index.html
index 90334f5..d5a3ca3 100644
--- a/builds/windows/visualce/index.html
+++ b/builds/windows/visualce/index.html
@@ -21,22 +21,22 @@
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.6 sources:</p>
+It compiles the following libraries from the FreeType 2.9.1 sources:</p>
 
 <ul>
   <pre>
-    freetype26.lib     - release build; single threaded
-    freetype26_D.lib   - debug build;   single threaded
-    freetype26MT.lib   - release build; multi-threaded
-    freetype26MT_D.lib - debug build;   multi-threaded</pre>
+    freetype291.lib     - release build; single threaded
+    freetype291_D.lib   - debug build;   single threaded
+    freetype291MT.lib   - release build; multi-threaded
+    freetype291MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
 archives are already stored this way, so no further action is required.  If
 you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
 tool to convert the line endings.  For example, with <a
-href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
-file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+href="http://www.winzip.com">WinZip</a>, you should activate the <em>TAR
+file smart CR/LF Conversion</em> option.  Alternatively, you may consider
 using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
 around, which specifically deal with this particular problem.
 
diff --git a/builds/windows/w32-bcc.mk b/builds/windows/w32-bcc.mk
index d483df5..01aab1c 100644
--- a/builds/windows/w32-bcc.mk
+++ b/builds/windows/w32-bcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-bccd.mk b/builds/windows/w32-bccd.mk
index bd72ca1..2c14d6c 100644
--- a/builds/windows/w32-bccd.mk
+++ b/builds/windows/w32-bccd.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-dev.mk b/builds/windows/w32-dev.mk
index 11d1afd..279d5f9 100644
--- a/builds/windows/w32-dev.mk
+++ b/builds/windows/w32-dev.mk
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-gcc.mk b/builds/windows/w32-gcc.mk
index 1092fb7..9e3476b 100644
--- a/builds/windows/w32-gcc.mk
+++ b/builds/windows/w32-gcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-icc.mk b/builds/windows/w32-icc.mk
index b2dcbe5..e695c12 100644
--- a/builds/windows/w32-icc.mk
+++ b/builds/windows/w32-icc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-intl.mk b/builds/windows/w32-intl.mk
index de9912f..1e36662 100644
--- a/builds/windows/w32-intl.mk
+++ b/builds/windows/w32-intl.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-lcc.mk b/builds/windows/w32-lcc.mk
index 75979f3..5729d36 100644
--- a/builds/windows/w32-lcc.mk
+++ b/builds/windows/w32-lcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-mingw32.mk b/builds/windows/w32-mingw32.mk
index 1300a44..b3a210d 100644
--- a/builds/windows/w32-mingw32.mk
+++ b/builds/windows/w32-mingw32.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-vcc.mk b/builds/windows/w32-vcc.mk
index fcf1aa0..342c8aa 100644
--- a/builds/windows/w32-vcc.mk
+++ b/builds/windows/w32-vcc.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/w32-wat.mk b/builds/windows/w32-wat.mk
index cc5eaf0..37ecc88 100644
--- a/builds/windows/w32-wat.mk
+++ b/builds/windows/w32-wat.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/builds/windows/win32-def.mk b/builds/windows/win32-def.mk
index 516c5cd..f83d444 100644
--- a/builds/windows/win32-def.mk
+++ b/builds/windows/win32-def.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/configure b/configure
index fd52581..f9d2186 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -15,7 +15,7 @@
 
 rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk
 
-# respect GNUMAKE environment variable for backwards compatibility
+# respect GNUMAKE environment variable for backward compatibility
 if test "x$GNUMAKE" = x; then
   if test "x$MAKE" = x; then
     if test "x`make -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then
@@ -29,7 +29,7 @@
 fi
 
 if test "x`$MAKE -v 2>/dev/null | egrep 'GNU|makepp'`" = x; then
-  echo "GNU make (>= 3.80) or makepp (>= 1.19) is required to build FreeType2." >&2
+  echo "GNU make (>= 3.81) or makepp (>= 2.0) is required to build FreeType2." >&2
   echo "Please try" >&2
   echo >&2
   echo "  MAKE=<GNU make command name> $0" >&2
diff --git a/devel/ft2build.h b/devel/ft2build.h
index 8e9653d..1d17141 100644
--- a/devel/ft2build.h
+++ b/devel/ft2build.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType 2 build and setup macros (development version).             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,14 +27,14 @@
   *
   */
 
-#ifndef __FT2BUILD_H__
-#define __FT2BUILD_H__
+#ifndef FT2BUILD_H_
+#define FT2BUILD_H_
 
 #define FT_CONFIG_OPTIONS_H  <ftoption.h>
 
-#include <config/ftheader.h>
+#include <freetype/config/ftheader.h>
 
-#endif /* __FT2BUILD_H__ */
+#endif /* FT2BUILD_H_ */
 
 
 /* END */
diff --git a/devel/ftoption.h b/devel/ftoption.h
index ed63aa0..1b4619e 100644
--- a/devel/ftoption.h
+++ b/devel/ftoption.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    User-selectable configuration macros (specification only).           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTOPTION_H__
-#define __FTOPTION_H__
+#ifndef FTOPTION_H_
+#define FTOPTION_H_
 
 
 #include <ft2build.h>
@@ -38,9 +38,9 @@
   /*    library from a single source directory.                            */
   /*                                                                       */
   /*  - You can put a copy of this file in your build directory, more      */
-  /*    precisely in `$BUILD/config/ftoption.h', where `$BUILD' is the     */
-  /*    name of a directory that is included _before_ the FreeType include */
-  /*    path during compilation.                                           */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
   /*                                                                       */
   /*    The default FreeType Makefiles and Jamfiles use the build          */
   /*    directory `builds/<system>' by default, but you can easily change  */
@@ -51,7 +51,7 @@
   /*    locate this file during the build.  For example,                   */
   /*                                                                       */
   /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
-  /*      #include <config/ftheader.h>                                     */
+  /*      #include <freetype/config/ftheader.h>                            */
   /*                                                                       */
   /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
   /*    definitions.                                                       */
@@ -59,7 +59,7 @@
   /*    Note also that you can similarly pre-define the macro              */
   /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
   /*    that are statically linked to the library at compile time.  By     */
-  /*    default, this file is <config/ftmodule.h>.                         */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
   /*                                                                       */
   /* We highly recommend using the third method whenever possible.         */
   /*                                                                       */
@@ -77,22 +77,49 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Uncomment the line below if you want to activate sub-pixel rendering  */
-  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /* If you enable this configuration option, FreeType recognizes an       */
+  /* environment variable called `FREETYPE_PROPERTIES', which can be used  */
+  /* to control the various font drivers and modules.  The controllable    */
+  /* properties are listed in the section `Controlling FreeType Modules'   */
+  /* in the reference's table of contents; currently there are properties  */
+  /* for the auto-hinter (file `ftautoh.h'), CFF (file `ftcffdrv.h'),      */
+  /* TrueType (file `ftttdrv.h'), and PCF (file `ftpcfdrv.h').             */
+  /*                                                                       */
+  /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */
+  /* multiple lines for better readability).                               */
+  /*                                                                       */
+  /*   <optional whitespace>                                               */
+  /*   <module-name1> ':'                                                  */
+  /*   <property-name1> '=' <property-value1>                              */
+  /*   <whitespace>                                                        */
+  /*   <module-name2> ':'                                                  */
+  /*   <property-name2> '=' <property-value2>                              */
+  /*   ...                                                                 */
+  /*                                                                       */
+  /* Example:                                                              */
+  /*                                                                       */
+  /*   FREETYPE_PROPERTIES=truetype:interpreter-version=35 \               */
+  /*                       cff:no-stem-darkening=1 \                       */
+  /*                       autofitter:warping=1                            */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the line below if you want to activate LCD rendering        */
+  /* technology similar to ClearType in this build of the library.  This   */
+  /* technology triples the resolution in the direction color subpixels.   */
+  /* To mitigate color fringes inherent to this technology, you also need  */
+  /* to explicitly set up LCD filtering.                                   */
   /*                                                                       */
   /* Note that this feature is covered by several Microsoft patents        */
   /* and should not be activated in any default build of the library.      */
+  /* When this macro is not defined, FreeType offers alternative LCD       */
+  /* rendering technology that produces excellent output without LCD       */
+  /* filtering.                                                            */
   /*                                                                       */
-  /* This macro has no impact on the FreeType API, only on its             */
-  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
-  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
-  /* the original size in case this macro isn't defined; however, each     */
-  /* triplet of subpixels has R=G=B.                                       */
-  /*                                                                       */
-  /* This is done to allow FreeType clients to run unmodified, forcing     */
-  /* them to display normal gray-level anti-aliased glyphs.                */
-  /*                                                                       */
-#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
 
   /*************************************************************************/
@@ -205,6 +232,17 @@
 
   /*************************************************************************/
   /*                                                                       */
+  /* Define to disable the use of file stream functions and types, FILE,   */
+  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
+  /* systems that have multiple system libraries, some with or without     */
+  /* file stream support, in the cases where file stream support is not    */
+  /* necessary such as memory loading of font files.                       */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
   /* PNG bitmap support.                                                   */
   /*                                                                       */
   /*   FreeType now handles loading color bitmap glyphs in the PNG format. */
@@ -232,59 +270,6 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Define to disable the use of file stream functions and types, FILE,   */
-  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
-  /* systems that have multiple system libraries, some with or without     */
-  /* file stream support, in the cases where file stream support is not    */
-  /* necessary such as memory loading of font files.                       */
-  /*                                                                       */
-/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DLL export compilation                                                */
-  /*                                                                       */
-  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
-  /*   special keyword in front OR after the return type of function       */
-  /*   declarations.                                                       */
-  /*                                                                       */
-  /*   Two macros are used within the FreeType source code to define       */
-  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
-  /*                                                                       */
-  /*     FT_EXPORT( return_type )                                          */
-  /*                                                                       */
-  /*       is used in a function declaration, as in                        */
-  /*                                                                       */
-  /*         FT_EXPORT( FT_Error )                                         */
-  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
-  /*                                                                       */
-  /*                                                                       */
-  /*     FT_EXPORT_DEF( return_type )                                      */
-  /*                                                                       */
-  /*       is used in a function definition, as in                         */
-  /*                                                                       */
-  /*         FT_EXPORT_DEF( FT_Error )                                     */
-  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
-  /*         {                                                             */
-  /*           ... some code ...                                           */
-  /*           return FT_Err_Ok;                                           */
-  /*         }                                                             */
-  /*                                                                       */
-  /*   You can provide your own implementation of FT_EXPORT and            */
-  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
-  /*   will be later automatically defined as `extern return_type' to      */
-  /*   allow normal compilation.                                           */
-  /*                                                                       */
-  /*   Do not #undef these macros here since the build system might define */
-  /*   them for certain configurations only.                               */
-  /*                                                                       */
-/* #define FT_EXPORT(x)      extern x */
-/* #define FT_EXPORT_DEF(x)  x */
-
-
-  /*************************************************************************/
-  /*                                                                       */
   /* Glyph Postscript Names handling                                       */
   /*                                                                       */
   /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
@@ -297,7 +282,7 @@
   /*                                                                       */
   /*   - The TrueType driver will provide its own set of glyph names,      */
   /*     if you build it to support postscript names in the TrueType       */
-  /*     `post' table.                                                     */
+  /*     `post' table, but will not synthesize a missing Unicode charmap.  */
   /*                                                                       */
   /*   - The Type 1 driver will not be able to synthesize a Unicode        */
   /*     charmap out of the glyphs found in the fonts.                     */
@@ -492,7 +477,21 @@
   /*   code will be used.                                                  */
   /*                                                                       */
   /*   Setting this macro is needed for systems that prohibit address      */
-  /*   fixups, such as BREW.                                               */
+  /*   fixups, such as BREW.  [Note that standard compilers like gcc or    */
+  /*   clang handle PIC generation automatically; you don't have to set    */
+  /*   FT_CONFIG_OPTION_PIC, which is only necessary for very special      */
+  /*   compilers.]                                                         */
+  /*                                                                       */
+  /*   Note that FT_CONFIG_OPTION_PIC support is not available for all     */
+  /*   modules (see `modules.cfg' for a complete list).  For building with */
+  /*   FT_CONFIG_OPTION_PIC support, do the following.                     */
+  /*                                                                       */
+  /*     0. Clone the repository.                                          */
+  /*     1. Define FT_CONFIG_OPTION_PIC.                                   */
+  /*     2. Remove all subdirectories in `src' that don't have             */
+  /*        FT_CONFIG_OPTION_PIC support.                                  */
+  /*     3. Comment out the corresponding modules in `modules.cfg'.        */
+  /*     4. Compile.                                                       */
   /*                                                                       */
 /* #define FT_CONFIG_OPTION_PIC */
 
@@ -586,73 +585,53 @@
   /*************************************************************************/
   /*                                                                       */
   /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */
-  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */
-  /* replaces the native TrueType hinting mechanism when anything but      */
-  /* FT_RENDER_MODE_MONO is requested.                                     */
+  /* subpixel hinting support into the TrueType driver.  This modifies the */
+  /* TrueType hinting mechanism when anything but FT_RENDER_MODE_MONO is   */
+  /* requested.                                                            */
   /*                                                                       */
-  /* Enabling this causes the TrueType driver to ignore instructions under */
-  /* certain conditions.  This is done in accordance with the guide here,  */
-  /* with some minor differences:                                          */
+  /* In particular, it modifies the bytecode interpreter to interpret (or  */
+  /* not) instructions in a certain way so that all TrueType fonts look    */
+  /* like they do in a Windows ClearType (DirectWrite) environment.  See   */
+  /* [1] for a technical overview on what this means.  See `ttinterp.h'    */
+  /* for more details on the LEAN option.                                  */
   /*                                                                       */
-  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /* There are three options.                                              */
   /*                                                                       */
-  /* By undefining this, you only compile the code necessary to hint       */
-  /* TrueType glyphs with native TT hinting.                               */
+  /* 1. This option is associated with the `Infinality' moniker.           */
+  /*    Contributed by an individual nicknamed Infinality with the goal of */
+  /*    making TrueType fonts render better than on Windows.  A high       */
+  /*    amount of configurability and flexibility, down to rules for       */
+  /*    single glyphs in fonts, but also very slow.  Its experimental and  */
+  /*    slow nature and the original developer losing interest meant that  */
+  /*    this option was never enabled in default builds.                   */
   /*                                                                       */
-  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */
-  /*   defined.                                                            */
+  /* 2. The new default mode for the TrueType driver.  The Infinality code */
+  /*    base was stripped to the bare minimum and all configurability      */
+  /*    removed in the name of speed and simplicity.  The configurability  */
+  /*    was mainly aimed at legacy fonts like Arial, Times New Roman, or   */
+  /*    Courier.  Legacy fonts are fonts that modify vertical stems to     */
+  /*    achieve clean black-and-white bitmaps.  The new mode focuses on    */
+  /*    applying a minimal set of rules to all fonts indiscriminately so   */
+  /*    that modern and web fonts render well while legacy fonts render    */
+  /*    okay.                                                              */
   /*                                                                       */
-#define TT_CONFIG_OPTION_SUBPIXEL_HINTING
-
-
-  /*************************************************************************/
+  /* 3. Compile both.                                                      */
   /*                                                                       */
-  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
-  /* of the TrueType bytecode interpreter is used that doesn't implement   */
-  /* any of the patented opcodes and algorithms.  The patents related to   */
-  /* TrueType hinting have expired worldwide since May 2010; this option   */
-  /* is now deprecated.                                                    */
+  /* By undefining these, you get rendering behavior like on Windows       */
+  /* without ClearType, i.e., Windows XP without ClearType enabled and     */
+  /* Win9x (interpreter version v35).  Or not, depending on how much       */
+  /* hinting blood and testing tears the font designer put into a given    */
+  /* font.  If you define one or both subpixel hinting options, you can    */
+  /* switch between between v35 and the ones you define.                   */
   /*                                                                       */
-  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
-  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
-  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
-  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be      */
+  /* defined.                                                              */
   /*                                                                       */
-  /* This macro is only useful for a small number of font files (mostly    */
-  /* for Asian scripts) that require bytecode interpretation to properly   */
-  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
-  /* thus the unpatented interpreter is never used to load glyphs from     */
-  /* TrueType fonts unless one of the following two options is used.       */
+  /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
   /*                                                                       */
-  /*   - The unpatented interpreter is explicitly activated by the user    */
-  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
-  /*     when opening the FT_Face.                                         */
-  /*                                                                       */
-  /*   - FreeType detects that the FT_Face corresponds to one of the       */
-  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
-  /*     contains a hard-coded list of font names and other matching       */
-  /*     parameters (see function `tt_face_init' in file                   */
-  /*     `src/truetype/ttobjs.c').                                         */
-  /*                                                                       */
-  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
-  /*                                                                       */
-  /*   {                                                                   */
-  /*     FT_Parameter  parameter;                                          */
-  /*     FT_Open_Args  open_args;                                          */
-  /*                                                                       */
-  /*                                                                       */
-  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
-  /*                                                                       */
-  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
-  /*     open_args.pathname   = my_font_pathname;                          */
-  /*     open_args.num_params = 1;                                         */
-  /*     open_args.params     = &parameter;                                */
-  /*                                                                       */
-  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
-  /*     ...                                                               */
-  /*   }                                                                   */
-  /*                                                                       */
-/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  1     */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  2     */
+#define TT_CONFIG_OPTION_SUBPIXEL_HINTING     ( 1 | 2 )
 
 
   /*************************************************************************/
@@ -668,7 +647,7 @@
   /* composite flags array which can be used to disambiguate, but old      */
   /* fonts will not have them.                                             */
   /*                                                                       */
-  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   https://www.microsoft.com/typography/otspec/glyf.htm                */
   /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */
   /*                                                                       */
 #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -693,6 +672,24 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum     */
+  /* number of bytecode instructions executed for a single run of the      */
+  /* bytecode interpreter, needed to prevent infinite loops.  You don't    */
+  /* want to change this except for very special situations (e.g., making  */
+  /* a library fuzzer spend less time to handle broken fonts).             */
+  /*                                                                       */
+  /* It is not expected that this value is ever modified by a configuring  */
+  /* script; instead, it gets surrounded with #ifndef ... #endif so that   */
+  /* the value can be set as a preprocessor option on the compiler's       */
+  /* command line.                                                         */
+  /*                                                                       */
+#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES
+#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES  1000000L
+#endif
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
@@ -748,6 +745,16 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1     */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the type1 driver module.                                              */
+  /*                                                                       */
+#define T1_CONFIG_OPTION_OLD_ENGINE
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
@@ -793,6 +800,33 @@
   /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
+  /****         P C F   D R I V E R    C O N F I G U R A T I O N        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are many PCF fonts just called `Fixed' which look completely    */
+  /* different, and which have nothing to do with each other.  When        */
+  /* selecting `Fixed' in KDE or Gnome one gets results that appear rather */
+  /* random, the style changes often if one changes the size and one       */
+  /* cannot select some fonts at all.  This option makes the PCF module    */
+  /* prepend the foundry name (plus a space) to the family name.           */
+  /*                                                                       */
+  /* We also check whether we have `wide' characters; all put together, we */
+  /* get family names like `Sony Fixed' or `Misc Fixed Wide'.              */
+  /*                                                                       */
+  /* If this option is activated, it can be controlled with the            */
+  /* `no-long-family-names' property of the pcf driver module.             */
+  /*                                                                       */
+#define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
   /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
   /****                                                                 ****/
   /*************************************************************************/
@@ -838,14 +872,21 @@
 
 
   /*
-   * This macro is defined if either unpatented or native TrueType
-   * hinting is requested by the definitions above.
+   * This macro is defined if native TrueType hinting is requested by the
+   * definitions above.
    */
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
 #define  TT_USE_BYTECODE_INTERPRETER
-#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
-#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
-#define  TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1
+#define  TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+#endif
+
+#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2
+#define  TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+#endif
+#endif
 #endif
 
 
@@ -880,7 +921,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTOPTION_H__ */
+#endif /* FTOPTION_H_ */
 
 
 /* END */
diff --git a/docs/CHANGES b/docs/CHANGES
index bc177cf..a6d088a 100644
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -1,3 +1,761 @@
+CHANGES BETWEEN 2.9 and 2.9.1
+
+  I. IMPORTANT BUG FIXES
+
+    - Type  1  fonts  containing   flex  features  were  not  rendered
+      correctly (bug introduced in version 2.9).
+
+    - CVE-2018-6942: Older  FreeType versions  can crash  with certain
+      malformed variation fonts.
+
+        http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6942
+
+
+  II. MISCELLANEOUS
+
+    - Bug fix: Multiple calls to `FT_Get_MM_Var' returned garbage.
+
+    - The base  extensions `ftlcdfil' and  `ftfntfmt' are now  part of
+      the  base  module  (and  thus no  longer  configurable  in  file
+      `modules.cfg').
+
+    - Emboldening of bitmaps didn't work correctly sometimes,  showing
+      various artifacts (bug introduced in version 2.8.1).
+
+    - Use  of  the `freetype-config'  script  to  get compilation  and
+      linking  options   is  deprecated   since  it   doesn't  support
+      cross-compiling, among other  deficiencies.  Instead, you should
+      use the `pkg-config' interface.
+
+      The `configure'  script no longer installs  `freetype-config' by
+      default.  For  backwards compatibility,  a new  configure option
+      `--enable-freetype-config'   is  provided   that  reverts   this
+      decision.
+
+    - The auto-hinter script ranges have  been updated for Unicode 11.
+      No support  for new scripts  have been added, however,  with the
+      exception of Georgian Mtavruli.
+
+    - Support for cmake has been improved.
+
+    - The next  release will  remove support for  Position Independent
+      Code  as  needed  by  systems that  prohibit  automatic  address
+      fixups, such  as BREW.  [Compilation with  modern compilers that
+      use flags like `-fPIC' or `-fPIE' is not affected.]
+
+
+======================================================================
+
+CHANGES BETWEEN 2.8.1 and 2.9
+
+  I. IMPORTANT BUG FIXES
+
+    - Advance width values of variation fonts were often wrong.
+
+    - More fixes for variation font support; you should update to this
+      version if you want to support them.
+
+
+  II. IMPORTANT CHANGES
+
+    - As a GSoC project, Ewald Hew extended the new (Adobe) CFF engine
+      to  handle  Type  1  fonts  also,  thus  greatly  improving  the
+      rendering of  this format.   This is the  new default.   The old
+      engine   is  still   available   if   the  configuration   macro
+      `T1_CONFIG_OPTION_OLD_ENGINE'    gets    defined;   using    the
+      `hinting-engine' property  of the `type1' driver  module you can
+      then switch between the two engines.
+
+    - A new function,  `FT_Set_Named_Instance', can be used  to set or
+      change the current named instance.
+
+    - Starting  with   this  FreeType  version,   resetting  variation
+      coordinates  will   return  to  the  currently   selected  named
+      instance.  Previously, FreeType returned to the base font (i.e.,
+      no instance set).
+
+
+  III. MISCELLANEOUS
+
+    - The `face_flags' field of the `FT_Face' structure has a new bit,
+      `FT_FACE_FLAG_VARIATION', which  is set if a  variation font has
+      been      altered      with      `FT_Set_MM_Design_Coordinates',
+      `FT_Set_Var_Design_Coordinates',                              or
+      `FT_Set_Var_Blend_Coordinates'.
+
+    - If  the  current  face  is  a  named  instance,  the  new  macro
+      `FT_IS_NAMED_INSTANCE' returns true.
+
+    - `FT_IS_VARIATION' is  a new macro  that returns true  whenever a
+      face object has  been altered by `FT_Set_MM_Design_Coordinates',
+      `FT_Set_Var_Design_Coordinates',                              or
+      `FT_Set_Var_Blend_Coordinates'.
+
+    - Changing  the  design  coordinates  of  a  variation  font  with
+      `FT_Set_Var_Design_Coordinates'                               or
+      `FT_Set_Var_Blend_Coordinates'  does  not  influence  the  named
+      instance index value (only `FT_Set_Named_Instance' does that).
+
+    - Special PostScript  names for named instances  are only returned
+      if the  named instance is set  with `FT_Set_Named_Instance' (and
+      the font  has corresponding  entries in  its `fvar'  table).  If
+      `FT_IS_VARIATION'  returns  true,  the  algorithmically  derived
+      PostScript name is provided, not  looking up special entries for
+      named instances.
+
+    - A new function  `FT_Done_MM_Var' is provided to  free the memory
+      returned in a call to `FT_Get_MM_Var'.
+
+    - On  platforms  using  the   `configure'  script,  the  installed
+      `ftoption.h' file  now correctly reflects  configuration options
+      like `--with-harfbuzz'.
+
+    - Better  support to  build FreeType  as  a DLL  on Windows  using
+      Visual C.
+
+    - All data specific to driver modules is now collected in a single
+      file,      `FT_DRIVER_H'.      Consequently,      the     macros
+      `FT_AUTOHINTER_H',   `FT_CFF_DRIVER_H',  `FT_TRUETYPE_DRIVER_H',
+      and `FT_PCF_DRIVER_H' still work but are deprecated.
+
+    - Some fuzzer fixes to better reject malformed fonts.
+
+    - The `ftbench' demo program has a new test for opening a new face
+      and loading some glyphs.
+
+    - The `ftbench' demo program has a  new option `-j' to specify the
+      last glyph index to be used in the tests.
+
+    - The  `ftgrid' demo  program has  a new  option `-n'  to suppress
+      display of named instances of variation fonts.
+
+    - The `ttdebug' demo program can now  show a stack trace (key `K')
+      and switch  between hexadecimal and decimal  display of integers
+      (key `I').
+
+
+======================================================================
+
+CHANGES BETWEEN 2.8 and 2.8.1
+
+  I. IMPORTANT BUG FIXES
+
+    - B/W  hinting   of  TrueType   fonts  didn't  work   properly  if
+      interpreter version 38 or 40 was selected.
+
+    - Some severe  problems within the handling  of TrueType Variation
+      Fonts were found and fixed.
+
+    - Function `FT_Set_Var_Design_Coordinates' didn't correctly handle
+      the case with less input coordinates than axes.
+
+
+  II. IMPORTANT CHANGES
+
+    - By  default,  FreeType  now offers  high  quality  LCD-optimized
+      output without  resorting to ClearType techniques  of resolution
+      tripling and  filtering.  In  this method, called  Harmony, each
+      color channel  is generated separately after  shifting the glyph
+      outline, capitalizing  on the fact  that the color grids  on LCD
+      panels  are shifted  by  a third  of a  pixel.   This output  is
+      indistinguishable from ClearType with a light 3-tap filter.
+
+
+  III. MISCELLANEOUS
+
+    - Using the  new function `FT_Get_Var_Axis_Flags',  an application
+      can access the `flags' field  of a variation axis (introduced in
+      OpenType version 1.8.2)
+
+    - More sanity checks.
+
+    - The  internal representation  of buffers  for LCD  rendering has
+      changed (to be more precise, the amount of padding gets computed
+      differently).  Applications  that use  the FreeType API  are not
+      affected.
+
+    - To  reset all  design axis  values of  a variation  font to  its
+      default values you can now say
+
+        error = FT_Set_Var_Design_Coordinates( face, 0, NULL );
+
+      This  also works  with functions  `FT_Set_MM_Design_Coordinates'
+      and `FT_Set_MM_Blend_Coordinates'.
+
+    - FreeType  now synthesizes  a  missing Unicode  cmap for  (older)
+      TrueType fonts also if glyph names are available.
+
+    - FreeType  has  improved  handling   of  BDF  fonts  without  the
+      `POINT_SIZE', `RESOLUTION_X', or  `RESOLUTION_Y' properties; the
+      library now  uses the values of  the `SIZE' keyword if  they are
+      missing.   Previously,   `SIZE'  was  completely   ignored,  and
+      FreeType used heuristic values instead.
+
+    - Multiple calls to `FT_Bitmap_Convert' do work now as advertised.
+      Previously,  they failed with an assertion error if there was an
+      empty bitmap between non-empty ones.
+
+    - The warping option  has moved  from `light'  to `normal' hinting
+      where  it replaces  the original hinting algorithm.  The `light'
+      mode is now always void of any hinting in x-direction.
+
+    - 16bit  compiler  support is  now  officially  ended.  We  didn't
+      provide any maintenance  since many years,  and given that there
+      were no error  or problem reports either it seems  that it is no
+      longer needed.
+
+    - The `ftgrid'  demo program  can now toggle  the display  of grid
+      lines with the `G' key.
+
+    - The `ftgrid' demo  program can toggle a different  set of colors
+      (suitable to color-blind people) with the `C' key.
+
+    - The `ftgrid'  demo program  now supports  the `-e'  command line
+      option to select a cmap.
+
+    - The `ftdump' demo program has a  new command line option `-t' to
+      output the SFNT table list.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.7.1 and 2.8
+
+  I. IMPORTANT CHANGES
+
+    - Support for OpenType Variation Fonts is now complete.   The last
+      missing part was handling the `VVAR' and `MVAR' tables, which is
+      available with this release.
+
+    - A new  function `FT_Face_Properties' allows the  control of some
+      module  and   library  properties  per  font.    Currently,  the
+      following properties can be  handled: stem darkening, LCD filter
+      weights, and the random seed for the `random' CFF operator.
+
+    - The PCF change to show more `colourful' family names (introduced
+      in version 2.7.1) was too radical; it can now be configured with
+      PCF_CONFIG_OPTION_LONG_FAMILY_NAMES   at   compile   time.    If
+      activated, it can  be switched off at run time  with the new pcf
+      property  `no-long-family-names'.  If  the `FREETYPE_PROPERTIES'
+      environment variable is available, you can say
+
+        FREETYPE_PROPERTIES=pcf:no-long-family-names=1
+
+    - Support  for  the  following  scripts  has  been  added  to  the
+      auto-hinter.
+
+        Adlam, Avestan, Bamum, Buhid, Carian, Chakma, Coptic, Cypriot,
+        Deseret, Glagolitic, Gothic, Kayah, Lisu, N'Ko, Ol Chiki, Old
+        Turkic, Osage, Osmanya, Saurashtra, Shavian, Sundanese, Tai
+        Viet, Tifinagh, Unified Canadian Syllabics, Vai
+
+
+  II. IMPORTANT BUG FIXES
+
+    - `Light' auto-hinting  mode no  longer uses TrueType  metrics for
+      TrueType  fonts.   This bug  was  introduced  in version  2.4.6,
+      causing   horizontal  scaling   also.    Almost  all   GNU/Linux
+      distributions (with Fedora as  a notable exception) disabled the
+      corresponding patch for good reasons; chances are thus high that
+      you won't notice a difference.
+
+      If  optical backward  compatibility for  legacy applications  is
+      necessary, you might enable the AF_CONFIG_OPTION_TT_SIZE_METRICS
+      configuration option.   However, it  is strongly  recommended to
+      avoid that, adjusting font sizes instead.
+
+    - Global size  metrics values  in the  `FT_Size_Metrics' structure
+      can be  different for TrueType  fonts.  Reason is that  in older
+      FreeType  versions  the  metrics  were  rounded  differently  to
+      integer pixels compared  to all other font  formats, yielding an
+      inconsistent behaviour if you used non-native hinting.  Starting
+      with this  version, global size  metrics for TrueType  fonts are
+      handled the same as other  font formats: `ascender' gets rounded
+      up,  `descender'  gets  rounded  down,  `height'  gets  normally
+      rounded, and `max_advance' gets normally rounded, too.
+
+      If you need more precise values of (global) ascender, descender,
+      height, or  `max_advance', please take the  corresponding values
+      from the `FT_Face' structure and scale them manually.
+
+    - If a TrueType font gets loaded with FT_LOAD_NO_HINTING, FreeType
+      now scales  the font linearly  again (bug introduced  in version
+      2.4.6).
+
+    - CVE-2017-8105,  CVE-2017-8287:  Older   FreeType  versions  have
+      out-of-bounds  writes  caused  by  heap-based  buffer  overflows
+      related to Type 1 fonts.
+
+        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8105
+        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8287
+
+
+  III. MISCELLANEOUS
+
+    - A  new function  `FT_Set_Default_Properties' has  been added  to
+      parse    the    `FREETYPE_PROPERTIES'    environment    variable
+      (previously, it  was internal only).   `FT_Init_FreeType' always
+      call this  function, but  `FT_New_Library' does not  (similar to
+      `FT_Add_Default_Modules').
+
+    - To be in sync with OpenType version 1.7 and newer, macros
+
+        FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
+        FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY,
+        TT_NAME_ID_PREFERRED_FAMILY
+        TT_NAME_ID_PREFERRED_SUBFAMILY
+
+      are renamed to
+
+        FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
+        FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY,
+        TT_NAME_ID_TYPOGRAPHIC_FAMILY
+        TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
+
+      The old macro names are deprecated (but still available).
+
+    - Support for SFNT `name' tables has been improved.
+
+      . Format  1 `name' tables  are now supported.  Use  new function
+        `FT_Get_Sfnt_LangTag' to access associated language tags.
+
+      . Language, encoding, and name IDs have been updated to OpenType
+        version 1.8.1.
+
+    - The new CFF  engine now handles the `random'  operator.  All CFF
+      opcodes are now supported.
+
+    - The CFF module  has a new property `random-seed'  to control the
+      pseudo-random number generation for the `random' operator.
+
+    - The `freetype-config' script is now a wrapper of `pkg-config' if
+      this program is available in the path.
+
+    - FT_LOAD_TARGET_LCD  is now  a  variant of  FT_LOAD_TARGET_LIGHT;
+      this should provide better rendering results.
+
+    - A mode to display  light auto-hinting with  subpixel positioning
+      has been added to `ftdiff'.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.7 and 2.7.1
+
+  I. IMPORTANT CHANGES
+
+    - Support for the new CFF2 font format as introduced with OpenType
+      1.8 has been contributed by Dave Arnolds from Adobe.
+
+    - Preliminary support for variation fonts as specified in OpenType
+      1.8 (in addition to the  already existing support for Adobe's MM
+      and Apple's  GX formats).  Dave Arnolds  contributed handling of
+      advance  width change  variation;  more will  come  in the  next
+      version.
+
+
+  II. IMPORTANT BUG FIXES
+
+    - Handling of  raw CID fonts was partially  broken (bug introduced
+      in 2.6.4).
+
+    - CVE-2016-10328:  Older  FreeType versions had  an  out-of-bounds
+      write caused by a heap-based  buffer overflow related to the CFF
+      fonts.
+
+        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10328
+
+
+  III. MISCELLANEOUS
+
+    - Some limits for TrueType  bytecode execution have been tightened
+      to  speed   up  FreeType's  handling  of   malformed  fonts,  in
+      particular to quickly abort endless loops.
+
+      - The  number of  twilight points  can no  longer be  set to  an
+        arbitrarily large value.
+
+      - The total number of jump  opcode instructions (like JMPR) with
+        negative arguments  is dynamically restricted; the  same holds
+        for the total number of iterations in LOOPCALL opcodes.
+
+      The dynamic limits are based on  the number of points in a glyph
+      and the number of CVT entries.  Please report if you encounter a
+      font where the selected values are not adequate.
+
+    - PCF family names are made more `colourful'; they now include the
+      foundry  and information  whether they contain  wide characters.
+      For example,  you no longer get `Fixed' but  rather `Sony Fixed'
+      or `Misc Fixed Wide'.
+
+    - A new  function `FT_Get_Var_Blend_Coordinates'  (with its  alias
+      name  `FT_Get_MM_Blend_Coordinates') to retrieve the  normalized
+      blend  coordinates of the currently  selected variation instance
+      has been added to the Multiple Masters interface.
+
+    - A new  function `FT_Get_Var_Design_Coordinates' to  retrieve the
+      design coordinates of the  currently selected variation instance
+      has been added to the Multiple Masters interface.
+
+    - A new load flag `FT_LOAD_BITMAP_METRICS_ONLY' to retrieve bitmap
+      information without loading the (embedded) bitmap itself.
+
+    - Retrieving   advance   widths   from   bitmap   strikes   (using
+      `FT_Get_Advance' and `FT_Get_Advances') have been sped up.
+
+    - The  usual round  of  fuzzer fixes  to  better reject  malformed
+      fonts.
+
+    - The `ftmulti' demo program can now switch engines with key `H'.
+
+    - The  `ftstring'  demo  program   can  now  show  some  built-in,
+      non-latin sample strings (to be selected with the TAB key).
+
+    - The  `ftview'  demo program  can  now  switch between  a  font's
+      charmaps using the TAB key.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6.5 and 2.7
+
+  I. IMPORTANT CHANGES
+
+    - As announced earlier, the 2.7.x series now uses the new subpixel
+      hinting  mode as  the  default, emulating  a  modern version  of
+      ClearType.
+
+      This change inevitably leads to different rendering results, and
+      you   might   change   the   `TT_CONFIG_OPTION_SUBPIXEL_HINTING'
+      configuration option to  adapt it to your taste (or  use the new
+      `FREETYPE_PROPERTIES'    environment    variable).    See    the
+      corresponding entry  below for  version 2.6.4, which  gives more
+      information.
+
+    - A new option  `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES' has been
+      introduced.   If  set (which  is  the  default), an  environment
+      variable  `FREETYPE_PROPERTIES' can  be used  to control  driver
+      properties.  Example:
+
+        FREETYPE_PROPERTIES=truetype:interpreter-version=35 \
+                            cff:no-stem-darkening=1 \
+                            autofitter:warping=1
+
+      This allows to select, say, the subpixel hinting mode at runtime
+      for a given application.  See file `ftoption.h' for more.
+
+
+  II. IMPORTANT BUG FIXES
+
+    - After  loading a  named instance  of  a GX  variation font,  the
+      `face_index'  value  in  the returned  `FT_Face'  structure  now
+      correctly holds the named instance  index in the upper 16bits as
+      documented.
+
+
+  III. MISCELLANEOUS
+
+    - A new macro `FT_IS_NAMED_INSTANCE' to  test whether a given face
+      is a named instance.
+
+    - More fixes to GX font handling.
+
+    - Apple's   `GETVARIATION'  bytecode   operator  (needed   for  GX
+      variation font support) has been implemented.
+
+    - Another round  of fuzzer fixes,  mainly to reject  invalid fonts
+      faster.
+
+    - Handling of raw CID fonts  was broken (bug introduced in version
+      2.6.4).
+
+    - The smooth rasterizer has been streamlined  to make it faster by
+      approx. 20%.
+
+    - The `ftgrid'  demo program now  understands command  line option
+      `-d' to give start-up design coordinates.
+
+    - The `ftdump' demo program has  a new command line option `-p' to
+      dump TrueType bytecode instructions.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6.4 and 2.6.5
+
+  I. IMPORTANT BUG FIXES
+
+    - Compilation works again  on Mac OS X (bug introduced  in version
+      2.6.4).
+
+
+  II. IMPORTANT CHANGES
+
+    - The new  subpixel hinting  mode is now  disabled by  default; it
+      will  be enabled  by default  in the  forthcoming 2.7.x  series.
+      Main reason for reverting this feature is the principle of least
+      surprise: a  sudden change in  appearance of all fonts  (even if
+      the rendering improves  for almost all recent  fonts) should not
+      be expected in a new micro version of a series.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6.3 and 2.6.4
+
+  I. IMPORTANT CHANGES
+
+    - A new  subpixel hinting  mode has  been contributed  by Nikolaus
+      Waxweiler, which is now the  default rendering mode for TrueType
+      fonts.  It implements  (almost everything of) version  40 of the
+      bytecode engine.
+
+      The existing code  base in FreeType (the  `Infinality code') was
+      stripped to the bare minimum  and all configurability removed in
+      the  name  of speed  and  simplicity.   The configurability  was
+      mainly aimed  at legacy  fonts like Arial,  Times New  Roman, or
+      Courier.  [Legacy fonts are fonts  that modify vertical stems to
+      achieve clean black-and-white bitmaps.]  The new mode focuses on
+      applying a minimal set of rules to all fonts indiscriminately so
+      that modern and web fonts  render well while legacy fonts render
+      okay.
+
+      Activation  of the  subpixel hinting  support can  be controlled
+      with   the   `TT_CONFIG_OPTION_SUBPIXEL_HINTING'   configuration
+      option  at compile  time: If  set to  value 1,  you get  the old
+      Infinality  mode  (which  was  never  the  default  due  to  its
+      slowness).  Value 2 activates the new subpixel hinting mode, and
+      value 3 activates both.  The default is value 2.
+
+      At run time,  you can select the subpixel hinting  mode with the
+      `interpreter-version'  property (provided  you have  compiled in
+      the corresponding hinting mode); see `ftttdrv.h' for more.
+
+    - Support  for  the  following  scripts  has  been  added  to  the
+      auto-hinter.
+
+        Armenian, Cherokee, Ethiopic, Georgian, Gujarati, Gurmukhi,
+        Malayalam, Sinhala, Tamil
+
+
+  II. MISCELLANEOUS
+
+    - Type 42 fonts as created by LilyPond are now supported.
+
+    - Minor rendering improvements in the auto-hinter.
+
+    - For experimental  reasons, the old  CFF engine now  supports all
+      CFF operators except `random', including the deprecated Multiple
+      Masters  instructions.  This  allows the  display of  fonts like
+      `ITCGaramondMM-It.otf' (without font variations, though).
+
+    - Another round of fixes to improve handling of invalid fonts.
+
+    - The `ftgrid' demo program now displays the rendered pixels also;
+      this can be switched off with the `b' key.  Selection of various
+      LCD filtering modes can be done with the `L' key.
+
+    - The demo programs  have been extended to allow  selection of all
+      available TrueType bytecode engines.
+
+    - A very early beta version of a new, Qt based demo program called
+      `ftinspect'  is  part  of  the   source  code  bundle;  it  will
+      eventually supersede  the other  demo programs.   Currently, you
+      have to compile  it manually with `qmake; make';  note that many
+      features are still missing.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6.2 and 2.6.3
+
+  I. IMPORTANT CHANGES
+
+    - Khmer,  Myanmar, Bengali,  and Kannada  script support  has been
+      added to the auto-hinter.
+
+
+  II. MISCELLANEOUS
+
+    - Better  support of  Indic  scripts like  Devanagari  by using  a
+      top-to-bottom hinting flow.
+
+    - All  FreeType macros  starting  with two  underscores have  been
+      renamed to  avoid a violation of  both the C and  C++ standards.
+      Example: Header  macros of the  form `__FOO_H__' are  now called
+      `FOO_H_'.  In most cases,  this should be completely transparent
+      to the user.   The exception to this  is `__FTERRORS_H__', which
+      must be  sometimes undefined by  the user to get  FreeType error
+      strings:  Both this  form and  the new  `FTERRORS_H_' macro  are
+      accepted for backward compatibility.
+
+    - Minor improvements mainly to the Type 1 driver.
+
+    - The  new CFF  engine now  supports all  Type 2  operators except
+      `random'.
+
+    - The macro `_STANDALONE_', used for  compiling the B/W and smooth
+      rasterizers  as   stand-alone  modules,  has  been   renamed  to
+      `STANDALONE_', since macro names starting with an underscore and
+      followed by an uppercase letter are reserved in both C and C++.
+
+    - Function  `FT_Library_SetLcdFilterWeights'  now  also  activates
+      custom LCD filter weights (instead of just adjusting them).
+
+    - Support for  `unpatented hinting'  has been  completely removed:
+      Consequently,  the two  functions `FT_Face_CheckTrueTypePatents'
+      and  `FT_Face_SetUnpatentedHinting'  now  return  always  false,
+      doing nothing.
+
+    - The `ftgamma' demo  program has been modernized;  the gamma grid
+      display has been moved from `ftview' to this program.
+
+    - In `ftview',  it is now possible to cycle through  the available
+      LCD filtering modes.
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6.1 and 2.6.2
+
+  I. IMPORTANT CHANGES
+
+    - The auto-hinter now supports stem darkening, to be controlled by
+      the    new   `no-stem-darkening'    and   `darkening-parameters'
+      properties.   This is  an  experimental  feature contributed  by
+      Nikolaus Waxweiler, and  the interface might change  in a future
+      release.
+
+    - By default, stem darkening is now switched off (for both the CFF
+      engine and the  auto-hinter).  The main reason is  that you need
+      linear  alpha  blending  and  gamma correction  to  get  correct
+      rendering results, and  the latter is not yet  available in most
+      freely  available  rendering  stacks like  X11.   Applying  stem
+      darkening without proper gamma correction  leads to far too dark
+      rendering results.
+
+    - The   meaning  of   `FT_RENDER_MODE_LIGHT'  has   been  slightly
+      modified.   It  now  essentially  means `no  hinting  along  the
+      horizontal  axis'; in  particular,  no change  of glyph  advance
+      widths.  Consequently, the auto-hinter  is used for all scalable
+      font  formats  except  for  CFF.    It  is  planned  that  other
+      font-specific rendering engines (TrueType, Type 1) will follow.
+
+
+  II. MISCELLANEOUS
+
+    - The default  LCD filter  has been changed  to be  normalized and
+      color-balanced.
+
+    - For    better    compatibility   with    FontConfig,    function
+      `FT_Library_SetLcdFilter'  accepts   a  new   enumeration  value
+      `FT_LCD_FILTER_LEGACY1'   (which  has   the   same  meaning   as
+      `FT_LCD_FILTER_LEGACY').
+
+    - A large number of bugs have been detected by using the libFuzzer
+      framework,  which should  further  improve  handling of  invalid
+      fonts.  Thanks again to Kostya Serebryany and Bungeman!
+
+    - `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES',  a   new  configuration
+      option, controls the maximum number of executed opcodes within a
+      bytecode program.  You don't want to change this except for very
+      special  situations (e.g.,  making a  library fuzzer  spend less
+      time to handle broken fonts).
+
+    - The smooth renderer has been made faster.
+
+    - The `ftstring' demo program now supports subpixel rendering; use
+      key `l' to cycle through the LCD modes.
+
+    - The `ftstring'  demo program now supports  colour rendering; use
+      the `space' key to cycle through various colour combinations.
+
+    - The graphical demo programs now use a default gamma value of 1.8
+      (instead of 1.2).
+
+
+======================================================================
+
+CHANGES BETWEEN 2.6 and 2.6.1
+
+  I. IMPORTANT BUG FIXES
+
+    - It turned  out that for CFFs  only the advance widths  should be
+      taken from the  `htmx' table, not the side  bearings.  This bug,
+      introduced in  version 2.6.0, makes  it necessary to  upgrade if
+      you are using  CFFs; otherwise, you get cropped  glyphs with GUI
+      interfaces like GTK or Qt.
+
+    - Accessing Type 42 fonts returned  incorrect results if the glyph
+      order of the embedded TrueType font differs from the glyph order
+      of the Type 42 charstrings table.
+
+
+  II. IMPORTANT CHANGES
+
+    - The header  file layout  has been  changed (again),  moving  all
+      header files except `ft2build.h' into a subdirectory tree.
+
+      Doing so  reduces the  possibility of  header file  name clashes
+      (e.g., FTGL's  `FTGlyph.h' with FreeType's `ftglyph.h')  on case
+      insensitive file systems like Mac OS X or Windows.
+
+      Applications  that  use  (a)  the  `freetype-config'  script  or
+      FreeType's `freetype2.pc' file for pkg-config to get the include
+      directory  for the  compiler,  and (b)  the  documented way  for
+      header inclusion like
+
+        #include <ft2build.h>
+        #include FT_FREETYPE_H
+        ...
+
+      don't need any change to the source code.
+
+    - Simple access  to named instances  in GX variation fonts  is now
+      available (in addition to the  previous method via FreeType's MM
+      interface).   In  the `FT_Face'  structure,  bits  16-30 of  the
+      `face_index' field hold the current named instance index for the
+      given face  index, and bits  16-30 of `style_flags'  contain the
+      number of  instances for  the given face  index.  `FT_Open_Face'
+      and friends also understand the  extended bits of the face index
+      parameter.
+
+      You need to enable  TT_CONFIG_OPTION_GX_VAR_SUPPORT for this new
+      feature.  Otherwise, bits  16-30 of the two fields  are zero (or
+      are ignored).
+
+    - Lao script support has been added to the auto-hinter.
+
+
+  III. MISCELLANEOUS
+
+    - The auto-hinter's Arabic script support has been enhanced.
+
+    - Superscript-like and  subscript-like glyphs  as used  by various
+      phonetic alphabets like the IPA  are now better supported by the
+      auto-hinter.
+
+    - The TrueType bytecode interpreter now runs slightly faster.
+
+    - Improved support for builds with cmake.
+
+    - The  function  `FT_CeilFix'  now   always  rounds  towards  plus
+      infinity.
+
+    - The  function  `FT_FloorFix'  now always  rounds  towards  minus
+      infinity.
+
+    - A  new load  flag `FT_LOAD_COMPUTE_METRICS'  has been  added; it
+      makes FreeType  ignore pre-computed  metrics, as needed  by font
+      validating  or  font  editing  programs.  Right  now,  only  the
+      TrueType  module supports  it  to ignore  data  from the  `hdmx'
+      table.
+
+    - Another round of bug fixes  to better handle broken fonts, found
+      by Kostya Serebryany <kcc@google.com>.
+
+
+======================================================================
 
 CHANGES BETWEEN 2.5.5 and 2.6
 
@@ -70,17 +828,17 @@
       compiler warnings.
 
     - Function `FT_Bitmap_New'  has been renamed  to `FT_Bitmap_Init',
-      since  this name  better reflects  its function.   For backwards
+      since  this name  better reflects  its  function.   For backward
       compatibility, the old function name is still available.
 
     - Function   `FT_Get_X11_Font_Format'   has    been   renamed   to
       `FT_Get_Font_Format',  since  this   name  better  reflects  its
-      function.  For backwards compatibility, the old function name is
+      function.  For backward compatibility,  the old function name is
       still available.
 
       Additionally, the header  file macro for this  function has been
       renamed to  `FT_FONT_FORMATS_H' (the old name  `FT_XFREE86_H' is
-      retained for backwards compatibility).
+      retained for backward compatibility).
 
     - Various improvements to the `ftgrid' demo program.
 
@@ -120,7 +878,7 @@
   I. IMPORTANT BUG FIXES
 
     - A   variant  of   vulnerability  CVE-2014-2240   was  identified
-      (cf.  http://savannah.nongnu.org/bugs/?43661) and  fixed in  the
+      (cf.  https://savannah.nongnu.org/bugs/?43661) and  fixed in the
       new CFF driver.  All users should upgrade.
 
     - The new auto-hinter code using HarfBuzz crashed for some invalid
@@ -191,7 +949,7 @@
   I. IMPORTANT BUG FIXES
 
     - A vulnerability (CVE-2014-2240) was  identified and fixed in the
-      new  CFF  driver  (cf.  http://savannah.nongnu.org/bugs/?41697).
+      new  CFF driver  (cf.  https://savannah.nongnu.org/bugs/?41697).
       All users should upgrade.
 
     - More  bug  fixes related  to  correct  positioning of  composite
@@ -224,7 +982,7 @@
            and install FreeType again.
 
       With FreeType's  `configure' script the procedure  boils down to
-      configure, build, and install Freetype, then configure, compile,
+      configure, build, and install FreeType, then configure, compile,
       and  install  HarfBuzz,  then configure,  compile,  and  install
       FreeType again (after executing `make distclean').
 
@@ -514,7 +1272,7 @@
   II. MISCELLANEOUS
 
     - The  (top-level)  `configure'  script   now  respects  the  MAKE
-      environment variable to specify a `make' binary.   For backwards
+      environment variable  to specify a `make' binary.   For backward
       compatibility, GNUMAKE still overrides MAKE, though.
 
     - The `ftview'  and `ftdiff'  demo programs have  been redesigned,
@@ -563,7 +1321,7 @@
     - Subpixel  hinting support  has been  contributed by  Infinality,
       based on Greg Hitchcock's whitepaper at
 
-        http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+        https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
 
       Originally, it was a separate patch available from
 
@@ -1433,7 +2191,7 @@
       of  the  library,  mainly   due  to  patent  issues.   For  more
       information see:
 
-      http://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html
+      https://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html
 
       A  new  configuration macro  FT_CONFIG_OPTION_SUBPIXEL_RENDERING
       has been introduced in  `ftoption.h'; manually define it in this
@@ -1536,7 +2294,7 @@
       We provide  patches for  most of those  rogue clients.   See the
       following page for more information:
 
-        http://www.freetype.org/freetype2/patches/rogue-patches.html
+        https://www.freetype.org/freetype2/patches/rogue-patches.html
 
       Note that, as  a convenience to our Unix  desktop users, version
       2.2 is *binary* compatible with FreeType 2.1.7, which means that
@@ -1648,7 +2406,7 @@
 
     - Rudimentary support for Adobe's new `SING Glyphlet' format.  See
 
-        http://www.adobe.com/products/indesign/sing_gaiji.html
+        https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf
 
       for more information.
 
@@ -1733,7 +2491,7 @@
       probably using a different pitch, and to further manipulate it.
 
     - A new  API `FT_Outline_Embolden'  (in FT_OUTLINE_H) gives  finer
-      control how  outlines are embolded.
+      control how outlines are emboldened.
 
     - `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H)  now handles bitmaps
       also (code contributed  by Chia I Wu).  Note that this  function
@@ -1852,7 +2610,7 @@
       correctly  treated as a  CID, similar  to FreeType's  CID driver
       module.  Note that CID CMap support is still missing.
 
-    - The FT_FACE_FLAGS_GLYPH_NAMES flag is now  set correctly for all
+    - The FT_FACE_FLAG_GLYPH_NAMES flag  is now  set correctly for all
       font formats.
 
     - Some subsetted Type 1  fonts weren't parsed correctly.  This bug
@@ -2143,7 +2901,7 @@
 
     - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}      are     now
       deprecated               in               favour              of
-      FT_ENCODING_{SJIS,GB2312,GIB5,WANSONG,JOHAB}  -- those encodings
+      FT_ENCODING_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}  -- those encodings
       are not specific to Microsoft.
 
 
@@ -2325,7 +3083,7 @@
       quality since  many nasty defaults have been suppressed.  Please
       visit the web page:
 
-        http://www.freetype.org/hinting/smooth-hinting.html
+        https://www.freetype.org/hinting/smooth-hinting.html
 
       for additional details on this topic.
 
@@ -2345,12 +3103,12 @@
         FT_LOAD_TARGET_MONO   :: Hint and render for 1-bit displays.
 
         FT_LOAD_TARGET_LCD    :: Hint and render for horizontal RGB or
-                                 BGR sub-pixel displays (like LCD
+                                 BGR subpixel displays (like LCD
                                  screens).  THIS IS STILL
                                  EXPERIMENTAL!
 
         FT_LOAD_TARGET_LCD_V  :: Same as FT_LOAD_TARGET_LCD, for
-                                 vertical sub-pixel displays (like
+                                 vertical subpixel displays (like
                                  rotated LCD screens).  THIS IS STILL
                                  EXPERIMENTAL!
 
@@ -2584,7 +3342,7 @@
     - The  FreeType 2  redesign has  begun.  More  information  can be
       found at this URL:
 
-        http://www.freetype.org/freetype2/redesign.html
+        https://www.freetype.org/freetype2/redesign.html
 
       The following  internal changes  have been performed  within the
       sources of this release:
@@ -3175,13 +3933,7 @@
 
       For more information, see section I of the following document:
 
-        http://www.freetype.org/
-          freetype2/docs/tutorial/step1.html
-
-      or
-
-        http://freetype.sourceforge.net/
-          freetype2/docs/tutorial/step1.html
+        https://www.freetype.org/freetype2/docs/tutorial/step1.html
 
     - Many, many comments have been added to the public source file in
       order to  automatically generate  the API Reference  through the
@@ -3190,7 +3942,7 @@
       The latter has been updated  to support the grouping of sections
       in chapters and better index sort.  See:
 
-        http://www.freetype.org/freetype2/docs/reference/ft2-toc.html
+        https://www.freetype.org/freetype2/docs/reference/ft2-toc.html
 
 
   III. CHANGES TO THE BUILD PROCESS
@@ -3564,7 +4316,7 @@
         automatically when needed.
 
   - Reformatted all  modules source  code in order  to get rid  of the
-    basic data types redifinitions (i.e. `TT_Int' instead of `FT_Int',
+    basic data types redefinitions (i.e. `TT_Int' instead of `FT_Int',
     `T1_Fixed'  instead  of  `FT_Fixed').  Hence  the  format-specific
     prefixes like  `TT_', `T1_',  `T2_' and `CID_'  are only  used for
     relevant structures.
@@ -4265,7 +5017,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2000-2015 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
diff --git a/docs/CUSTOMIZE b/docs/CUSTOMIZE
index 831edf6..916be32 100644
--- a/docs/CUSTOMIZE
+++ b/docs/CUSTOMIZE
@@ -8,7 +8,7 @@
 
 I. Configuration macros
 
-  The  file found  in `include/config/ftoption.h'  contains a  list of
+  The  file `include/freetype/config/ftoption.h'  contains a  list  of
   commented configuration macros that can  be toggled by developers to
   indicate which features should be active while building the library.
 
@@ -35,9 +35,9 @@
   can keep the source files `clean'.
 
   If  you don't  use  GNU make  you  have to  manually  edit the  file
-  `include/config/ftmodule.h' (which  is *not*  used with  if compiled
-  with GNU make) to add or  remove the drivers and components you want
-  to   compile  into   the  library.    See  `INSTALL.ANY'   for  more
+  `include/freetype/config/ftmodule.h' (which  is *not* used  with  if
+  compiled with GNU make) to add  or remove the drivers and components
+  you want  to compile into  the library.  See `INSTALL.ANY'  for more
   information.
 
 
@@ -95,8 +95,9 @@
       #include FT_CONFIG_OPTIONS_H
       #include FT_CONFIG_MODULES_H
 
-    are compiled.  Their default  values being <config/ftoption.h> and
-    <config/ftmodule.h>, you can do something like:
+    are      compiled.       Their      default      values      being
+    <freetype/config/ftoption.h> and <freetype/config/ftmodule.h>, you
+    can do something like:
 
       custom/
         config/
@@ -116,15 +117,15 @@
     name  the configuration  headers.  To  do  so, you  need a  custom
     `ft2build.h' whose content can be as simple as:
 
-      #ifndef __FT2_BUILD_MY_PLATFORM_H__
-      #define __FT2_BUILD_MY_PLATFORM_H__
+      #ifndef FT2_BUILD_MY_PLATFORM_H_
+      #define FT2_BUILD_MY_PLATFORM_H_
 
       #define FT_CONFIG_OPTIONS_H  <custom/my-ftoption.h>
       #define FT_CONFIG_MODULES_H  <custom/my-ftmodule.h>
 
-      #include <config/ftheader.h>
+      #include <freetype/config/ftheader.h>
 
-      #endif /* __FT2_BUILD_MY_PLATFORM_H__ */
+      #endif /* FT2_BUILD_MY_PLATFORM_H_ */
 
     Place those files in a separate directory, e.g.,
 
@@ -138,7 +139,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/docs/DEBUG b/docs/DEBUG
index ab2c769..751eaf0 100644
--- a/docs/DEBUG
+++ b/docs/DEBUG
@@ -6,7 +6,7 @@
 
 There are  several ways to enable  debugging features in a  FreeType 2
 builds.  This is  controlled through the definition  of special macros
-located in the file `ftoptions.h'.  The macros are:
+located in the file `ftoption.h'.  The macros are:
 
 
   FT_DEBUG_LEVEL_ERROR
@@ -191,7 +191,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2002-2015 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
diff --git a/docs/FTL.TXT b/docs/FTL.TXT
index bbaba33..c406d15 100644
--- a/docs/FTL.TXT
+++ b/docs/FTL.TXT
@@ -48,7 +48,7 @@
   encourage you to use the following text:
 
    """
-    Portions of this software are copyright © <year> The FreeType
+    Portions of this software are copyright © <year> The FreeType
     Project (www.freetype.org).  All rights reserved.
    """
 
@@ -163,7 +163,7 @@
 
   Our home page can be found at
 
-    http://www.freetype.org
+    https://www.freetype.org
 
 
 --- end of FTL.TXT ---
diff --git a/docs/INSTALL b/docs/INSTALL
index 193c530..71d4a05 100644
--- a/docs/INSTALL
+++ b/docs/INSTALL
@@ -14,7 +14,9 @@
     compilation,  since other make tools won't work (this includes BSD
     Make).
 
-    GNU Make VERSION 3.80 OR NEWER IS NEEDED!
+    GNU Make VERSION 3.81 OR NEWER IS NEEDED!
+
+    [For `cmake' see below.]
 
 
   2. On VMS with the `mms' build tool
@@ -70,12 +72,12 @@
 
       http://makepp.sourceforge.net
 
-    for more information; you need version 1.19 or newer, and you must
+    for more information;  you need version 2.0 or newer, and you must
     pass option `--norc-substitution'.
 
 ----------------------------------------------------------------------
 
-Copyright 2000-2015 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/docs/INSTALL.ANY b/docs/INSTALL.ANY
index e7d6ddd..fddac9a 100644
--- a/docs/INSTALL.ANY
+++ b/docs/INSTALL.ANY
@@ -16,8 +16,8 @@
     which are not correctly supported by this compiler while being ISO
     C compliant!
 
-  * You  need  to  add  the directories  `freetype2/include'  to  your
-    include path when compiling the library.
+  * You need to add the directory `include' to your  include path when
+    compiling the library.
 
   * FreeType 2 is made of  several components; each of them is located
     in    a   subdirectory    of   `freetype2/src'.     For   example,
@@ -39,11 +39,9 @@
       src/base/ftbdf.c        -- optional, see <ftbdf.h>
       src/base/ftbitmap.c     -- optional, see <ftbitmap.h>
       src/base/ftcid.c        -- optional, see <ftcid.h>
-      src/base/ftfntfmt.c     -- optional, see <ftfntfmt.h>
       src/base/ftfstype.c     -- optional
       src/base/ftgasp.c       -- optional, see <ftgasp.h>
       src/base/ftgxval.c      -- optional, see <ftgxval.h>
-      src/base/ftlcdfil.c     -- optional, see <ftlcdfil.h>
       src/base/ftmm.c         -- optional, see <ftmm.h>
       src/base/ftotval.c      -- optional, see <ftotval.h>
       src/base/ftpatent.c     -- optional
@@ -103,7 +101,7 @@
       `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c'
       `type42.c'   needs `truetype.c'
 
-      Please consult the central `include/config/ftoption.h'
+      Please consult the central  `include/freetype/config/ftoption.h'
       configuration file for details on additional libraries necessary
       for some optional features.
 
@@ -132,10 +130,10 @@
 
   2. Compile sources
 
-      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftsystem.c
-      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftinit.c
-      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftdebug.c
-      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftbase.c
+      cc -c -Iinclude -DFT2_BUILD_LIBRARY ftsystem.c
+      cc -c -Iinclude -DFT2_BUILD_LIBRARY ftinit.c
+      cc -c -Iinclude -DFT2_BUILD_LIBRARY ftdebug.c
+      cc -c -Iinclude -DFT2_BUILD_LIBRARY ftbase.c
       etc.
 
     You don't  need to define  the FT_FLAT_COMPILATION macro  (as this
@@ -143,7 +141,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/docs/INSTALL.CROSS b/docs/INSTALL.CROSS
index a83638d..239e1a9 100644
--- a/docs/INSTALL.CROSS
+++ b/docs/INSTALL.CROSS
@@ -9,7 +9,7 @@
   -----------------
 
     For self-building the FreeType library  on a Unix system, GNU Make
-    3.80 or newer  is required.  `INSTALL.UNIX' contains  hints how to
+    3.81 or newer  is required.  `INSTALL.UNIX' contains  hints how to
     check the installed `make'.
 
     The GNU C  compiler to cross-build the target  system is required.
@@ -163,7 +163,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2006-2015 by
+Copyright 2006-2018 by
 suzuki toshiya, David Turner, Robert Wilhelm, and Werner Lemberg.
 
 
diff --git a/docs/INSTALL.GNU b/docs/INSTALL.GNU
index 1a7c097..e314ecf 100644
--- a/docs/INSTALL.GNU
+++ b/docs/INSTALL.GNU
@@ -25,7 +25,7 @@
 
       http://makepp.sourceforge.net
 
-    for more information; you need version 1.19 or newer, and you must
+    for more information;  you need version 2.0 or newer, and you must
     pass option `--norc-substitution'.
 
     Make sure that you are invoking GNU Make from the command line, by
@@ -35,7 +35,7 @@
 
     to display its version number.
 
-    VERSION 3.80 OR NEWER IS NEEDED!
+    VERSION 3.81 OR NEWER IS NEEDED!
 
 
   2. Invoke `make'
@@ -148,7 +148,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/docs/INSTALL.MAC b/docs/INSTALL.MAC
index 42bb0d8..2587e24 100644
--- a/docs/INSTALL.MAC
+++ b/docs/INSTALL.MAC
@@ -1,32 +1,32 @@
-Please follow the instructions  in INSTALL.UNIX to install FreeType on
+Please follow the instructions in  INSTALL.UNIX to install FreeType on
 Mac OS X.
 
-Currently FreeType2 functions based on some deprecated Carbon APIs
-return FT_Err_Unimplemented_Feature always, even if FreeType2 is
-configured and built on the system that deprecated Carbon APIs are
-available. To enable deprecated FreeType2 functions as far as possible,
-replace src/base/ftmac.c by builds/mac/ftmac.c.
+Currently  FreeType2 functions  based on  some deprecated  Carbon APIs
+return  `FT_Err_Unimplemented_Feature' always,  even  if FreeType2  is
+configured and  built on  the system that  deprecated Carbon  APIs are
+available.   To  enable  deprecated  FreeType2  functions  as  far  as
+possible, replace `src/base/ftmac.c' by `builds/mac/ftmac.c'.
 
-Starting with Mac OS X 10.5, gcc defaults the deployment target
-to 10.5. In previous versions of Mac OS X, this defaulted to 10.1.
-If you want your built binaries to run only on 10.5, this change
-does not concern you.  If you want them to also run on older versions
-of Mac OS X, then you must either set the MACOSX_DEPLOYMENT_TARGET
-environment variable or pass -mmacosx-version-min to gcc. You should
-specify the oldest version of Mac OS you want the code to run on.
-For example, if you use Bourne shell:
+Starting with  Mac OS X  10.5, gcc  defaults the deployment  target to
+10.5.  In previous  versions of Mac OS X, this  defaulted to 10.1.  If
+you want your built binaries to run only on 10.5, this change does not
+concern you.  If  you want them to  also run on older  versions of Mac
+OS  X,   then  you   must  either  set   the  MACOSX_DEPLOYMENT_TARGET
+environment  variable  or  pass `-mmacosx-version-min'  to  gcc.   You
+should specify the oldest  version of Mac OS you want  the code to run
+on.  For example, if you use Bourne shell:
 
-	export MACOSX_DEPLOYMENT_TARGET=10.2
+  export MACOSX_DEPLOYMENT_TARGET=10.2
 
 or, if you use C shell:
 
-	setenv MACOSX_DEPLOYMENT_TARGET 10.2
+  setenv MACOSX_DEPLOYMENT_TARGET 10.2
 
-Alternatively, you could pass "-mmacosx-version-min=10.2" to gcc.
+Alternatively, you could pass `-mmacosx-version-min=10.2' to gcc.
 
-Here the number 10.2 is the lowest version that the built binaries
-can run on. In the cases in above, the built binaries will run on
-Mac OS X 10.2 and later, but _not_ earlier. If you want to run on
-earlier, you have to set lower version, e.g. 10.0.
+Here the number 10.2 is the lowest version that the built binaries can
+run on.  In the  above cases, the built binaries will run  on Mac OS X
+10.2 and later, but _not_ earlier.  If you want to run on earlier, you
+have to set lower version, e.g., 10.0.
 
 For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README.
diff --git a/docs/INSTALL.UNIX b/docs/INSTALL.UNIX
index 0dab2c6..f92d828 100644
--- a/docs/INSTALL.UNIX
+++ b/docs/INSTALL.UNIX
@@ -19,7 +19,7 @@
        GNU Make  <version number>
        Copyright (C) <year> Free Software Foundation Inc.
 
-    Note that version  3.80 or higher is *required* or the  build will
+    Note that version  3.81 or higher is *required* or the  build will
     fail.
 
     It is also fine to have GNU Make under another name (e.g. 'gmake')
@@ -28,6 +28,9 @@
     As  a  special exception,  'makepp'  can  also  be used  to  build
     FreeType 2.  See the file docs/MAKEPP for details.
 
+    For builds  with `cmake' please check file `CMakeLists.txt';  this
+    is a contributed file not directly supported by the FreeType team.
+
 
   2. Regenerate the configure script if needed
   --------------------------------------------
@@ -102,7 +105,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/docs/INSTALL.VMS b/docs/INSTALL.VMS
index 48a323e..c1d30e0 100644
--- a/docs/INSTALL.VMS
+++ b/docs/INSTALL.VMS
@@ -1,7 +1,7 @@
-How to build the freetype2 library on VMS
+How to build the FreeType 2 library on VMS
 -----------------------------------------
 
-It is actually very  straightforward to install the Freetype2 library.
+It is actually very straightforward to install the FreeType 2 library.
 Just  execute vms_make.com from  the toplevel  directory to  build the
 library.  This procedure currently accepts the following options:
 
@@ -15,10 +15,10 @@
   Options to pass to the C compiler e.g. ccopt=/float=ieee
 
 In case you did download the demos, place them in a separate directory
-sharing the same toplevel as the directory of Freetype2 and follow the
-same  instructions as  above  for  the demos  from  there.  The  build
-process relies on this to figure the location of the Freetype2 include
-files.
+sharing the same top level  as the directory of FreeType 2  and follow
+the same instructions as above for  the demos from  there.  The  build
+process relies on this  to figure out  the location  of the FreeType 2
+include files.
 
 
 To rebuild  the  sources it is necessary to  have MMS/MMK installed on
@@ -49,7 +49,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2000-2015 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
diff --git a/docs/LICENSE.TXT b/docs/LICENSE.TXT
index 99dc342..af5a1c5 100644
--- a/docs/LICENSE.TXT
+++ b/docs/LICENSE.TXT
@@ -23,9 +23,11 @@
     GPL.  Note  that the  FTL is  incompatible  with  GPLv2 due  to  its
     advertisement clause.
 
-The contributed BDF and PCF drivers come with a license similar  to that
+The contributed BDF and PCF drivers  come with a license similar to that
 of the X Window System.  It is compatible to the above two licenses (see
-file src/bdf/README and src/pcf/README).
+file src/bdf/README and  src/pcf/README).  The same holds  for the files
+`fthash.c' and  `fthash.h'; their  code was  part of  the BDF  driver in
+earlier FreeType versions.
 
 The gzip module uses the zlib license (see src/gzip/zlib.h) which too is
 compatible to the above two licenses.
diff --git a/docs/MAKEPP b/docs/MAKEPP
index 58eaf55..a4d44b7 100644
--- a/docs/MAKEPP
+++ b/docs/MAKEPP
@@ -1,5 +1,5 @@
 As a special  exception, FreeType can also be  built with the 'makepp'
 build tool, available from http://makepp.sourceforge.net.
 
-Note, however. that  you will need at least version  1.19 and pass the
+Note, however,  that  you will need at least version 2.0  and pass the
 option --norc-substitution to have it work correctly.
diff --git a/docs/TODO b/docs/TODO
index 43eeae3..1a443a2 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -27,7 +27,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2001-2015 by
+Copyright 2001-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
diff --git a/docs/VERSION.DLL b/docs/VERSIONS.TXT
similarity index 86%
rename from docs/VERSION.DLL
rename to docs/VERSIONS.TXT
index f219c9a..3774157 100644
--- a/docs/VERSION.DLL
+++ b/docs/VERSIONS.TXT
@@ -45,13 +45,24 @@
 2. History
 ----------
 
-The  following   table  gives,  for   all  releases  since   2.3.0,  the
+The  following   table  gives,  for   all  releases  since   2.4.0,  the
 corresponding libtool number, as well  as the shared object number found
 on _most_ systems, but not all of them:
 
 
     release     libtool     so
   -------------------------------
+     2.9.1      22.1.16   6.16.1
+     2.9.0      22.0.16   6.16.0
+     2.8.1      21.0.15   6.15.0
+     2.8.0      20.0.14   6.14.0
+     2.7.1      19.0.13   6.13.0
+     2.7.0      18.6.12   6.12.6
+     2.6.5      18.5.12   6.12.5
+     2.6.4      18.4.12   6.12.4
+     2.6.3      18.3.12   6.12.3
+     2.6.2      18.2.12   6.12.2
+     2.6.1      18.1.12   6.12.1
      2.6.0      18.0.12   6.12.0
      2.5.5      17.4.11   6.11.4
      2.5.4      17.3.11   6.11.3
@@ -72,19 +83,6 @@
      2.4.2      12.0.6    6.6.0
      2.4.1      11.1.5    6.5.1
      2.4.0      11.0.5    6.5.0
-     2.3.12     10.0.4    6.4.0
-     2.3.11     9.22.3    6.3.22
-     2.3.10     9.21.3    6.3.21
-     2.3.9      9.20.3    6.3.20
-     2.3.8      9.19.3    6.3.19
-     2.3.7      9.18.3    6.3.18
-     2.3.6      9.17.3    6.3.17
-     2.3.5      9.16.3    6.3.16
-     2.3.4      9.15.3    6.3.15
-     2.3.3      9.14.3    6.3.14
-     2.3.2      9.13.3    6.3.13
-     2.3.1      9.12.3    6.3.12
-     2.3.0      9.11.3    6.3.11
 
 
 3. Autoconf Code Fragment
@@ -104,7 +102,7 @@
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009
-#error Freetype version too low.
+#error FreeType version too low.
 #endif
   ],
   [AC_MSG_RESULT(yes)
@@ -116,7 +114,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2002-2015 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
@@ -126,4 +124,4 @@
 accept it fully.
 
 
---- end of VERSION.DLL ---
+--- end of VERSIONS.TXT ---
diff --git a/docs/formats.txt b/docs/formats.txt
index 2439198..75aba92 100644
--- a/docs/formats.txt
+++ b/docs/formats.txt
@@ -1,149 +1,175 @@
-This  file  contains a  list  of various  font  formats.   It gives  the
+This  file contains  a list  of various  font formats.   It gives  the
 reference document and whether it is supported in FreeType 2.
 
+Table fields
+------------
 
-  file type:
-    The only special  case is `MAC'; on older Mac  OS versions, a `file'
-    is  stored as  a  data and  a  resource fork,  this  is, within  two
-    separate data chunks.   In all other cases, the  font data is stored
-    in a single file.
+  wrapper format
+    The format used to represent the font data.  In the table below it
+    is  used only  if the  font format  differs.  Possible  values are
 
-  wrapper format:
-    The format used  to represent the font data.  In  the table below it
-    is used only if the font format differs.  Possible values are `SFNT'
-    (binary), `PS' (a text header, followed by binary or text data),
-    `LZW' (compressed with either `gzip' or `compress'), and
-    `BZ2' (compressed with `bzip2`).
+      SFNT  binary
+      PFB   binary
+      PS    a text header, followed by  binary or text data
+      LZW   compressed with  either `gzip' or `compress'
+      BZ2   compressed with `bzip2'.
 
-  font format:
-    How the font  is to be accessed, possibly  after converting the file
-    type and  wrapper format  into a generic  form.  Bitmap  formats are
-    `BDF',  `PCF', and  one  form  of `WINFNT';  all  others are  vector
-    formats.
+  font format
+    How the font is to be accessed, possibly after converting the file
+    type and wrapper  format into a generic form.   Bitmap formats are
+    `BDF',  `PCF', and  one form  of `WINFNT';  all others  are vector
+    formats.   `PS' indicates  third-order,  `TT' second-order  Bézier
+    curves.
 
-  font type:
-    Sub-formats  of the font  format.  `SBIT'  and `MACSBIT'  are bitmap
-    formats, `MM' and `VAR' support optical axes.
+  font type
+    Sub-formats of the  font format.  `SBIT' and  `MACSBIT' are bitmap
+    formats,  `MM' and  `VAR' support  optical axes.   `CFF2' supports
+    optical axes also.
 
-  glyph access:
-    If not specified, the glyph access is `standard' to the font format.
-    Values are  `CID' for CID-keyed  fonts, `SYNTHETIC' for  fonts which
-    are modified  versions of other  fonts by means of  a transformation
-    matrix, `COLLECTION' for collecting  multiple fonts (sharing most of
-    the data) into a single file, and `TYPE_0' for PS fonts which are to
-    be accessed in a tree-like structure.
+  glyph access
+    If  not specified,  the glyph  access  is `standard'  to the  font
+    format.   Values are  `CID' for  CID-keyed fonts,  `SYNTHETIC' for
+    fonts that  are modified  versions of  other fonts  by means  of a
+    transformation matrix, and  `TYPE_0' for PS fonts which  are to be
+    accessed in a tree-like structure.
 
-  FreeType driver:
-    The module in  the FreeType library which handles  the specific font
-    format.   A missing entry  means that  FreeType doesn't  support the
+  FreeType driver
+    The module in the FreeType library which handles the specific font
+    format.  A missing  entry means that FreeType  doesn't support the
     font format (yet).
 
 
-Please  send  additions  and/or  corrections  to wl@gnu.org  or  to  the
-FreeType developer's list  at freetype-devel@nongnu.org (for subscribers
-only).   If you  can provide  a font  example for  a format  which isn't
-supported yet please send a mail too.
+Notes
+-----
+
+  The  SFNT  container  format also  provides  `collections'  (usually
+  having the file extension `.ttc'  or `.otc').  A collection contains
+  multiple font faces that share some tables to avoid redundancy, thus
+  reducing the file  size.  In FreeType, elements of  a collection can
+  be accessed with a proper face index.
+
+  Both  the GX  and the  OpenType 1.8  variation fonts  provide `named
+  instances'.  FreeType  maps them to  face indices (they can  also be
+  accessed with the standard MM interface).
+
+  Other  font  formats  (not  using the  SFNT  wrapper)  also  provide
+  multiple faces  within one  file; they are  marked with  an asterisk
+  (`*') in the table below.
+
+  FreeType can  be configured to  support Mac  files (on older  Mac OS
+  versions, a `file' is stored as a data and a resource fork, this is,
+  within two  separate data chunks).  If  a file can't be  opened as a
+  font, FreeType then checks whether it  is a resource fork, trying to
+  extract  the contained  font data  from  either a  `POST' or  `sfnt'
+  resource.
 
 
-file wrapper font   font    glyph      FreeType reference
-type format  format type    access     driver   documents
-----------------------------------------------------------------------------
-
----  ---     BDF    ---     ---        bdf      5005.BDF_Spec.pdf, X11
+Please  send additions  and/or  corrections to  wl@gnu.org  or to  the
+FreeType   developer's   list    at   freetype-devel@nongnu.org   (for
+subscribers only).   If you can  provide a  font example for  a format
+which isn't supported yet please send a mail too.
 
 
----  SFNT    PS     TYPE_1  ---        type1    Type 1 GX Font Format
-                                                (for the Mac) [3]
-MAC  SFNT    PS     TYPE_1  ---        type1    Type 1 GX Font Format
-                                                (for the Mac) [3]
----  SFNT    PS     TYPE_1  CID        cid      5180.sfnt.pdf (for the Mac)
-                                                [3]
-MAC  SFNT    PS     TYPE_1  CID        cid      5180.sfnt.pdf (for the Mac)
-                                                [3]
----  SFNT    PS     CFF     ---        cff      OT spec, 5176.CFF.pdf
-                                                (`OTTO' format)
-MAC  SFNT    PS     CFF     ---        cff      OT spec, 5176.CFF.pdf
-                                                (`OTTO' format)
----  SFNT    PS     CFF     CID        cff      OT spec, 5176.CFF.pdf
-MAC  SFNT    PS     CFF     CID        cff      OT spec, 5176.CFF.pdf
----  SFNT    PS     CFF     SYNTHETIC  ---      OT spec, 5176.CFF.pdf
-MAC  SFNT    PS     CFF     SYNTHETIC  ---      OT spec, 5176.CFF.pdf
----  SFNT    TT     SBIT    ---        sfnt     XFree86 (bitmaps only;
-                                                with `head' table)
----  SFNT    TT     MACSBIT ---        sfnt     OT spec (for the Mac;
-                                                bitmaps only; `bhed' table)
-MAC  SFNT    TT     MACSBIT ---        sfnt     OT spec (for the Mac;
-                                                bitmaps only; `bhed' table)
----  SFNT    TT     ---     ---        truetype OT spec (`normal' TT font)
-MAC  SFNT    TT     ---     ---        truetype OT spec (`normal' TT font)
-MAC  SFNT    TT     VAR     ---        truetype GX spec (`?var' tables)
----  SFNT    TT     ---     COLLECTION truetype OT spec (this can't be CFF)
-MAC  SFNT    TT     ---     COLLECTION truetype OT spec (this can't be CFF)
+  wrapper font    font    glyph      FreeType reference
+  format  format  type    access     driver   documents
+ -----------------------------------------------------------------------------
+
+  ---     BDF     ---     ---        bdf      5005.BDF_Spec.pdf, X11
 
 
----  ---     PS     TYPE_1  ---        type1    T1_SPEC.pdf
-                                                (`normal' Type 1 font)
-MAC  ---     PS     TYPE_1  ---        type1    T1_SPEC.pdf
-                                                (`normal' Type 1 font)
----  ---     PS     TYPE_1  CID        cid      PLRM.pdf (CID Font Type 0;
-                                                Type 9 font)
----  ---     PS     MM      ---        type1    5015.Type1_Supp.pdf
-                                                (Multiple Masters)
----  ---     PS     CFF     ---        cff      5176.CFF.pdf (`pure' CFF)
----  ---     PS     CFF     CID        cff      5176.CFF.pdf (`pure' CFF)
----  ---     PS     CFF     SYNTHETIC  ---      5176.CFF.pdf (`pure' CFF)
----  PS      PS     CFF     ---        ---      PLRM.pdf (Type 2) [1]
----  PS      PS     CFF     CID        ---      PLRM.pdf (Type 2) [1]
----  PS      PS     CFF     SYNTHETIC  ---      PLRM.pdf (Type 2) [1]
----  ---     PS     ---     TYPE_0     ---      PLRM.pdf
----  ---     PS     TYPE_3  ---        ---      PLRM.pdf (never supported)
----  ---     PS     TYPE_3  CID        ---      PLRM.pdf (CID Font Type 1;
-                                                Type 10 font; never supported)
----  PS      PS     TYPE_14 ---        ---      PLRM.pdf (Chameleon font;
-                                                Type 14 font; never supported?)
----  ---     PS     TYPE_32 CID        ---      PLRM.pdf (CID Font Type 4;
-                                                Type 32 font; never supported?)
----  PS      TT     ---     ---        type42   5012.Type42_Spec.pdf
-                                                (Type 42 font)
----  PS      TT     ---     CID        ---      PLRM.pdf (CID Font Type 2;
-                                                Type 11 font)
+  SFNT    PS      TYPE_1  ---        type1    Type 1 GX Font Format
+                                              (for the Mac) [3]
+  SFNT    PS      TYPE_1  CID        cid      5180.sfnt.pdf (for the Mac)
+                                              [3]
+  SFNT    PS      CFF     ---        cff      OT spec, 5176.CFF.pdf
+                                              (`OTTO' format)
+  SFNT    PS      CFF     CID        cff      OT spec, 5176.CFF.pdf
+  SFNT    PS      CFF     SYNTHETIC  ---      OT spec, 5176.CFF.pdf
+  SFNT    PS      CFF2    ---        cff      OT spec 1.8
+
+  SFNT    TT      SBIT    ---        sfnt     XFree86 (bitmaps only;
+                                              with `head' table)
+  SFNT    TT      MACSBIT ---        sfnt     OT spec (for the Mac;
+                                              bitmaps only; `bhed' table)
+  SFNT    TT      ---     ---        truetype OT spec (`normal' TT font)
+  SFNT    TT      VAR     ---        truetype GX spec (`?var' tables)
+  SFNT    TT      VAR     ---        truetype OT spec 1.8
+                                              (`?var' + `?VAR' tables)
 
 
----  ?       ?      CEF     ?          cff      ?
+  ---     PS      TYPE_1  ---        type1    T1_SPEC.pdf
+                                              (PFA, Type 1 font resource)
+  PFB     PS      TYPE_1  ---        type1    T1_SPEC.pdf,
+                                              5040.Download_Fonts.pdf
+                                              (`normal' Type 1 font)
+  ---     PS      TYPE_1  CID        cid      PLRM.pdf (CID Font Type 0;
+                                              Type 9 font)
+  ---     PS      MM      ---        type1    5015.Type1_Supp.pdf
+                                              (Multiple Masters)
+  ---     PS      CFF     ---        cff      5176.CFF.pdf (`pure' CFF)
+  ---     PS*     CFF     CID        cff      5176.CFF.pdf (`pure' CFF)
+  ---     PS      CFF     SYNTHETIC  ---      5176.CFF.pdf (`pure' CFF)
+  ---     PS      CFF/MM  ---        cff      old 5167.CFF.pdf (`pure' CFF)
+                                              [3]
+  ---     PS*     CFF/MM  CID        cff      old 5167.CFF.pdf (`pure' CFF)
+                                              [3]
+  ---     PS      CFF/MM  SYNTHETIC  ---      old 5167.CFF.pdf (`pure' CFF)
+                                              [3]
+  PS      PS      CFF     ---        ---      PLRM.pdf (Type 2) [1]
+  PS      PS*     CFF     CID        ---      PLRM.pdf (Type 2) [1]
+  PS      PS      CFF     SYNTHETIC  ---      PLRM.pdf (Type 2) [1]
+  PS      PS      CFF/MM  ---        ---      PLRM.pdf (Type 2) [1]
+  PS      PS*     CFF/MM  CID        ---      PLRM.pdf (Type 2) [1]
+  PS      PS      CFF/MM  SYNTHETIC  ---      PLRM.pdf (Type 2) [1]
+  ---     PS      ---     TYPE_0     ---      PLRM.pdf
+  ---     PS      TYPE_3  ---        ---      PLRM.pdf (never supported)
+  ---     PS      TYPE_3  CID        ---      PLRM.pdf (CID Font Type 1;
+                                              Type 10 font; never supported)
+  PS      PS      TYPE_14 ---        ---      PLRM.pdf (Chameleon font;
+                                              Type 14 font; never supported?)
+  ---     PS      TYPE_32 CID        ---      PLRM.pdf (CID Font Type 4;
+                                              Type 32 font; never supported?)
+  PS      TT      ---     ---        type42   5012.Type42_Spec.pdf
+                                              (Type 42 font)
+  PS      TT      ---     CID        ---      PLRM.pdf (CID Font Type 2;
+                                              Type 11 font)
 
 
----  ---     PCF    ---     ---        pcf      X11 [4]
----  LZW     PCF    ---     ---        pcf      X11 [4]
----  BZ2     PCF    ---     ---        pcf      X11 [4]
+  ?       ?       CEF     ?          cff      ?
 
 
----  ---     PFR    PFR0    ---        pfr      [2]
----  ---     PFR    PFR1    ---        ---      (undocumented, proprietary;
-                                                probably never supported)
+  ---     PCF     ---     ---        pcf      X11 [4]
+  LZW     PCF     ---     ---        pcf      X11 [4]
+  BZ2     PCF     ---     ---        pcf      X11 [4]
 
 
----  ---     WINFNT ---     ---        winfonts Windows developer's notes [5]
----  ---     WINFNT VECTOR  ---        ---      Windows developer's notes [5]
+  ---     PFR*    PFR0    ---        pfr      [2]
+  ---     PFR     PFR1    ---        ---      (undocumented, proprietary;
+                                              probably never supported)
 
 
-[1] Support should be rather simple since this is identical to `CFF' but
-    in a PS wrapper.
+  ---     WINFNT* ---     ---        winfonts Windows developer's notes [5]
+  ---     WINFNT  VECTOR  ---        ---      Windows developer's notes [5]
 
-[2] Official PFR specification:
 
-      http://www.bitstream.com/categories/developer/truedoc/pfrspec.html
-      http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf
+[1] Support should  be rather simple since this is  identical to `CFF'
+    but in a PS wrapper.
 
-    The  syntax of  the  auxiliary data  is  not defined  there, but  is
-    partially defined in  MHP 1.0.3 (also called ETSI  TS 101812 V1.3.1)
+[2] The  official  PFR  specification  is  no  longer  available,  but
+    archive.org has archived it:
+
+      https://web.archive.org/web/20091014062300/http://www.bitstream.com/font_rendering/products/truedoc/pfrspec.html
+      https://web.archive.org/web/20081115152605/http://www.bitstream.com/font_rendering/pdfs/pfrspec1.3.pdf
+
+    The syntax  of the  auxiliary data  is not  defined there,  but is
+    partially defined in MHP 1.0.3 (also called ETSI TS 101812 V1.3.1)
     section 7.4.
 
       http://www.etsi.org/
       http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=18799
 
-    (free registration required).
-
-[3] Support is rudimentary currently; some tables are not loaded yet.
+[3] Support  is rudimentary  currently; some  tables or  data are  not
+    loaded yet.
 
 [4] See
 
@@ -151,21 +177,21 @@
       Elias Israel, Erik Fortune, Digital Press, 1992
       ISBN 1-55558-096-3
 
-    for a specification  given in Appendix D on pgs. 436-450.   However,
-    this information  might be out of  date; unfortunately,  there is no
-    PCF  specification available  online, and this book is out of print.
-    George  Williams deduced  the font  format from the X11  sources and
+    for a specification given in Appendix D on pgs. 436-450.  However,
+    this information might be out  of date; unfortunately, there is no
+    PCF specification available online, and this book is out of print.
+    George Williams deduced  the font format from the  X11 sources and
     documented it for his FontForge font editor:
 
-      http://fontforge.sourceforge.net/pcf-format.html
+      https://fontforge.github.io/pcf-format.html
 
 [5] This is from MS Windows 3; see Microsoft's Knowledge Base article at
 
-      http://support.microsoft.com/kb/65123
+      https://support.microsoft.com/kb/65123
 
 ------------------------------------------------------------------------
 
-Copyright 2004-2015 by
+Copyright 2004-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
@@ -176,3 +202,7 @@
 
 
 --- end of formats.txt ---
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/docs/freetype-config.1 b/docs/freetype-config.1
index cdab34b..164b8ff 100644
--- a/docs/freetype-config.1
+++ b/docs/freetype-config.1
@@ -1,4 +1,4 @@
-.TH FREETYPE-CONFIG 1 "June 2015" "FreeType 2.6"
+.TH FREETYPE-CONFIG 1 "May 2018" "FreeType 2.9.1"
 .
 .
 .SH NAME
@@ -23,6 +23,14 @@
 installation (directory path) prefix or the FreeType version number.
 .
 .PP
+If
+.BR pkg-config (1)
+is found in the path,
+.B freetype-config
+acts as a wrapper for
+.BR pkg-config .
+.
+.PP
 This program is part of the FreeType package.
 .
 .
@@ -50,7 +58,8 @@
 .
 .TP
 .B \-\-ftversion
-Return the FreeType version number.
+Return the FreeType version number, directly derived from file
+`freetype.h'.
 .
 .TP
 .B \-\-version
@@ -72,32 +81,61 @@
 .B \-\-static
 Make command line options display flags for static linking.
 .
+.TP
+.B \-\-help
+Show help and exit.
+.
 .
 .SS Path override options
 .
 These affect any selected output option, except the libtool version
-returned by `--version'.
+returned by
+.BR \-\-version .
 .
 .TP
 .BI \-\-prefix= PREFIX
-Override `--prefix' value with
+Override
+.B \-\-prefix
+value with
 .IR PREFIX .
 .
+This also sets
+.BI \-\-exec-prefix= PREFIX
+if option
+.B \-\-exec-prefix
+is not explicitly given.
+.
 .TP
 .BI \-\-exec-prefix= EPREFIX
-Override `--exec-prefix' value with
+Override
+.B \-\-exec-prefix
+value with
 .IR EPREFIX .
 .
 .
 .SH BUGS
 In case the libraries FreeType links to are located in non-standard
-directories, the output from option
+directories, and
+.BR pkg-config (1)
+is not available, the output from option
 .B \-\-libs
 might be incomplete.
+.
 It is thus recommended to use the
 .BR pkg-config (1)
 interface instead, which is able to correctly resolve all dependencies.
 .
+.PP
+Setting
+.B \-\-exec-prefix
+(either explicitly or implicitly) might return incorrect results if
+combined with option
+.BR \-\-static .
+.
+The same problem can occur if you set the
+.B SYSROOT
+environment variable.
+.
 .
 .SH AUTHOR
 .
diff --git a/docs/raster.txt b/docs/raster.txt
index dc55d64..8ef466e 100644
--- a/docs/raster.txt
+++ b/docs/raster.txt
@@ -618,7 +618,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
diff --git a/docs/release b/docs/release
index bd92b23..44b4cb1 100644
--- a/docs/release
+++ b/docs/release
@@ -1,7 +1,7 @@
 How to prepare a new release
 ----------------------------
 
-. include/freetype.h:  Update FREETYPE_MAJOR, FREETYPE_MINOR,
+. include/freetype/freetype.h:  Update FREETYPE_MAJOR, FREETYPE_MINOR,
   and FREETYPE_PATCH.
 
 . Update version numbers in all files where necessary (for example, do
@@ -13,7 +13,7 @@
 
 . README: Update.
 
-. docs/VERSION.DLL: Document changed `version_info'.
+. docs/VERSIONS.TXT: Document changed `version_info'.
 
 . ChangeLog:   Announce  new  release   (both  in  the  freetype2  and
   freetype2-demos modules).
@@ -189,7 +189,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2015 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
diff --git a/include/freetype-fuchsia-config/ftoption.h b/include/freetype-fuchsia-config/ftoption.h
index 2499196..312eafb 100644
--- a/include/freetype-fuchsia-config/ftoption.h
+++ b/include/freetype-fuchsia-config/ftoption.h
@@ -693,6 +693,24 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum     */
+  /* number of bytecode instructions executed for a single run of the      */
+  /* bytecode interpreter, needed to prevent infinite loops.  You don't    */
+  /* want to change this except for very special situations (e.g., making  */
+  /* a library fuzzer spend less time to handle broken fonts).             */
+  /*                                                                       */
+  /* It is not expected that this value is ever modified by a configuring  */
+  /* script; instead, it gets surrounded with #ifndef ... #endif so that   */
+  /* the value can be set as a preprocessor option on the compiler's       */
+  /* command line.                                                         */
+  /*                                                                       */
+#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES
+#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES  1000000L
+#endif
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
diff --git a/include/config/ftconfig.h b/include/freetype/config/ftconfig.h
similarity index 73%
rename from include/config/ftconfig.h
rename to include/freetype/config/ftconfig.h
index 086db76..eedebf4 100644
--- a/include/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    ANSI-specific configuration file (specification only).               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -35,8 +35,8 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __FTCONFIG_H__
-#define __FTCONFIG_H__
+#ifndef FTCONFIG_H_
+#define FTCONFIG_H_
 
 #include <ft2build.h>
 #include FT_CONFIG_OPTIONS_H
@@ -73,11 +73,11 @@
 
   /* The size of an `int' type.  */
 #if                                 FT_UINT_MAX == 0xFFFFUL
-#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#define FT_SIZEOF_INT  ( 16 / FT_CHAR_BIT )
 #elif                               FT_UINT_MAX == 0xFFFFFFFFUL
-#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#define FT_SIZEOF_INT  ( 32 / FT_CHAR_BIT )
 #elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
-#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)
+#define FT_SIZEOF_INT  ( 64 / FT_CHAR_BIT )
 #else
 #error "Unsupported size of `int' type!"
 #endif
@@ -85,11 +85,11 @@
   /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */
   /* DM642) is recognized but avoided.                                   */
 #if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
-#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT )
 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
-#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT )
 #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
-#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)
+#define FT_SIZEOF_LONG  ( 64 / FT_CHAR_BIT )
 #else
 #error "Unsupported size of `long' type!"
 #endif
@@ -143,6 +143,14 @@
 #endif
 
 
+  /* Fix compiler warning with sgi compiler */
+#if defined( __sgi ) && !defined( __GNUC__ )
+#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 )
+#pragma set woff 3505
+#endif
+#endif
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Section>                                                             */
@@ -228,12 +236,12 @@
 
 #endif
 
-#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT )
 
   typedef signed int      FT_Int32;
   typedef unsigned int    FT_UInt32;
 
-#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT )
 
   typedef signed long     FT_Int32;
   typedef unsigned long   FT_UInt32;
@@ -244,12 +252,12 @@
 
 
   /* look up an integer type that is at least 32 bits */
-#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT )
 
   typedef int            FT_Fast;
   typedef unsigned int   FT_UFast;
 
-#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT )
 
   typedef long           FT_Fast;
   typedef unsigned long  FT_UFast;
@@ -259,7 +267,7 @@
 
   /* determine whether we have a 64-bit int type for platforms without */
   /* Autoconf                                                          */
-#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT )
 
   /* FT_LONG64 must be defined if a 64-bit type is available */
 #define FT_LONG64
@@ -275,7 +283,13 @@
   /*                                                                       */
 #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 )
 
-#if defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+#if defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 199901L
+
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
 
   /* this compiler provides the __int64 type */
 #define FT_LONG64
@@ -309,7 +323,7 @@
 #define FT_INT64   long long int
 #define FT_UINT64  unsigned long long int
 
-#endif /* _MSC_VER */
+#endif /* __STDC_VERSION__ >= 199901L */
 
 #endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
 
@@ -319,6 +333,15 @@
 #endif
 
 
+#ifdef _WIN64
+  /* only 64bit Windows uses the LLP64 data model, i.e., */
+  /* 32bit integers, 64bit pointers                      */
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned __int64)(x)
+#else
+#define FT_UINT_TO_POINTER( x ) (void*)(unsigned long)(x)
+#endif
+
+
   /*************************************************************************/
   /*                                                                       */
   /* miscellaneous                                                         */
@@ -332,15 +355,24 @@
 
 
   /* typeof condition taken from gnulib's `intprops.h' header file */
-#if ( __GNUC__ >= 2                         || \
-      defined( __IBM__TYPEOF__ )            || \
-      ( __SUNPRO_C >= 0x5110 && !__STDC__ ) )
-#define TYPEOF( type )  (__typeof__ (type))
+#if ( ( defined( __GNUC__ ) && __GNUC__ >= 2 )                       || \
+      ( defined( __IBMC__ ) && __IBMC__ >= 1210 &&                      \
+        defined( __IBM__TYPEOF__ ) )                                 || \
+      ( defined( __SUNPRO_C ) && __SUNPRO_C >= 0x5110 && !__STDC__ ) )
+#define FT_TYPEOF( type )  ( __typeof__ ( type ) )
 #else
-#define TYPEOF( type )  /* empty */
+#define FT_TYPEOF( type )  /* empty */
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -362,6 +394,12 @@
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -384,14 +422,63 @@
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL or DSO with hidden visibility      */
+  /*   some systems/compilers need a special attribute in front OR after   */
+  /*   the return type of function declarations.                           */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
-#ifdef __cplusplus
+#ifdef FT2_BUILD_LIBRARY
+
+#if defined( _WIN32 ) && ( defined( _DLL ) || defined( DLL_EXPORT ) )
+#define FT_EXPORT( x )  __declspec( dllexport )  x
+#elif defined( __GNUC__ ) && __GNUC__ >= 4
+#define FT_EXPORT( x )  __attribute__(( visibility( "default" ) ))  x
+#elif defined( __cplusplus )
 #define FT_EXPORT( x )  extern "C"  x
 #else
 #define FT_EXPORT( x )  extern  x
 #endif
 
+#else
+
+#if defined( FT2_DLLIMPORT )
+#define FT_EXPORT( x )  __declspec( dllimport )  x
+#elif defined( __cplusplus )
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif
+
 #endif /* !FT_EXPORT */
 
 
@@ -416,6 +503,7 @@
 
 #endif /* !FT_EXPORT_VAR */
 
+
   /* The following macros are needed to compile the library with a   */
   /* C++ compiler and with 16bit compilers.                          */
   /*                                                                 */
@@ -427,7 +515,13 @@
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -447,6 +541,16 @@
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
@@ -461,7 +565,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCONFIG_H__ */
+#endif /* FTCONFIG_H_ */
 
 
 /* END */
diff --git a/include/config/ftheader.h b/include/freetype/config/ftheader.h
similarity index 83%
rename from include/config/ftheader.h
rename to include/freetype/config/ftheader.h
index 4906bc1..702f77c 100644
--- a/include/config/ftheader.h
+++ b/include/freetype/config/ftheader.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Build macros of the FreeType 2 library.                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,8 +15,8 @@
 /*                                                                         */
 /***************************************************************************/
 
-#ifndef __FT_HEADER_H__
-#define __FT_HEADER_H__
+#ifndef FTHEADER_H_
+#define FTHEADER_H_
 
 
   /*@***********************************************************************/
@@ -107,7 +107,7 @@
    *
    */
 #ifndef FT_CONFIG_CONFIG_H
-#define FT_CONFIG_CONFIG_H  <config/ftconfig.h>
+#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
 #endif
 
 
@@ -122,7 +122,7 @@
    *
    */
 #ifndef FT_CONFIG_STANDARD_LIBRARY_H
-#define FT_CONFIG_STANDARD_LIBRARY_H  <config/ftstdlib.h>
+#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
 #endif
 
 
@@ -137,7 +137,7 @@
    *
    */
 #ifndef FT_CONFIG_OPTIONS_H
-#define FT_CONFIG_OPTIONS_H  <config/ftoption.h>
+#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
 #endif
 
 
@@ -153,7 +153,7 @@
    *
    */
 #ifndef FT_CONFIG_MODULES_H
-#define FT_CONFIG_MODULES_H  <config/ftmodule.h>
+#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
 #endif
 
   /* */
@@ -170,7 +170,7 @@
    *   base FreeType~2 API.
    *
    */
-#define FT_FREETYPE_H  <freetype.h>
+#define FT_FREETYPE_H  <freetype/freetype.h>
 
 
   /*************************************************************************
@@ -185,7 +185,7 @@
    *   It is included by @FT_FREETYPE_H.
    *
    */
-#define FT_ERRORS_H  <fterrors.h>
+#define FT_ERRORS_H  <freetype/fterrors.h>
 
 
   /*************************************************************************
@@ -198,7 +198,7 @@
    *   list of FreeType~2 module error offsets (and messages).
    *
    */
-#define FT_MODULE_ERRORS_H  <ftmoderr.h>
+#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
 
 
   /*************************************************************************
@@ -214,7 +214,7 @@
    *   It is included by @FT_FREETYPE_H.
    *
    */
-#define FT_SYSTEM_H  <ftsystem.h>
+#define FT_SYSTEM_H  <freetype/ftsystem.h>
 
 
   /*************************************************************************
@@ -230,7 +230,7 @@
    *   It is included by @FT_FREETYPE_H.
    *
    */
-#define FT_IMAGE_H  <ftimage.h>
+#define FT_IMAGE_H  <freetype/ftimage.h>
 
 
   /*************************************************************************
@@ -245,7 +245,7 @@
    *   It is included by @FT_FREETYPE_H.
    *
    */
-#define FT_TYPES_H  <fttypes.h>
+#define FT_TYPES_H  <freetype/fttypes.h>
 
 
   /*************************************************************************
@@ -260,7 +260,7 @@
    *   (Most applications will never need to include this file.)
    *
    */
-#define FT_LIST_H  <ftlist.h>
+#define FT_LIST_H  <freetype/ftlist.h>
 
 
   /*************************************************************************
@@ -273,7 +273,7 @@
    *   scalable outline management API of FreeType~2.
    *
    */
-#define FT_OUTLINE_H  <ftoutln.h>
+#define FT_OUTLINE_H  <freetype/ftoutln.h>
 
 
   /*************************************************************************
@@ -286,7 +286,7 @@
    *   API which manages multiple @FT_Size objects per face.
    *
    */
-#define FT_SIZES_H  <ftsizes.h>
+#define FT_SIZES_H  <freetype/ftsizes.h>
 
 
   /*************************************************************************
@@ -299,7 +299,7 @@
    *   module management API of FreeType~2.
    *
    */
-#define FT_MODULE_H  <ftmodapi.h>
+#define FT_MODULE_H  <freetype/ftmodapi.h>
 
 
   /*************************************************************************
@@ -312,7 +312,20 @@
    *   renderer module management API of FreeType~2.
    *
    */
-#define FT_RENDER_H  <ftrender.h>
+#define FT_RENDER_H  <freetype/ftrender.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the driver modules.
+   *
+   */
+#define FT_DRIVER_H  <freetype/ftdriver.h>
 
 
   /*************************************************************************
@@ -324,8 +337,10 @@
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the auto-hinting module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_AUTOHINTER_H  <ftautoh.h>
+#define FT_AUTOHINTER_H  FT_DRIVER_H
 
 
   /*************************************************************************
@@ -337,8 +352,10 @@
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the CFF driver module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_CFF_DRIVER_H  <ftcffdrv.h>
+#define FT_CFF_DRIVER_H  FT_DRIVER_H
 
 
   /*************************************************************************
@@ -350,8 +367,25 @@
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the TrueType driver module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_TRUETYPE_DRIVER_H  <ftttdrv.h>
+#define FT_TRUETYPE_DRIVER_H  FT_DRIVER_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_PCF_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the PCF driver module.
+   *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
+   */
+#define FT_PCF_DRIVER_H  FT_DRIVER_H
 
 
   /*************************************************************************
@@ -364,7 +398,7 @@
    *   types and API specific to the Type~1 format.
    *
    */
-#define FT_TYPE1_TABLES_H  <t1tables.h>
+#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
 
 
   /*************************************************************************
@@ -379,7 +413,7 @@
    *   definitions, taken from the TrueType and OpenType specifications.
    *
    */
-#define FT_TRUETYPE_IDS_H  <ttnameid.h>
+#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
 
 
   /*************************************************************************
@@ -392,7 +426,7 @@
    *   types and API specific to the TrueType (as well as OpenType) format.
    *
    */
-#define FT_TRUETYPE_TABLES_H  <tttables.h>
+#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
 
 
   /*************************************************************************
@@ -406,7 +440,7 @@
    *   SFNT-based font formats (i.e., TrueType and OpenType).
    *
    */
-#define FT_TRUETYPE_TAGS_H  <tttags.h>
+#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
 
 
   /*************************************************************************
@@ -420,7 +454,7 @@
    *   face.
    *
    */
-#define FT_BDF_H  <ftbdf.h>
+#define FT_BDF_H  <freetype/ftbdf.h>
 
 
   /*************************************************************************
@@ -434,7 +468,7 @@
    *   face.
    *
    */
-#define FT_CID_H  <ftcid.h>
+#define FT_CID_H  <freetype/ftcid.h>
 
 
   /*************************************************************************
@@ -447,7 +481,7 @@
    *   definitions of an API which supports gzip-compressed files.
    *
    */
-#define FT_GZIP_H  <ftgzip.h>
+#define FT_GZIP_H  <freetype/ftgzip.h>
 
 
   /*************************************************************************
@@ -460,7 +494,7 @@
    *   definitions of an API which supports LZW-compressed files.
    *
    */
-#define FT_LZW_H  <ftlzw.h>
+#define FT_LZW_H  <freetype/ftlzw.h>
 
 
   /*************************************************************************
@@ -473,7 +507,7 @@
    *   definitions of an API which supports bzip2-compressed files.
    *
    */
-#define FT_BZIP2_H  <ftbzip2.h>
+#define FT_BZIP2_H  <freetype/ftbzip2.h>
 
 
   /*************************************************************************
@@ -486,7 +520,7 @@
    *   definitions of an API which supports Windows FNT files.
    *
    */
-#define FT_WINFONTS_H   <ftwinfnt.h>
+#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
 
 
   /*************************************************************************
@@ -499,7 +533,7 @@
    *   API of the optional glyph management component.
    *
    */
-#define FT_GLYPH_H  <ftglyph.h>
+#define FT_GLYPH_H  <freetype/ftglyph.h>
 
 
   /*************************************************************************
@@ -512,7 +546,7 @@
    *   API of the optional bitmap conversion component.
    *
    */
-#define FT_BITMAP_H  <ftbitmap.h>
+#define FT_BITMAP_H  <freetype/ftbitmap.h>
 
 
   /*************************************************************************
@@ -525,7 +559,7 @@
    *   API of the optional exact bounding box computation routines.
    *
    */
-#define FT_BBOX_H  <ftbbox.h>
+#define FT_BBOX_H  <freetype/ftbbox.h>
 
 
   /*************************************************************************
@@ -538,64 +572,7 @@
    *   API of the optional FreeType~2 cache sub-system.
    *
    */
-#define FT_CACHE_H  <ftcache.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CACHE_IMAGE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   `glyph image' API of the FreeType~2 cache sub-system.
-   *
-   *   It is used to define a cache for @FT_Glyph elements.  You can also
-   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
-   *   store small glyph bitmaps, as it will use less memory.
-   *
-   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
-   *   glyph image-related cache declarations.
-   *
-   */
-#define FT_CACHE_IMAGE_H  FT_CACHE_H
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CACHE_SMALL_BITMAPS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   `small bitmaps' API of the FreeType~2 cache sub-system.
-   *
-   *   It is used to define a cache for small glyph bitmaps in a relatively
-   *   memory-efficient way.  You can also use the API defined in
-   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
-   *   including scalable outlines.
-   *
-   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
-   *   small bitmaps-related cache declarations.
-   *
-   */
-#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CACHE_CHARMAP_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   `charmap' API of the FreeType~2 cache sub-system.
-   *
-   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
-   *   charmap-based cache declarations.
-   *
-   */
-#define FT_CACHE_CHARMAP_H  FT_CACHE_H
+#define FT_CACHE_H  <freetype/ftcache.h>
 
 
   /*************************************************************************
@@ -612,7 +589,7 @@
    *   compiled on the Mac (note that the base API still works though).
    *
    */
-#define FT_MAC_H  <ftmac.h>
+#define FT_MAC_H  <freetype/ftmac.h>
 
 
   /*************************************************************************
@@ -625,7 +602,7 @@
    *   optional multiple-masters management API of FreeType~2.
    *
    */
-#define FT_MULTIPLE_MASTERS_H  <ftmm.h>
+#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
 
 
   /*************************************************************************
@@ -639,7 +616,7 @@
    *   SFNT-based font formats (i.e., TrueType and OpenType).
    *
    */
-#define FT_SFNT_NAMES_H  <ftsnames.h>
+#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
 
 
   /*************************************************************************
@@ -653,7 +630,7 @@
    *   GPOS, GSUB, JSTF).
    *
    */
-#define FT_OPENTYPE_VALIDATE_H  <ftotval.h>
+#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
 
 
   /*************************************************************************
@@ -667,7 +644,7 @@
    *   mort, morx, bsln, just, kern, opbd, trak, prop).
    *
    */
-#define FT_GX_VALIDATE_H  <ftgxval.h>
+#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
 
 
   /*************************************************************************
@@ -680,7 +657,7 @@
    *   FreeType~2 API which accesses PFR-specific data.
    *
    */
-#define FT_PFR_H  <ftpfr.h>
+#define FT_PFR_H  <freetype/ftpfr.h>
 
 
   /*************************************************************************
@@ -692,7 +669,7 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which provides functions to stroke outline paths.
    */
-#define FT_STROKER_H  <ftstroke.h>
+#define FT_STROKER_H  <freetype/ftstroke.h>
 
 
   /*************************************************************************
@@ -704,7 +681,7 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which performs artificial obliquing and emboldening.
    */
-#define FT_SYNTHESIS_H  <ftsynth.h>
+#define FT_SYNTHESIS_H  <freetype/ftsynth.h>
 
 
   /*************************************************************************
@@ -716,7 +693,7 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which provides functions specific to font formats.
    */
-#define FT_FONT_FORMATS_H  <ftfntfmt.h>
+#define FT_FONT_FORMATS_H  <freetype/ftfntfmt.h>
 
   /* deprecated */
 #define FT_XFREE86_H  FT_FONT_FORMATS_H
@@ -732,7 +709,7 @@
    *   FreeType~2 API which performs trigonometric computations (e.g.,
    *   cosines and arc tangents).
    */
-#define FT_TRIGONOMETRY_H  <fttrigon.h>
+#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
 
 
   /*************************************************************************
@@ -744,19 +721,7 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which performs color filtering for subpixel rendering.
    */
-#define FT_LCD_FILTER_H  <ftlcdfil.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_UNPATENTED_HINTING_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 API which performs color filtering for subpixel rendering.
-   */
-#define FT_UNPATENTED_HINTING_H  <ttunpat.h>
+#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>
 
 
   /*************************************************************************
@@ -766,9 +731,9 @@
    *
    * @description:
    *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   *   FreeType~2 API which performs incremental glyph loading.
    */
-#define FT_INCREMENTAL_H  <ftincrem.h>
+#define FT_INCREMENTAL_H  <freetype/ftincrem.h>
 
 
   /*************************************************************************
@@ -780,7 +745,7 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which returns entries from the TrueType GASP table.
    */
-#define FT_GASP_H  <ftgasp.h>
+#define FT_GASP_H  <freetype/ftgasp.h>
 
 
   /*************************************************************************
@@ -792,30 +757,35 @@
    *   A macro used in #include statements to name the file containing the
    *   FreeType~2 API which returns individual and ranged glyph advances.
    */
-#define FT_ADVANCES_H  <ftadvanc.h>
+#define FT_ADVANCES_H  <freetype/ftadvanc.h>
 
 
   /* */
 
-#define FT_ERROR_DEFINITIONS_H  <fterrdef.h>
+  /* These header files don't need to be included by the user. */
+#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>
+#define FT_PARAMETER_TAGS_H     <freetype/ftparams.h>
 
+  /* Deprecated macros. */
+#define FT_UNPATENTED_HINTING_H   <freetype/ftparams.h>
+#define FT_TRUETYPE_UNPATENTED_H  <freetype/ftparams.h>
+
+  /* FT_CACHE_H is the only header file needed for the cache subsystem. */
+#define FT_CACHE_IMAGE_H          FT_CACHE_H
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+#define FT_CACHE_CHARMAP_H        FT_CACHE_H
 
   /* The internals of the cache sub-system are no longer exposed.  We */
   /* default to FT_CACHE_H at the moment just in case, but we know of */
   /* no rogue client that uses them.                                  */
   /*                                                                  */
-#define FT_CACHE_MANAGER_H           <ftcache.h>
-#define FT_CACHE_INTERNAL_MRU_H      <ftcache.h>
-#define FT_CACHE_INTERNAL_MANAGER_H  <ftcache.h>
-#define FT_CACHE_INTERNAL_CACHE_H    <ftcache.h>
-#define FT_CACHE_INTERNAL_GLYPH_H    <ftcache.h>
-#define FT_CACHE_INTERNAL_IMAGE_H    <ftcache.h>
-#define FT_CACHE_INTERNAL_SBITS_H    <ftcache.h>
-
-
-#define FT_INCREMENTAL_H          <ftincrem.h>
-
-#define FT_TRUETYPE_UNPATENTED_H  <ttunpat.h>
+#define FT_CACHE_MANAGER_H           FT_CACHE_H
+#define FT_CACHE_INTERNAL_MRU_H      FT_CACHE_H
+#define FT_CACHE_INTERNAL_MANAGER_H  FT_CACHE_H
+#define FT_CACHE_INTERNAL_CACHE_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_GLYPH_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_IMAGE_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_SBITS_H    FT_CACHE_H
 
 
   /*
@@ -823,12 +793,12 @@
    * only when building the library.
    */
 #ifdef FT2_BUILD_LIBRARY
-#define  FT_INTERNAL_INTERNAL_H  <internal/internal.h>
+#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>
 #include FT_INTERNAL_INTERNAL_H
 #endif /* FT2_BUILD_LIBRARY */
 
 
-#endif /* __FT2_BUILD_H__ */
+#endif /* FTHEADER_H_ */
 
 
 /* END */
diff --git a/include/config/ftmodule.h b/include/freetype/config/ftmodule.h
similarity index 100%
rename from include/config/ftmodule.h
rename to include/freetype/config/ftmodule.h
diff --git a/include/config/ftoption.h b/include/freetype/config/ftoption.h
similarity index 79%
rename from include/config/ftoption.h
rename to include/freetype/config/ftoption.h
index 1536c72..4bcab2a 100644
--- a/include/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    User-selectable configuration macros (specification only).           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTOPTION_H__
-#define __FTOPTION_H__
+#ifndef FTOPTION_H_
+#define FTOPTION_H_
 
 
 #include <ft2build.h>
@@ -38,9 +38,9 @@
   /*    library from a single source directory.                            */
   /*                                                                       */
   /*  - You can put a copy of this file in your build directory, more      */
-  /*    precisely in `$BUILD/config/ftoption.h', where `$BUILD' is the     */
-  /*    name of a directory that is included _before_ the FreeType include */
-  /*    path during compilation.                                           */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
   /*                                                                       */
   /*    The default FreeType Makefiles and Jamfiles use the build          */
   /*    directory `builds/<system>' by default, but you can easily change  */
@@ -51,7 +51,7 @@
   /*    locate this file during the build.  For example,                   */
   /*                                                                       */
   /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
-  /*      #include <config/ftheader.h>                                     */
+  /*      #include <freetype/config/ftheader.h>                            */
   /*                                                                       */
   /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
   /*    definitions.                                                       */
@@ -59,7 +59,7 @@
   /*    Note also that you can similarly pre-define the macro              */
   /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
   /*    that are statically linked to the library at compile time.  By     */
-  /*    default, this file is <config/ftmodule.h>.                         */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
   /*                                                                       */
   /* We highly recommend using the third method whenever possible.         */
   /*                                                                       */
@@ -75,22 +75,52 @@
   /*************************************************************************/
 
 
+  /*#***********************************************************************/
+  /*                                                                       */
+  /* If you enable this configuration option, FreeType recognizes an       */
+  /* environment variable called `FREETYPE_PROPERTIES', which can be used  */
+  /* to control the various font drivers and modules.  The controllable    */
+  /* properties are listed in the section @properties.                     */
+  /*                                                                       */
+  /* You have to undefine this configuration option on platforms that lack */
+  /* the concept of environment variables (and thus don't have the         */
+  /* `getenv' function), for example Windows CE.                           */
+  /*                                                                       */
+  /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */
+  /* multiple lines for better readability).                               */
+  /*                                                                       */
+  /* {                                                                     */
+  /*   <optional whitespace>                                               */
+  /*   <module-name1> ':'                                                  */
+  /*   <property-name1> '=' <property-value1>                              */
+  /*   <whitespace>                                                        */
+  /*   <module-name2> ':'                                                  */
+  /*   <property-name2> '=' <property-value2>                              */
+  /*   ...                                                                 */
+  /* }                                                                     */
+  /*                                                                       */
+  /* Example:                                                              */
+  /*                                                                       */
+  /*   FREETYPE_PROPERTIES=truetype:interpreter-version=35 \               */
+  /*                       cff:no-stem-darkening=1 \                       */
+  /*                       autofitter:warping=1                            */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+
+
   /*************************************************************************/
   /*                                                                       */
-  /* Uncomment the line below if you want to activate sub-pixel rendering  */
-  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /* Uncomment the line below if you want to activate LCD rendering        */
+  /* technology similar to ClearType in this build of the library.  This   */
+  /* technology triples the resolution in the direction color subpixels.   */
+  /* To mitigate color fringes inherent to this technology, you also need  */
+  /* to explicitly set up LCD filtering.                                   */
   /*                                                                       */
   /* Note that this feature is covered by several Microsoft patents        */
   /* and should not be activated in any default build of the library.      */
-  /*                                                                       */
-  /* This macro has no impact on the FreeType API, only on its             */
-  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
-  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
-  /* the original size in case this macro isn't defined; however, each     */
-  /* triplet of subpixels has R=G=B.                                       */
-  /*                                                                       */
-  /* This is done to allow FreeType clients to run unmodified, forcing     */
-  /* them to display normal gray-level anti-aliased glyphs.                */
+  /* When this macro is not defined, FreeType offers alternative LCD       */
+  /* rendering technology that produces excellent output without LCD       */
+  /* filtering.                                                            */
   /*                                                                       */
 /* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
@@ -184,6 +214,10 @@
   /*   Do not #undef this macro here since the build system might define   */
   /*   it for certain configurations only.                                 */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
 
 
@@ -200,6 +234,10 @@
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_USE_BZIP2 */
 
 
@@ -225,6 +263,10 @@
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_USE_PNG */
 
 
@@ -238,53 +280,15 @@
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_USE_HARFBUZZ */
 
 
   /*************************************************************************/
   /*                                                                       */
-  /* DLL export compilation                                                */
-  /*                                                                       */
-  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
-  /*   special keyword in front OR after the return type of function       */
-  /*   declarations.                                                       */
-  /*                                                                       */
-  /*   Two macros are used within the FreeType source code to define       */
-  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
-  /*                                                                       */
-  /*     FT_EXPORT( return_type )                                          */
-  /*                                                                       */
-  /*       is used in a function declaration, as in                        */
-  /*                                                                       */
-  /*         FT_EXPORT( FT_Error )                                         */
-  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
-  /*                                                                       */
-  /*                                                                       */
-  /*     FT_EXPORT_DEF( return_type )                                      */
-  /*                                                                       */
-  /*       is used in a function definition, as in                         */
-  /*                                                                       */
-  /*         FT_EXPORT_DEF( FT_Error )                                     */
-  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
-  /*         {                                                             */
-  /*           ... some code ...                                           */
-  /*           return FT_Err_Ok;                                           */
-  /*         }                                                             */
-  /*                                                                       */
-  /*   You can provide your own implementation of FT_EXPORT and            */
-  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
-  /*   will be later automatically defined as `extern return_type' to      */
-  /*   allow normal compilation.                                           */
-  /*                                                                       */
-  /*   Do not #undef these macros here since the build system might define */
-  /*   them for certain configurations only.                               */
-  /*                                                                       */
-/* #define FT_EXPORT(x)      extern x */
-/* #define FT_EXPORT_DEF(x)  x */
-
-
-  /*************************************************************************/
-  /*                                                                       */
   /* Glyph Postscript Names handling                                       */
   /*                                                                       */
   /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
@@ -297,7 +301,7 @@
   /*                                                                       */
   /*   - The TrueType driver will provide its own set of glyph names,      */
   /*     if you build it to support postscript names in the TrueType       */
-  /*     `post' table.                                                     */
+  /*     `post' table, but will not synthesize a missing Unicode charmap.  */
   /*                                                                       */
   /*   - The Type 1 driver will not be able to synthesize a Unicode        */
   /*     charmap out of the glyphs found in the fonts.                     */
@@ -492,7 +496,21 @@
   /*   code will be used.                                                  */
   /*                                                                       */
   /*   Setting this macro is needed for systems that prohibit address      */
-  /*   fixups, such as BREW.                                               */
+  /*   fixups, such as BREW.  [Note that standard compilers like gcc or    */
+  /*   clang handle PIC generation automatically; you don't have to set    */
+  /*   FT_CONFIG_OPTION_PIC, which is only necessary for very special      */
+  /*   compilers.]                                                         */
+  /*                                                                       */
+  /*   Note that FT_CONFIG_OPTION_PIC support is not available for all     */
+  /*   modules (see `modules.cfg' for a complete list).  For building with */
+  /*   FT_CONFIG_OPTION_PIC support, do the following.                     */
+  /*                                                                       */
+  /*     0. Clone the repository.                                          */
+  /*     1. Define FT_CONFIG_OPTION_PIC.                                   */
+  /*     2. Remove all subdirectories in `src' that don't have             */
+  /*        FT_CONFIG_OPTION_PIC support.                                  */
+  /*     3. Comment out the corresponding modules in `modules.cfg'.        */
+  /*     4. Compile.                                                       */
   /*                                                                       */
 /* #define FT_CONFIG_OPTION_PIC */
 
@@ -586,73 +604,62 @@
   /*************************************************************************/
   /*                                                                       */
   /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile       */
-  /* EXPERIMENTAL subpixel hinting support into the TrueType driver.  This */
-  /* replaces the native TrueType hinting mechanism when anything but      */
-  /* FT_RENDER_MODE_MONO is requested.                                     */
+  /* subpixel hinting support into the TrueType driver.  This modifies the */
+  /* TrueType hinting mechanism when anything but FT_RENDER_MODE_MONO is   */
+  /* requested.                                                            */
   /*                                                                       */
-  /* Enabling this causes the TrueType driver to ignore instructions under */
-  /* certain conditions.  This is done in accordance with the guide here,  */
-  /* with some minor differences:                                          */
+  /* In particular, it modifies the bytecode interpreter to interpret (or  */
+  /* not) instructions in a certain way so that all TrueType fonts look    */
+  /* like they do in a Windows ClearType (DirectWrite) environment.  See   */
+  /* [1] for a technical overview on what this means.  See `ttinterp.h'    */
+  /* for more details on the LEAN option.                                  */
   /*                                                                       */
-  /*  http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /* There are three possible values.                                      */
   /*                                                                       */
-  /* By undefining this, you only compile the code necessary to hint       */
-  /* TrueType glyphs with native TT hinting.                               */
+  /* Value 1:                                                              */
+  /*    This value is associated with the `Infinality' moniker,            */
+  /*    contributed by an individual nicknamed Infinality with the goal of */
+  /*    making TrueType fonts render better than on Windows.  A high       */
+  /*    amount of configurability and flexibility, down to rules for       */
+  /*    single glyphs in fonts, but also very slow.  Its experimental and  */
+  /*    slow nature and the original developer losing interest meant that  */
+  /*    this option was never enabled in default builds.                   */
   /*                                                                       */
-  /*   This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be    */
-  /*   defined.                                                            */
+  /*    The corresponding interpreter version is v38.                      */
   /*                                                                       */
-/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-
-
-  /*************************************************************************/
+  /* Value 2:                                                              */
+  /*    The new default mode for the TrueType driver.  The Infinality code */
+  /*    base was stripped to the bare minimum and all configurability      */
+  /*    removed in the name of speed and simplicity.  The configurability  */
+  /*    was mainly aimed at legacy fonts like Arial, Times New Roman, or   */
+  /*    Courier.  Legacy fonts are fonts that modify vertical stems to     */
+  /*    achieve clean black-and-white bitmaps.  The new mode focuses on    */
+  /*    applying a minimal set of rules to all fonts indiscriminately so   */
+  /*    that modern and web fonts render well while legacy fonts render    */
+  /*    okay.                                                              */
   /*                                                                       */
-  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
-  /* of the TrueType bytecode interpreter is used that doesn't implement   */
-  /* any of the patented opcodes and algorithms.  The patents related to   */
-  /* TrueType hinting have expired worldwide since May 2010; this option   */
-  /* is now deprecated.                                                    */
+  /*    The corresponding interpreter version is v40.                      */
   /*                                                                       */
-  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
-  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
-  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
-  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /* Value 3:                                                              */
+  /*    Compile both, making both v38 and v40 available (the latter is the */
+  /*    default).                                                          */
   /*                                                                       */
-  /* This macro is only useful for a small number of font files (mostly    */
-  /* for Asian scripts) that require bytecode interpretation to properly   */
-  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
-  /* thus the unpatented interpreter is never used to load glyphs from     */
-  /* TrueType fonts unless one of the following two options is used.       */
+  /* By undefining these, you get rendering behavior like on Windows       */
+  /* without ClearType, i.e., Windows XP without ClearType enabled and     */
+  /* Win9x (interpreter version v35).  Or not, depending on how much       */
+  /* hinting blood and testing tears the font designer put into a given    */
+  /* font.  If you define one or both subpixel hinting options, you can    */
+  /* switch between between v35 and the ones you define (using             */
+  /* `FT_Property_Set').                                                   */
   /*                                                                       */
-  /*   - The unpatented interpreter is explicitly activated by the user    */
-  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
-  /*     when opening the FT_Face.                                         */
+  /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be      */
+  /* defined.                                                              */
   /*                                                                       */
-  /*   - FreeType detects that the FT_Face corresponds to one of the       */
-  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
-  /*     contains a hard-coded list of font names and other matching       */
-  /*     parameters (see function `tt_face_init' in file                   */
-  /*     `src/truetype/ttobjs.c').                                         */
+  /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
   /*                                                                       */
-  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
-  /*                                                                       */
-  /*   {                                                                   */
-  /*     FT_Parameter  parameter;                                          */
-  /*     FT_Open_Args  open_args;                                          */
-  /*                                                                       */
-  /*                                                                       */
-  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
-  /*                                                                       */
-  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
-  /*     open_args.pathname   = my_font_pathname;                          */
-  /*     open_args.num_params = 1;                                         */
-  /*     open_args.params     = &parameter;                                */
-  /*                                                                       */
-  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
-  /*     ...                                                               */
-  /*   }                                                                   */
-  /*                                                                       */
-/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  1         */
+#define TT_CONFIG_OPTION_SUBPIXEL_HINTING  2
+/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  ( 1 | 2 ) */
 
 
   /*************************************************************************/
@@ -668,7 +675,7 @@
   /* composite flags array which can be used to disambiguate, but old      */
   /* fonts will not have them.                                             */
   /*                                                                       */
-  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   https://www.microsoft.com/typography/otspec/glyf.htm                */
   /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */
   /*                                                                       */
 #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -693,6 +700,24 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum     */
+  /* number of bytecode instructions executed for a single run of the      */
+  /* bytecode interpreter, needed to prevent infinite loops.  You don't    */
+  /* want to change this except for very special situations (e.g., making  */
+  /* a library fuzzer spend less time to handle broken fonts).             */
+  /*                                                                       */
+  /* It is not expected that this value is ever modified by a configuring  */
+  /* script; instead, it gets surrounded with #ifndef ... #endif so that   */
+  /* the value can be set as a preprocessor option on the compiler's       */
+  /* command line.                                                         */
+  /*                                                                       */
+#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES
+#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES  1000000L
+#endif
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
@@ -748,6 +773,16 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1     */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the type1 driver module.                                              */
+  /*                                                                       */
+/* #define T1_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
@@ -762,8 +797,8 @@
   /* possible to set up the default values of the four control points that */
   /* define the stem darkening behaviour of the (new) CFF engine.  For     */
   /* more details please read the documentation of the                     */
-  /* `darkening-parameters' property of the cff driver module (file        */
-  /* `ftcffdrv.h'), which allows the control at run-time.                  */
+  /* `darkening-parameters' property (file `ftdriver.h'), which allows the */
+  /* control at run-time.                                                  */
   /*                                                                       */
   /* Do *not* undefine these macros!                                       */
   /*                                                                       */
@@ -793,6 +828,33 @@
   /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
+  /****         P C F   D R I V E R    C O N F I G U R A T I O N        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are many PCF fonts just called `Fixed' which look completely    */
+  /* different, and which have nothing to do with each other.  When        */
+  /* selecting `Fixed' in KDE or Gnome one gets results that appear rather */
+  /* random, the style changes often if one changes the size and one       */
+  /* cannot select some fonts at all.  This option makes the PCF module    */
+  /* prepend the foundry name (plus a space) to the family name.           */
+  /*                                                                       */
+  /* We also check whether we have `wide' characters; all put together, we */
+  /* get family names like `Sony Fixed' or `Misc Fixed Wide'.              */
+  /*                                                                       */
+  /* If this option is activated, it can be controlled with the            */
+  /* `no-long-family-names' property of the pcf driver module.             */
+  /*                                                                       */
+/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
   /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
   /****                                                                 ****/
   /*************************************************************************/
@@ -808,7 +870,9 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Compile autofit module with Indic script support.                     */
+  /* Compile autofit module with fallback Indic script support, covering   */
+  /* some scripts that the `latin' submodule of the autofit module doesn't */
+  /* (yet) handle.                                                         */
   /*                                                                       */
 #define AF_CONFIG_OPTION_INDIC
 
@@ -822,11 +886,31 @@
   /*                                                                       */
   /* This experimental option is active only if the rendering mode is      */
   /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the      */
-  /* `warping' property of the auto-hinter (see file `ftautoh.h' for more  */
+  /* `warping' property of the auto-hinter (see file `ftdriver.h' for more */
   /* information; by default it is switched off).                          */
   /*                                                                       */
 #define AF_CONFIG_OPTION_USE_WARPER
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* Use TrueType-like size metrics for `light' auto-hinting.              */
+  /*                                                                       */
+  /* It is strongly recommended to avoid this option, which exists only to */
+  /* help some legacy applications retain its appearance and behaviour     */
+  /* with respect to auto-hinted TrueType fonts.                           */
+  /*                                                                       */
+  /* The very reason this option exists at all are GNU/Linux distributions */
+  /* like Fedora that did not un-patch the following change (which was     */
+  /* present in FreeType between versions 2.4.6 and 2.7.1, inclusive).     */
+  /*                                                                       */
+  /*   2011-07-16  Steven Chu  <steven.f.chu@gmail.com>                    */
+  /*                                                                       */
+  /*     [truetype] Fix metrics on size request for scalable fonts.        */
+  /*                                                                       */
+  /* This problematic commit is now reverted (more or less).               */
+  /*                                                                       */
+/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */
+
   /* */
 
 
@@ -838,14 +922,21 @@
 
 
   /*
-   * This macro is defined if either unpatented or native TrueType
-   * hinting is requested by the definitions above.
+   * This macro is defined if native TrueType hinting is requested by the
+   * definitions above.
    */
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
 #define  TT_USE_BYTECODE_INTERPRETER
-#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
-#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
-#define  TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1
+#define  TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+#endif
+
+#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2
+#define  TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+#endif
+#endif
 #endif
 
 
@@ -880,7 +971,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTOPTION_H__ */
+#endif /* FTOPTION_H_ */
 
 
 /* END */
diff --git a/include/config/ftstdlib.h b/include/freetype/config/ftstdlib.h
similarity index 95%
rename from include/config/ftstdlib.h
rename to include/freetype/config/ftstdlib.h
index 8ef43c0..42f9a06 100644
--- a/include/config/ftstdlib.h
+++ b/include/freetype/config/ftstdlib.h
@@ -5,7 +5,7 @@
 /*    ANSI-specific library and header configuration file (specification   */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,14 +23,13 @@
   /* FreeType normally requires.  It also defines macros to rename the     */
   /* standard functions within the FreeType source code.                   */
   /*                                                                       */
-  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */
-  /* it.                                                                   */
+  /* Load a file which defines FTSTDLIB_H_ before this one to override it. */
   /*                                                                       */
   /*************************************************************************/
 
 
-#ifndef __FTSTDLIB_H__
-#define __FTSTDLIB_H__
+#ifndef FTSTDLIB_H_
+#define FTSTDLIB_H_
 
 
 #include <stddef.h>
@@ -64,6 +63,8 @@
 #define FT_INT_MAX     INT_MAX
 #define FT_INT_MIN     INT_MIN
 #define FT_UINT_MAX    UINT_MAX
+#define FT_LONG_MIN    LONG_MIN
+#define FT_LONG_MAX    LONG_MAX
 #define FT_ULONG_MAX   ULONG_MAX
 
 
@@ -141,7 +142,8 @@
   /**********************************************************************/
 
 
-#define ft_atol  atol
+#define ft_strtol  strtol
+#define ft_getenv  getenv
 
 
   /**********************************************************************/
@@ -167,7 +169,7 @@
 #include <stdarg.h>
 
 
-#endif /* __FTSTDLIB_H__ */
+#endif /* FTSTDLIB_H_ */
 
 
 /* END */
diff --git a/include/freetype.h b/include/freetype/freetype.h
similarity index 76%
rename from include/freetype.h
rename to include/freetype/freetype.h
index bca93e5..9664404 100644
--- a/include/freetype.h
+++ b/include/freetype/freetype.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType high-level API and common types (specification only).       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FREETYPE_H__
-#define __FREETYPE_H__
+#ifndef FREETYPE_H_
+#define FREETYPE_H_
 
 
 #ifndef FT_FREETYPE_H
@@ -138,24 +138,26 @@
   /*    FT_FACE_FLAG_TRICKY                                                */
   /*    FT_FACE_FLAG_KERNING                                               */
   /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */
+  /*    FT_FACE_FLAG_VARIATION                                             */
   /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
   /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
   /*    FT_FACE_FLAG_HINTER                                                */
-  /*    FT_FACE_FLAG_TRICKY                                                */
   /*                                                                       */
   /*    FT_HAS_HORIZONTAL                                                  */
   /*    FT_HAS_VERTICAL                                                    */
   /*    FT_HAS_KERNING                                                     */
   /*    FT_HAS_FIXED_SIZES                                                 */
   /*    FT_HAS_GLYPH_NAMES                                                 */
-  /*    FT_HAS_MULTIPLE_MASTERS                                            */
   /*    FT_HAS_COLOR                                                       */
+  /*    FT_HAS_MULTIPLE_MASTERS                                            */
   /*                                                                       */
   /*    FT_IS_SFNT                                                         */
   /*    FT_IS_SCALABLE                                                     */
   /*    FT_IS_FIXED_WIDTH                                                  */
   /*    FT_IS_CID_KEYED                                                    */
   /*    FT_IS_TRICKY                                                       */
+  /*    FT_IS_NAMED_INSTANCE                                               */
+  /*    FT_IS_VARIATION                                                    */
   /*                                                                       */
   /*    FT_STYLE_FLAG_BOLD                                                 */
   /*    FT_STYLE_FLAG_ITALIC                                               */
@@ -176,6 +178,7 @@
   /*    FT_Done_Face                                                       */
   /*    FT_Reference_Face                                                  */
   /*    FT_New_Memory_Face                                                 */
+  /*    FT_Face_Properties                                                 */
   /*    FT_Open_Face                                                       */
   /*    FT_Open_Args                                                       */
   /*    FT_Parameter                                                       */
@@ -266,8 +269,8 @@
   /*    FT_Glyph_Metrics                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model the metrics of a single glyph.  The      */
-  /*    values are expressed in 26.6 fractional pixel format; if the flag  */
+  /*    A structure to model the metrics of a single glyph.  The values    */
+  /*    are expressed in 26.6 fractional pixel format; if the flag         */
   /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */
   /*    are expressed in font units instead.                               */
   /*                                                                       */
@@ -306,6 +309,11 @@
   /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */
   /*    values to account for the added width and height.                  */
   /*                                                                       */
+  /*    FreeType doesn't use the `VORG' table data for CFF fonts because   */
+  /*    it doesn't have an interface to quickly retrieve the glyph height. */
+  /*    The y~coordinate of the vertical origin can be simply computed as  */
+  /*    `vertBearingY + height' after loading a glyph.                     */
+  /*                                                                       */
   typedef struct  FT_Glyph_Metrics_
   {
     FT_Pos  width;
@@ -350,10 +358,10 @@
   /*                                                                       */
   /* <Note>                                                                */
   /*    Windows FNT:                                                       */
-  /*      The nominal size given in a FNT font is not reliable.  Thus when */
-  /*      the driver finds it incorrect, it sets `size' to some calculated */
-  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */
-  /*      height given in the font, respectively.                          */
+  /*      The nominal size given in a FNT font is not reliable.  If the    */
+  /*      driver finds it incorrect, it sets `size' to some calculated     */
+  /*      values, and `x_ppem' and `y_ppem' to the pixel width and height  */
+  /*      given in the font, respectively.                                 */
   /*                                                                       */
   /*    TrueType embedded bitmaps:                                         */
   /*      `size', `width', and `height' values are not contained in the    */
@@ -422,9 +430,9 @@
   /*    FT_Module                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given FreeType module object.  Each module can be a  */
+  /*    A handle to a given FreeType module object.  A module can be a     */
   /*    font driver, a renderer, or anything else that provides services   */
-  /*    to the formers.                                                    */
+  /*    to the former.                                                     */
   /*                                                                       */
   typedef struct FT_ModuleRec_*  FT_Module;
 
@@ -435,8 +443,8 @@
   /*    FT_Driver                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given FreeType font driver object.  Each font driver */
-  /*    is a special module capable of creating faces from font files.     */
+  /*    A handle to a given FreeType font driver object.  A font driver    */
+  /*    is a module capable of creating faces from font files.             */
   /*                                                                       */
   typedef struct FT_DriverRec_*  FT_Driver;
 
@@ -447,10 +455,10 @@
   /*    FT_Renderer                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given FreeType renderer.  A renderer is a special    */
-  /*    module in charge of converting a glyph image to a bitmap, when     */
-  /*    necessary.  Each renderer supports a given glyph image format, and */
-  /*    one or more target surface depths.                                 */
+  /*    A handle to a given FreeType renderer.  A renderer is a module in  */
+  /*    charge of converting a glyph's outline image to a bitmap.  It      */
+  /*    supports a single glyph image format, and one or more target       */
+  /*    surface depths.                                                    */
   /*                                                                       */
   typedef struct FT_RendererRec_*  FT_Renderer;
 
@@ -468,15 +476,15 @@
   /*    FT_Face                                                            */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given typographic face object.  A face object models */
-  /*    a given typeface, in a given style.                                */
+  /*    A handle to a typographic face object.  A face object models a     */
+  /*    given typeface, in a given style.                                  */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */
+  /*    A face object also owns a single @FT_GlyphSlot object, as well     */
   /*    as one or more @FT_Size objects.                                   */
   /*                                                                       */
   /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */
-  /*    a given filepathname or a custom input stream.                     */
+  /*    a given filepath or a custom input stream.                         */
   /*                                                                       */
   /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */
   /*                                                                       */
@@ -501,11 +509,11 @@
   /*    FT_Size                                                            */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to an object used to model a face scaled to a given       */
+  /*    A handle to an object that models a face scaled to a given         */
   /*    character size.                                                    */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */
+  /*    An @FT_Face has one _active_ @FT_Size object that is used by       */
   /*    functions like @FT_Load_Glyph to determine the scaling             */
   /*    transformation that in turn is used to load and hint glyphs and    */
   /*    metrics.                                                           */
@@ -532,9 +540,8 @@
   /*    FT_GlyphSlot                                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given `glyph slot'.  A slot is a container where it  */
-  /*    is possible to load any of the glyphs contained in its parent      */
-  /*    face.                                                              */
+  /*    A handle to a given `glyph slot'.  A slot is a container that can  */
+  /*    hold any of the glyphs contained in its parent face.               */
   /*                                                                       */
   /*    In other words, each time you call @FT_Load_Glyph or               */
   /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */
@@ -553,13 +560,14 @@
   /*    FT_CharMap                                                         */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A handle to a given character map.  A charmap is used to translate */
-  /*    character codes in a given encoding into glyph indexes for its     */
-  /*    parent's face.  Some font formats may provide several charmaps per */
-  /*    font.                                                              */
+  /*    A handle to a character map (usually abbreviated to `charmap').  A */
+  /*    charmap is used to translate character codes in a given encoding   */
+  /*    into glyph indexes for its parent's face.  Some font formats may   */
+  /*    provide several charmaps per font.                                 */
   /*                                                                       */
   /*    Each face object owns zero or more charmaps, but only one of them  */
-  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */
+  /*    can be `active', providing the data used by @FT_Get_Char_Index or  */
+  /*    @FT_Load_Char.                                                     */
   /*                                                                       */
   /*    The list of available charmaps in a face is available through the  */
   /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */
@@ -570,7 +578,8 @@
   /* <Note>                                                                */
   /*    When a new face is created (either through @FT_New_Face or         */
   /*    @FT_Open_Face), the library looks for a Unicode charmap within     */
-  /*    the list and automatically activates it.                           */
+  /*    the list and automatically activates it.  If there is no Unicode   */
+  /*    charmap, FreeType doesn't set an `active' charmap.                 */
   /*                                                                       */
   /* <Also>                                                                */
   /*    See @FT_CharMapRec for the publicly accessible fields of a given   */
@@ -616,8 +625,8 @@
   /*    FT_Encoding                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An enumeration used to specify character sets supported by         */
-  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */
+  /*    An enumeration to specify character sets supported by charmaps.    */
+  /*    Used in the @FT_Select_Charmap API function.                       */
   /*                                                                       */
   /* <Note>                                                                */
   /*    Despite the name, this enumeration lists specific character        */
@@ -631,19 +640,18 @@
   /*      The encoding value~0 is reserved.                                */
   /*                                                                       */
   /*    FT_ENCODING_UNICODE ::                                             */
-  /*      Corresponds to the Unicode character set.  This value covers     */
-  /*      all versions of the Unicode repertoire, including ASCII and      */
-  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */
-  /*      of them.                                                         */
+  /*      The Unicode character set.  This value covers all versions of    */
+  /*      the Unicode repertoire, including ASCII and Latin-1.  Most fonts */
+  /*      include a Unicode charmap, but not all of them.                  */
   /*                                                                       */
   /*      For example, if you want to access Unicode value U+1F028 (and    */
   /*      the font contains it), use value 0x1F028 as the input value for  */
   /*      @FT_Get_Char_Index.                                              */
   /*                                                                       */
   /*    FT_ENCODING_MS_SYMBOL ::                                           */
-  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */
-  /*      mathematical symbols and wingdings.  For more information, see   */
-  /*      `http://www.microsoft.com/typography/otspec/recom.htm',          */
+  /*      Microsoft Symbol encoding, used to encode mathematical symbols   */
+  /*      and wingdings.  For more information, see                        */
+  /*      `https://www.microsoft.com/typography/otspec/recom.htm',         */
   /*      `http://www.kostis.net/charsets/symbol.htm', and                 */
   /*      `http://www.kostis.net/charsets/wingding.htm'.                   */
   /*                                                                       */
@@ -651,60 +659,60 @@
   /*      Area) in the range U+F020-U+F0FF.                                */
   /*                                                                       */
   /*    FT_ENCODING_SJIS ::                                                */
-  /*      Corresponds to Japanese SJIS encoding.  More info at             */
-  /*      at `http://en.wikipedia.org/wiki/Shift_JIS'.                     */
-  /*      See note on multi-byte encodings below.                          */
+  /*      Shift JIS encoding for Japanese.  More info at                   */
+  /*      `https://en.wikipedia.org/wiki/Shift_JIS'.  See note on          */
+  /*      multi-byte encodings below.                                      */
   /*                                                                       */
-  /*    FT_ENCODING_GB2312 ::                                              */
-  /*      Corresponds to an encoding system for Simplified Chinese as used */
-  /*      used in mainland China.                                          */
+  /*    FT_ENCODING_PRC ::                                                 */
+  /*      Corresponds to encoding systems mainly for Simplified Chinese as */
+  /*      used in People's Republic of China (PRC).  The encoding layout   */
+  /*      is based on GB~2312 and its supersets GBK and GB~18030.          */
   /*                                                                       */
   /*    FT_ENCODING_BIG5 ::                                                */
   /*      Corresponds to an encoding system for Traditional Chinese as     */
   /*      used in Taiwan and Hong Kong.                                    */
   /*                                                                       */
   /*    FT_ENCODING_WANSUNG ::                                             */
-  /*      Corresponds to the Korean encoding system known as Wansung.      */
+  /*      Corresponds to the Korean encoding system known as Extended      */
+  /*      Wansung (MS Windows code page 949).                              */
   /*      For more information see                                         */
-  /*      `https://msdn.microsoft.com/en-US/goglobal/cc305154'.            */
+  /*      `https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. */
   /*                                                                       */
   /*    FT_ENCODING_JOHAB ::                                               */
   /*      The Korean standard character set (KS~C 5601-1992), which        */
   /*      corresponds to MS Windows code page 1361.  This character set    */
-  /*      includes all possible Hangeul character combinations.            */
+  /*      includes all possible Hangul character combinations.             */
   /*                                                                       */
   /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */
   /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */
   /*      PostScript font.  It is limited to 256 character codes.          */
   /*                                                                       */
   /*    FT_ENCODING_ADOBE_STANDARD ::                                      */
-  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */
-  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
-  /*      codes.                                                           */
+  /*      Adobe Standard encoding, as found in Type~1, CFF, and            */
+  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */
   /*                                                                       */
   /*    FT_ENCODING_ADOBE_EXPERT ::                                        */
-  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */
-  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
-  /*      codes.                                                           */
+  /*      Adobe Expert encoding, as found in Type~1, CFF, and OpenType/CFF */
+  /*      fonts.  It is limited to 256 character codes.                    */
   /*                                                                       */
   /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */
   /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */
   /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */
   /*                                                                       */
   /*    FT_ENCODING_APPLE_ROMAN ::                                         */
-  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */
-  /*      and OpenType fonts contain a charmap for this encoding, since    */
-  /*      older versions of Mac OS are able to use it.                     */
+  /*      Apple roman encoding.  Many TrueType and OpenType fonts contain  */
+  /*      a charmap for this 8-bit encoding, since older versions of Mac   */
+  /*      OS are able to use it.                                           */
   /*                                                                       */
   /*    FT_ENCODING_OLD_LATIN_2 ::                                         */
-  /*      This value is deprecated and was never used nor reported by      */
+  /*      This value is deprecated and was neither used nor reported by    */
   /*      FreeType.  Don't use or test for it.                             */
   /*                                                                       */
   /*    FT_ENCODING_MS_SJIS ::                                             */
   /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */
   /*                                                                       */
   /*    FT_ENCODING_MS_GB2312 ::                                           */
-  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */
+  /*      Same as FT_ENCODING_PRC.  Deprecated.                            */
   /*                                                                       */
   /*    FT_ENCODING_MS_BIG5 ::                                             */
   /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */
@@ -716,11 +724,12 @@
   /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    By default, FreeType automatically synthesizes a Unicode charmap   */
-  /*    for PostScript fonts, using their glyph names dictionaries.        */
-  /*    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.                                                    */
+  /*    By default, FreeType enables a Unicode charmap and tags it with    */
+  /*    FT_ENCODING_UNICODE when it is either provided or can be generated */
+  /*    from PostScript glyph name dictionaries in the font file.          */
+  /*    All other encodings are considered legacy and tagged only if       */
+  /*    explicitly defined in the font file.  Otherwise, FT_ENCODING_NONE  */
+  /*    is used.                                                           */
   /*                                                                       */
   /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */
   /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */
@@ -737,21 +746,21 @@
   /*    Russian).                                                          */
   /*                                                                       */
   /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
-  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */
+  /*    and `encoding_id' is not `TT_MAC_ID_ROMAN' (otherwise it is set to */
   /*    FT_ENCODING_APPLE_ROMAN).                                          */
   /*                                                                       */
   /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */
   /*    @FT_Get_CMap_Language_ID to query the Mac language ID that may     */
   /*    be needed to be able to distinguish Apple encoding variants.  See  */
   /*                                                                       */
-  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt  */
+  /*      https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt */
   /*                                                                       */
   /*    to get an idea how to do that.  Basically, if the language ID      */
   /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */
   /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */
-  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */
+  /*    `TT_MAC_ID_ROMAN' and the language ID (minus~1) is                 */
   /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */
-  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */
+  /*    `TT_MAC_ID_ARABIC' with `TT_MAC_LANGID_FARSI' means the Farsi      */
   /*    variant the Arabic encoding.                                       */
   /*                                                                       */
   typedef enum  FT_Encoding_
@@ -762,14 +771,15 @@
     FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),
 
     FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),
-    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),
+    FT_ENC_TAG( FT_ENCODING_PRC,     'g', 'b', ' ', ' ' ),
     FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),
     FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
     FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),
 
-    /* for backwards compatibility */
+    /* for backward compatibility */
+    FT_ENCODING_GB2312     = FT_ENCODING_PRC,
     FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,
-    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,
+    FT_ENCODING_MS_GB2312  = FT_ENCODING_PRC,
     FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,
     FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
     FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,
@@ -794,7 +804,7 @@
 #define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1
 #define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2
 #define ft_encoding_sjis            FT_ENCODING_SJIS
-#define ft_encoding_gb2312          FT_ENCODING_GB2312
+#define ft_encoding_gb2312          FT_ENCODING_PRC
 #define ft_encoding_big5            FT_ENCODING_BIG5
 #define ft_encoding_wansung         FT_ENCODING_WANSUNG
 #define ft_encoding_johab           FT_ENCODING_JOHAB
@@ -821,11 +831,11 @@
   /*                                                                       */
   /*    platform_id :: An ID number describing the platform for the        */
   /*                   following encoding ID.  This comes directly from    */
-  /*                   the TrueType specification and should be emulated   */
-  /*                   for other formats.                                  */
+  /*                   the TrueType specification and gets emulated for    */
+  /*                   other formats.                                      */
   /*                                                                       */
   /*    encoding_id :: A platform specific encoding number.  This also     */
-  /*                   comes from the TrueType specification and should be */
+  /*                   comes from the TrueType specification and gets      */
   /*                   emulated similarly.                                 */
   /*                                                                       */
   typedef struct  FT_CharMapRec_
@@ -853,8 +863,8 @@
   /*    FT_Face_Internal                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */
-  /*    model private data of a given @FT_Face object.                     */
+  /*    An opaque handle to an `FT_Face_InternalRec' structure that models */
+  /*    the private data of a given @FT_Face object.                       */
   /*                                                                       */
   /*    This structure might change between releases of FreeType~2 and is  */
   /*    not generally available to client applications.                    */
@@ -874,27 +884,58 @@
   /* <Fields>                                                              */
   /*    num_faces           :: The number of faces in the font file.  Some */
   /*                           font formats can have multiple faces in     */
-  /*                           a font file.                                */
+  /*                           a single font file.                         */
   /*                                                                       */
-  /*    face_index          :: The index of the face in the font file.  It */
-  /*                           is set to~0 if there is only one face in    */
+  /*    face_index          :: This field holds two different values.      */
+  /*                           Bits 0-15 are the index of the face in the  */
+  /*                           font file (starting with value~0).  They    */
+  /*                           are set to~0 if there is only one face in   */
   /*                           the font file.                              */
   /*                                                                       */
+  /*                           [Since 2.6.1] Bits 16-30 are relevant to GX */
+  /*                           and OpenType variation fonts only, holding  */
+  /*                           the named instance index for the current    */
+  /*                           face index (starting with value~1; value~0  */
+  /*                           indicates font access without a named       */
+  /*                           instance).  For non-variation fonts, bits   */
+  /*                           16-30 are ignored.  If we have the third    */
+  /*                           named instance of face~4, say, `face_index' */
+  /*                           is set to 0x00030004.                       */
+  /*                                                                       */
+  /*                           Bit 31 is always zero (this is,             */
+  /*                           `face_index' is always a positive value).   */
+  /*                                                                       */
+  /*                           [Since 2.9] Changing the design coordinates */
+  /*                           with @FT_Set_Var_Design_Coordinates or      */
+  /*                           @FT_Set_Var_Blend_Coordinates does not      */
+  /*                           influence the named instance index value    */
+  /*                           (only @FT_Set_Named_Instance does that).    */
+  /*                                                                       */
   /*    face_flags          :: A set of bit flags that give important      */
   /*                           information about the face; see             */
   /*                           @FT_FACE_FLAG_XXX for the details.          */
   /*                                                                       */
-  /*    style_flags         :: A set of bit flags indicating the style of  */
-  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */
-  /*                           details.                                    */
+  /*    style_flags         :: The lower 16~bits contain a set of bit      */
+  /*                           flags indicating the style of the face; see */
+  /*                           @FT_STYLE_FLAG_XXX for the details.         */
+  /*                                                                       */
+  /*                           [Since 2.6.1] Bits 16-30 hold the number    */
+  /*                           of named instances available for the        */
+  /*                           current face if we have a GX or OpenType    */
+  /*                           variation (sub)font.  Bit 31 is always zero */
+  /*                           (this is, `style_flags' is always a         */
+  /*                           positive value).  Note that a variation     */
+  /*                           font has always at least one named          */
+  /*                           instance, namely the default instance.      */
   /*                                                                       */
   /*    num_glyphs          :: The number of glyphs in the face.  If the   */
   /*                           face is scalable and has sbits (see         */
   /*                           `num_fixed_sizes'), it is set to the number */
   /*                           of outline glyphs.                          */
   /*                                                                       */
-  /*                           For CID-keyed fonts, this value gives the   */
-  /*                           highest CID used in the font.               */
+  /*                           For CID-keyed fonts (not in an SFNT         */
+  /*                           wrapper) this value gives the highest CID   */
+  /*                           used in the font.                           */
   /*                                                                       */
   /*    family_name         :: The face's family name.  This is an ASCII   */
   /*                           string, usually in English, that describes  */
@@ -933,6 +974,10 @@
   /*                           strikes in the face.  It is set to NULL if  */
   /*                           there is no bitmap strike.                  */
   /*                                                                       */
+  /*                           Note that FreeType tries to sanitize the    */
+  /*                           strike data since they are sometimes sloppy */
+  /*                           or incorrect, but this can easily fail.     */
+  /*                                                                       */
   /*    num_charmaps        :: The number of charmaps in the face.         */
   /*                                                                       */
   /*    charmaps            :: An array of the charmaps of the face.       */
@@ -968,8 +1013,8 @@
   /*                           expressed in font units.  For font formats  */
   /*                           not having this information, it is set to   */
   /*                           `bbox.yMin'.  Note that this field is       */
-  /*                           usually negative.  Only relevant for        */
-  /*                           scalable formats.                           */
+  /*                           negative for values below the baseline.     */
+  /*                           Only relevant for scalable formats.         */
   /*                                                                       */
   /*    height              :: This value is the vertical distance         */
   /*                           between two consecutive baselines,          */
@@ -1012,6 +1057,15 @@
   /*    Fields may be changed after a call to @FT_Attach_File or           */
   /*    @FT_Attach_Stream.                                                 */
   /*                                                                       */
+  /*    For an OpenType variation font, the values of the following fields */
+  /*    can change after a call to @FT_Set_Var_Design_Coordinates (and     */
+  /*    friends) if the font contains an `MVAR' table: `ascender',         */
+  /*    `descender', `height', `underline_position', and                   */
+  /*    `underline_thickness'.                                             */
+  /*                                                                       */
+  /*    Especially for TrueType fonts see also the documentation for       */
+  /*    @FT_Size_Metrics.                                                  */
+  /*                                                                       */
   typedef struct  FT_FaceRec_
   {
     FT_Long           num_faces;
@@ -1083,49 +1137,51 @@
   /*                                                                       */
   /* <Values>                                                              */
   /*    FT_FACE_FLAG_SCALABLE ::                                           */
-  /*      Indicates that the face contains outline glyphs.  This doesn't   */
-  /*      prevent bitmap strikes, i.e., a face can have both this and      */
-  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */
+  /*      The face contains outline glyphs.  Note that a face can contain  */
+  /*      bitmap strikes also, i.e., a face can have both this flag and    */
+  /*      @FT_FACE_FLAG_FIXED_SIZES set.                                   */
   /*                                                                       */
   /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */
-  /*      Indicates that the face contains bitmap strikes.  See also the   */
+  /*      The face contains bitmap strikes.  See also the                  */
   /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */
   /*                                                                       */
   /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */
-  /*      Indicates that the face contains fixed-width characters (like    */
-  /*      Courier, Lucido, MonoType, etc.).                                */
+  /*      The face contains fixed-width characters (like Courier, Lucida,  */
+  /*      MonoType, etc.).                                                 */
   /*                                                                       */
   /*    FT_FACE_FLAG_SFNT ::                                               */
-  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */
-  /*      now, this means TrueType and OpenType.                           */
+  /*      The face uses the SFNT storage scheme.  For now, this means      */
+  /*      TrueType and OpenType.                                           */
   /*                                                                       */
   /*    FT_FACE_FLAG_HORIZONTAL ::                                         */
-  /*      Indicates that the face contains horizontal glyph metrics.  This */
-  /*      should be set for all common formats.                            */
+  /*      The face contains horizontal glyph metrics.  This should be set  */
+  /*      for all common formats.                                          */
   /*                                                                       */
   /*    FT_FACE_FLAG_VERTICAL ::                                           */
-  /*      Indicates that the face contains vertical glyph metrics.  This   */
-  /*      is only available in some formats, not all of them.              */
+  /*      The face contains vertical glyph metrics.  This is only          */
+  /*      available in some formats, not all of them.                      */
   /*                                                                       */
   /*    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.  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).       */
+  /*      The face contains kerning information.  If set, the kerning      */
+  /*      distance can be retrieved using the function @FT_Get_Kerning.    */
+  /*      Otherwise the function always return the vector (0,0).  Note     */
+  /*      that FreeType doesn't handle kerning data from the SFNT `GPOS'   */
+  /*      table (as present in many OpenType fonts).                       */
   /*                                                                       */
   /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */
   /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */
   /*                                                                       */
   /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */
-  /*      Indicates that the font contains multiple masters and is capable */
-  /*      of interpolating between them.  See the multiple-masters         */
-  /*      specific API for details.                                        */
+  /*      The face contains multiple masters and is capable of             */
+  /*      interpolating between them.  Supported formats are Adobe MM,     */
+  /*      TrueType GX, and OpenType variation fonts.                       */
+  /*                                                                       */
+  /*      See section @multiple_masters for API details.                   */
   /*                                                                       */
   /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */
-  /*      Indicates that the font contains glyph names that can be         */
-  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */
-  /*      fonts contain broken glyph name tables.  Use the function        */
+  /*      The face contains glyph names, which can be retrieved using      */
+  /*      @FT_Get_Glyph_Name.  Note that some TrueType fonts contain       */
+  /*      broken glyph name tables.  Use the function                      */
   /*      @FT_Has_PS_Glyph_Names when needed.                              */
   /*                                                                       */
   /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */
@@ -1134,31 +1190,31 @@
   /*      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.         */
+  /*      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.               */
   /*                                                                       */
   /*    FT_FACE_FLAG_CID_KEYED ::                                          */
-  /*      Set if the font is CID-keyed.  In that case, the font is not     */
-  /*      accessed by glyph indices but by CID values.  For subsetted      */
-  /*      CID-keyed fonts this has the consequence that not all index      */
-  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */
-  /*      values for which corresponding glyphs in the subsetted font      */
-  /*      exist make FT_Load_Glyph return successfully; in all other cases */
-  /*      you get an `FT_Err_Invalid_Argument' error.                      */
+  /*      The face is CID-keyed.  In that case, the face is not accessed   */
+  /*      by glyph indices but by CID values.  For subsetted CID-keyed     */
+  /*      fonts this has the consequence that not all index values are a   */
+  /*      valid argument to @FT_Load_Glyph.  Only the CID values for which */
+  /*      corresponding glyphs in the subsetted font exist make            */
+  /*      `FT_Load_Glyph' return successfully; in all other cases you get  */
+  /*      an `FT_Err_Invalid_Argument' error.                              */
   /*                                                                       */
-  /*      Note that CID-keyed fonts that are in an SFNT wrapper don't      */
-  /*      have this flag set since the glyphs are accessed in the normal   */
-  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */
-  /*      the application.                                                 */
+  /*      Note that CID-keyed fonts that are in an SFNT wrapper (this is,  */
+  /*      all OpenType/CFF fonts) don't have this flag set since the       */
+  /*      glyphs are accessed in the normal way (using contiguous          */
+  /*      indices); the `CID-ness' isn't visible to the application.       */
   /*                                                                       */
   /*    FT_FACE_FLAG_TRICKY ::                                             */
-  /*      Set if the font is `tricky', this is, it always needs the        */
-  /*      font format's native hinting engine to get a reasonable result.  */
-  /*      A typical example is the Chinese font `mingli.ttf' that uses     */
-  /*      TrueType bytecode instructions to move and scale all of its      */
-  /*      subglyphs.                                                       */
+  /*      The face is `tricky', this is, it always needs the font format's */
+  /*      native hinting engine to get a reasonable result.  A typical     */
+  /*      example is the old Chinese font `mingli.ttf' (but not            */
+  /*      `mingliu.ttc') that uses TrueType bytecode instructions to move  */
+  /*      and scale all of its subglyphs.                                  */
   /*                                                                       */
   /*      It is not possible to auto-hint such fonts using                 */
   /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */
@@ -1170,8 +1226,15 @@
   /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */
   /*                                                                       */
   /*    FT_FACE_FLAG_COLOR ::                                              */
-  /*      Set if the font has color glyph tables.  To access color glyphs  */
-  /*      use @FT_LOAD_COLOR.                                              */
+  /*      [Since 2.5.1] The face has color glyph tables.  To access color  */
+  /*      glyphs use @FT_LOAD_COLOR.                                       */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_VARIATION ::                                          */
+  /*      [Since 2.9] Set if the current face (or named instance) has been */
+  /*      altered with @FT_Set_MM_Design_Coordinates,                      */
+  /*      @FT_Set_Var_Design_Coordinates, or                               */
+  /*      @FT_Set_Var_Blend_Coordinates.  This flag is unset by a call to  */
+  /*      @FT_Set_Named_Instance.                                          */
   /*                                                                       */
 #define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
 #define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
@@ -1188,6 +1251,7 @@
 #define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
 #define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
 #define FT_FACE_FLAG_COLOR             ( 1L << 14 )
+#define FT_FACE_FLAG_VARIATION         ( 1L << 15 )
 
 
   /*************************************************************************
@@ -1204,7 +1268,7 @@
    *
    */
 #define FT_HAS_HORIZONTAL( face ) \
-          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+          ( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL )
 
 
   /*************************************************************************
@@ -1218,7 +1282,7 @@
    *
    */
 #define FT_HAS_VERTICAL( face ) \
-          ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+          ( (face)->face_flags & FT_FACE_FLAG_VERTICAL )
 
 
   /*************************************************************************
@@ -1232,7 +1296,7 @@
    *
    */
 #define FT_HAS_KERNING( face ) \
-          ( face->face_flags & FT_FACE_FLAG_KERNING )
+          ( (face)->face_flags & FT_FACE_FLAG_KERNING )
 
 
   /*************************************************************************
@@ -1243,11 +1307,11 @@
    * @description:
    *   A macro that returns true whenever a face object contains a scalable
    *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
-   *   and PFR font formats.
+   *   and PFR font formats).
    *
    */
 #define FT_IS_SCALABLE( face ) \
-          ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+          ( (face)->face_flags & FT_FACE_FLAG_SCALABLE )
 
 
   /*************************************************************************
@@ -1266,7 +1330,7 @@
    *
    */
 #define FT_IS_SFNT( face ) \
-          ( face->face_flags & FT_FACE_FLAG_SFNT )
+          ( (face)->face_flags & FT_FACE_FLAG_SFNT )
 
 
   /*************************************************************************
@@ -1281,7 +1345,7 @@
    *
    */
 #define FT_IS_FIXED_WIDTH( face ) \
-          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+          ( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
 
 
   /*************************************************************************
@@ -1296,7 +1360,7 @@
    *
    */
 #define FT_HAS_FIXED_SIZES( face ) \
-          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+          ( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES )
 
 
   /*************************************************************************
@@ -1322,7 +1386,7 @@
    *
    */
 #define FT_HAS_GLYPH_NAMES( face ) \
-          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+          ( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
 
 
   /*************************************************************************
@@ -1337,7 +1401,47 @@
    *
    */
 #define FT_HAS_MULTIPLE_MASTERS( face ) \
-          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+          ( (face)->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_NAMED_INSTANCE( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object is a named instance
+   *   of a GX or OpenType variation font.
+   *
+   *   [Since 2.9] Changing the design coordinates with
+   *   @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does
+   *   not influence the return value of this macro (only
+   *   @FT_Set_Named_Instance does that).
+   *
+   * @since:
+   *   2.7
+   *
+   */
+#define FT_IS_NAMED_INSTANCE( face ) \
+          ( (face)->face_index & 0x7FFF0000L )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_VARIATION( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object has been altered
+   *   by @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or
+   *   @FT_Set_Var_Blend_Coordinates.
+   *
+   * @since:
+   *   2.9
+   *
+   */
+#define FT_IS_VARIATION( face ) \
+          ( (face)->face_flags & FT_FACE_FLAG_VARIATION )
 
 
   /*************************************************************************
@@ -1355,7 +1459,7 @@
    *
    */
 #define FT_IS_CID_KEYED( face ) \
-          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+          ( (face)->face_flags & FT_FACE_FLAG_CID_KEYED )
 
 
   /*************************************************************************
@@ -1369,7 +1473,7 @@
    *
    */
 #define FT_IS_TRICKY( face ) \
-          ( face->face_flags & FT_FACE_FLAG_TRICKY )
+          ( (face)->face_flags & FT_FACE_FLAG_TRICKY )
 
 
   /*************************************************************************
@@ -1381,9 +1485,12 @@
    *   A macro that returns true whenever a face object contains
    *   tables for color glyphs.
    *
+   * @since:
+   *   2.5.1
+   *
    */
 #define FT_HAS_COLOR( face ) \
-          ( face->face_flags & FT_FACE_FLAG_COLOR )
+          ( (face)->face_flags & FT_FACE_FLAG_COLOR )
 
 
   /*************************************************************************/
@@ -1392,15 +1499,15 @@
   /*    FT_STYLE_FLAG_XXX                                                  */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A list of bit-flags used to indicate the style of a given face.    */
-  /*    These are used in the `style_flags' field of @FT_FaceRec.          */
+  /*    A list of bit flags to indicate the style of a given face.  These  */
+  /*    are used in the `style_flags' field of @FT_FaceRec.                */
   /*                                                                       */
   /* <Values>                                                              */
   /*    FT_STYLE_FLAG_ITALIC ::                                            */
-  /*      Indicates that a given face style is italic or oblique.          */
+  /*      The face style is italic or oblique.                             */
   /*                                                                       */
   /*    FT_STYLE_FLAG_BOLD ::                                              */
-  /*      Indicates that a given face is bold.                             */
+  /*      The face is bold.                                                */
   /*                                                                       */
   /* <Note>                                                                */
   /*    The style information as provided by FreeType is very basic.  More */
@@ -1441,43 +1548,93 @@
   /*                    hence the term `ppem' (pixels per EM).  It is also */
   /*                    referred to as `nominal height'.                   */
   /*                                                                       */
-  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*    x_scale      :: A 16.16 fractional scaling value to convert        */
   /*                    horizontal metrics from font units to 26.6         */
   /*                    fractional pixels.  Only relevant for scalable     */
   /*                    font formats.                                      */
   /*                                                                       */
-  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*    y_scale      :: A 16.16 fractional scaling value to convert        */
   /*                    vertical metrics from font units to 26.6           */
   /*                    fractional pixels.  Only relevant for scalable     */
   /*                    font formats.                                      */
   /*                                                                       */
-  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */
-  /*                    @FT_FaceRec for the details.                       */
+  /*    ascender     :: The ascender in 26.6 fractional pixels, rounded up */
+  /*                    to an integer value.  See @FT_FaceRec for the      */
+  /*                    details.                                           */
   /*                                                                       */
-  /*    descender    :: The descender in 26.6 fractional pixels.  See      */
-  /*                    @FT_FaceRec for the details.                       */
+  /*    descender    :: The descender in 26.6 fractional pixels, rounded   */
+  /*                    down to an integer value.  See @FT_FaceRec for the */
+  /*                    details.                                           */
   /*                                                                       */
-  /*    height       :: The height in 26.6 fractional pixels.  See         */
-  /*                    @FT_FaceRec for the details.                       */
+  /*    height       :: The height in 26.6 fractional pixels, rounded to   */
+  /*                    an integer value.  See @FT_FaceRec for the         */
+  /*                    details.                                           */
   /*                                                                       */
   /*    max_advance  :: The maximum advance width in 26.6 fractional       */
-  /*                    pixels.  See @FT_FaceRec for the details.          */
+  /*                    pixels, rounded to an integer value.  See          */
+  /*                    @FT_FaceRec for the details.                       */
   /*                                                                       */
   /* <Note>                                                                */
   /*    The scaling values, if relevant, are determined first during a     */
   /*    size changing operation.  The remaining fields are then set by the */
   /*    driver.  For scalable formats, they are usually set to scaled      */
-  /*    values of the corresponding fields in @FT_FaceRec.                 */
+  /*    values of the corresponding fields in @FT_FaceRec.  Some values    */
+  /*    like ascender or descender are rounded for historical reasons;     */
+  /*    more precise values (for outline fonts) can be derived by scaling  */
+  /*    the corresponding @FT_FaceRec values manually, with code similar   */
+  /*    to the following.                                                  */
   /*                                                                       */
-  /*    Note that due to glyph hinting, these values might not be exact    */
-  /*    for certain fonts.  Thus they must be treated as unreliable        */
-  /*    with an error margin of at least one pixel!                        */
+  /*    {                                                                  */
+  /*      scaled_ascender = FT_MulFix( face->ascender,                     */
+  /*                                   size_metrics->y_scale );            */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note that due to glyph hinting and the selected rendering mode     */
+  /*    these values are usually not exact; consequently, they must be     */
+  /*    treated as unreliable with an error margin of at least one pixel!  */
   /*                                                                       */
   /*    Indeed, the only way to get the exact metrics is to render _all_   */
   /*    glyphs.  As this would be a definite performance hit, it is up to  */
   /*    client applications to perform such computations.                  */
   /*                                                                       */
-  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */
+  /*    The `FT_Size_Metrics' structure is valid for bitmap fonts also.    */
+  /*                                                                       */
+  /*                                                                       */
+  /*    *TrueType* *fonts* *with* *native* *bytecode* *hinting*            */
+  /*                                                                       */
+  /*    All applications that handle TrueType fonts with native hinting    */
+  /*    must be aware that TTFs expect different rounding of vertical font */
+  /*    dimensions.  The application has to cater for this, especially if  */
+  /*    it wants to rely on a TTF's vertical data (for example, to         */
+  /*    properly align box characters vertically).                         */
+  /*                                                                       */
+  /*    Only the application knows _in_ _advance_ that it is going to use  */
+  /*    native hinting for TTFs!  FreeType, on the other hand, selects the */
+  /*    hinting mode not at the time of creating an @FT_Size object but    */
+  /*    much later, namely while calling @FT_Load_Glyph.                   */
+  /*                                                                       */
+  /*    Here is some pseudo code that illustrates a possible solution.     */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      font_format = FT_Get_Font_Format( face );                        */
+  /*                                                                       */
+  /*      if ( !strcmp( font_format, "TrueType" ) &&                       */
+  /*           do_native_bytecode_hinting         )                        */
+  /*      {                                                                */
+  /*        ascender  = ROUND( FT_MulFix( face->ascender,                  */
+  /*                                      size_metrics->y_scale ) );       */
+  /*        descender = ROUND( FT_MulFix( face->descender,                 */
+  /*                                      size_metrics->y_scale ) );       */
+  /*      }                                                                */
+  /*      else                                                             */
+  /*      {                                                                */
+  /*        ascender  = size_metrics->ascender;                            */
+  /*        descender = size_metrics->descender;                           */
+  /*      }                                                                */
+  /*                                                                       */
+  /*      height      = size_metrics->height;                              */
+  /*      max_advance = size_metrics->max_advance;                         */
+  /*    }                                                                  */
   /*                                                                       */
   typedef struct  FT_Size_Metrics_
   {
@@ -1617,32 +1774,27 @@
   /*                         contained in the glyph slot.  Typically       */
   /*                         @FT_GLYPH_FORMAT_BITMAP,                      */
   /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */
-  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */
-  /*                         possible.                                     */
+  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but other values  */
+  /*                         are possible.                                 */
   /*                                                                       */
-  /*    bitmap            :: This field is used as a bitmap descriptor     */
-  /*                         when the slot format is                       */
-  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */
-  /*                         address and content of the bitmap buffer can  */
-  /*                         change between calls of @FT_Load_Glyph and a  */
-  /*                         few other functions.                          */
+  /*    bitmap            :: This field is used as a bitmap descriptor.    */
+  /*                         Note that the address and content of the      */
+  /*                         bitmap buffer can change between calls of     */
+  /*                         @FT_Load_Glyph and a few other functions.     */
   /*                                                                       */
   /*    bitmap_left       :: The bitmap's left bearing expressed in        */
-  /*                         integer pixels.  Only valid if the format is  */
-  /*                         @FT_GLYPH_FORMAT_BITMAP, this is, if the      */
-  /*                         glyph slot contains a bitmap.                 */
+  /*                         integer pixels.                               */
   /*                                                                       */
   /*    bitmap_top        :: The bitmap's top bearing expressed in integer */
-  /*                         pixels.  Remember that this is the distance   */
-  /*                         from the baseline to the top-most glyph       */
-  /*                         scanline, upwards y~coordinates being         */
-  /*                         *positive*.                                   */
+  /*                         pixels.  This is the distance from the        */
+  /*                         baseline to the top-most glyph scanline,      */
+  /*                         upwards y~coordinates being *positive*.       */
   /*                                                                       */
   /*    outline           :: The outline descriptor for the current glyph  */
   /*                         image if its format is                        */
   /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */
   /*                         loaded, `outline' can be transformed,         */
-  /*                         distorted, embolded, etc.  However, it must   */
+  /*                         distorted, emboldened, etc.  However, it must */
   /*                         not be freed.                                 */
   /*                                                                       */
   /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */
@@ -1658,15 +1810,13 @@
   /*    control_data      :: Certain font drivers can also return the      */
   /*                         control data for a given glyph image (e.g.    */
   /*                         TrueType bytecode, Type~1 charstrings, etc.). */
-  /*                         This field is a pointer to such data.         */
+  /*                         This field is a pointer to such data; it is   */
+  /*                         currently internal to FreeType.               */
   /*                                                                       */
   /*    control_len       :: This is the length in bytes of the control    */
-  /*                         data.                                         */
+  /*                         data.  Currently internal to FreeType.        */
   /*                                                                       */
-  /*    other             :: Really wicked formats can use this pointer to */
-  /*                         present their own glyph image to client       */
-  /*                         applications.  Note that the application      */
-  /*                         needs to know about the image format.         */
+  /*    other             :: Reserved.                                     */
   /*                                                                       */
   /*    lsb_delta         :: The difference between hinted and unhinted    */
   /*                         left side bearing while auto-hinting is       */
@@ -1680,10 +1830,12 @@
   /*    If @FT_Load_Glyph is called with default flags (see                */
   /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */
   /*    its native format (e.g., an outline glyph for TrueType and Type~1  */
-  /*    formats).                                                          */
+  /*    formats).  [Since 2.9] The prospective bitmap metrics are          */
+  /*    calculated according to @FT_LOAD_TARGET_XXX and other flags even   */
+  /*    for the outline glyph, even if @FT_LOAD_RENDER is not set.         */
   /*                                                                       */
   /*    This image can later be converted into a bitmap by calling         */
-  /*    @FT_Render_Glyph.  This function finds the current renderer for    */
+  /*    @FT_Render_Glyph.  This function searches the current renderer for */
   /*    the native image's format, then invokes it.                        */
   /*                                                                       */
   /*    The renderer is in charge of transforming the native image through */
@@ -1695,34 +1847,65 @@
   /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */
   /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */
   /*                                                                       */
-  /* <Note>                                                                */
   /*    Here is a small pseudo code fragment that shows how to use         */
-  /*    `lsb_delta' and `rsb_delta':                                       */
+  /*    `lsb_delta' and `rsb_delta' to do fractional positioning of        */
+  /*    glyphs:                                                            */
   /*                                                                       */
   /*    {                                                                  */
-  /*      FT_Pos  origin_x       = 0;                                      */
-  /*      FT_Pos  prev_rsb_delta = 0;                                      */
+  /*      FT_GlyphSlot  slot     = face->glyph;                            */
+  /*      FT_Pos        origin_x = 0;                                      */
   /*                                                                       */
   /*                                                                       */
   /*      for all glyphs do                                                */
-  /*        <compute kern between current and previous glyph and add it to */
-  /*         `origin_x'>                                                   */
-  /*                                                                       */
   /*        <load glyph with `FT_Load_Glyph'>                              */
   /*                                                                       */
-  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */
-  /*          origin_x -= 64;                                              */
-  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */
-  /*          origin_x += 64;                                              */
-  /*                                                                       */
-  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */
+  /*        FT_Outline_Translate( slot->outline, origin_x & 63, 0 );       */
   /*                                                                       */
   /*        <save glyph image, or render glyph, or ...>                    */
   /*                                                                       */
-  /*        origin_x += face->glyph->advance.x;                            */
+  /*        <compute kern between current and next glyph                   */
+  /*         and add it to `origin_x'>                                     */
+  /*                                                                       */
+  /*        origin_x += slot->advance.x;                                   */
+  /*        origin_x += slot->rsb_delta - slot->lsb_delta;                 */
   /*      endfor                                                           */
   /*    }                                                                  */
   /*                                                                       */
+  /*    Here is another small pseudo code fragment that shows how to use   */
+  /*    `lsb_delta' and `rsb_delta' to improve integer positioning of      */
+  /*    glyphs:                                                            */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_GlyphSlot  slot           = face->glyph;                      */
+  /*      FT_Pos        origin_x       = 0;                                */
+  /*      FT_Pos        prev_rsb_delta = 0;                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      for all glyphs do                                                */
+  /*        <compute kern between current and previous glyph               */
+  /*         and add it to `origin_x'>                                     */
+  /*                                                                       */
+  /*        <load glyph with `FT_Load_Glyph'>                              */
+  /*                                                                       */
+  /*        if ( prev_rsb_delta - slot->lsb_delta >  32 )                  */
+  /*          origin_x -= 64;                                              */
+  /*        else if ( prev_rsb_delta - slot->lsb_delta < -31 )             */
+  /*          origin_x += 64;                                              */
+  /*                                                                       */
+  /*        prev_rsb_delta = slot->rsb_delta;                              */
+  /*                                                                       */
+  /*        <save glyph image, or render glyph, or ...>                    */
+  /*                                                                       */
+  /*        origin_x += slot->advance.x;                                   */
+  /*      endfor                                                           */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    If you use strong auto-hinting, you *must* apply these delta       */
+  /*    values!  Otherwise you will experience far too large inter-glyph   */
+  /*    spacing at small rendering sizes in most cases.  Note that it      */
+  /*    doesn't harm to use the above code for other hinting modes also,   */
+  /*    since the delta values are zero then.                              */
+  /*                                                                       */
   typedef struct  FT_GlyphSlotRec_
   {
     FT_Library        library;
@@ -1787,7 +1970,8 @@
   /* <Note>                                                                */
   /*    In case you want to provide your own memory allocating routines,   */
   /*    use @FT_New_Library instead, followed by a call to                 */
-  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */
+  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module)   */
+  /*    and @FT_Set_Default_Properties.                                    */
   /*                                                                       */
   /*    See the documentation of @FT_Library and @FT_Face for              */
   /*    multi-threading issues.                                            */
@@ -1795,6 +1979,11 @@
   /*    If you need reference-counting (cf. @FT_Reference_Library), use    */
   /*    @FT_New_Library and @FT_Done_Library.                              */
   /*                                                                       */
+  /*    If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is   */
+  /*    set, this function reads the `FREETYPE_PROPERTIES' environment     */
+  /*    variable to control driver properties.  See section @properties    */
+  /*    for more.                                                          */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Init_FreeType( FT_Library  *alibrary );
 
@@ -1824,7 +2013,7 @@
   /*    FT_OPEN_XXX                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A list of bit-field constants used within the `flags' field of the */
+  /*    A list of bit field constants used within the `flags' field of the */
   /*    @FT_Open_Args structure.                                           */
   /*                                                                       */
   /* <Values>                                                              */
@@ -1865,8 +2054,8 @@
   /*    FT_Parameter                                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A simple structure used to pass more or less generic parameters to */
-  /*    @FT_Open_Face.                                                     */
+  /*    A simple structure to pass more or less generic parameters to      */
+  /*    @FT_Open_Face and @FT_Face_Properties.                             */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    tag  :: A four-byte identification tag.                            */
@@ -1874,8 +2063,8 @@
   /*    data :: A pointer to the parameter data.                           */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    The ID and function of parameters are driver-specific.  See the    */
-  /*    various FT_PARAM_TAG_XXX flags for more information.               */
+  /*    The ID and function of parameters are driver-specific.  See        */
+  /*    section @parameter_tags for more information.                      */
   /*                                                                       */
   typedef struct  FT_Parameter_
   {
@@ -1891,9 +2080,9 @@
   /*    FT_Open_Args                                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to indicate how to open a new font file or        */
-  /*    stream.  A pointer to such a structure can be used as a parameter  */
-  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */
+  /*    A structure to indicate how to open a new font file or stream.  A  */
+  /*    pointer to such a structure can be used as a parameter for the     */
+  /*    functions @FT_Open_Face and @FT_Attach_Stream.                     */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    flags       :: A set of bit flags indicating how to use the        */
@@ -1908,9 +2097,10 @@
   /*    stream      :: A handle to a source stream object.                 */
   /*                                                                       */
   /*    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 tries to load the  */
-  /*                   face with each one of the drivers in its list.      */
+  /*                   it simply specifies the font driver to use for      */
+  /*                   opening the face.  If set to NULL, FreeType tries   */
+  /*                   to load the face with each one of the drivers in    */
+  /*                   its list.                                           */
   /*                                                                       */
   /*    num_params  :: The number of extra parameters.                     */
   /*                                                                       */
@@ -1923,7 +2113,7 @@
   /*                                                                       */
   /*    If the @FT_OPEN_MEMORY bit is set, assume that this is a           */
   /*    memory file of `memory_size' bytes, located at `memory_address'.   */
-  /*    The data are are not copied, and the client is responsible for     */
+  /*    The data are not copied, and the client is responsible for         */
   /*    releasing and destroying them _after_ the corresponding call to    */
   /*    @FT_Done_Face.                                                     */
   /*                                                                       */
@@ -1940,7 +2130,7 @@
   /*    `num_params' and `params' is used.  They are ignored otherwise.    */
   /*                                                                       */
   /*    Ideally, both the `pathname' and `params' fields should be tagged  */
-  /*    as `const'; this is missing for API backwards compatibility.  In   */
+  /*    as `const'; this is missing for API backward compatibility.  In    */
   /*    other words, applications should treat them as read-only.          */
   /*                                                                       */
   typedef struct  FT_Open_Args_
@@ -1963,7 +2153,7 @@
   /*    FT_New_Face                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function calls @FT_Open_Face to open a font by its pathname.  */
+  /*    Call @FT_Open_Face to open a font by its pathname.                 */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    library    :: A handle to the library resource.                    */
@@ -1971,13 +2161,12 @@
   /* <Input>                                                               */
   /*    pathname   :: A path to the font file.                             */
   /*                                                                       */
-  /*    face_index :: The index of the face within the font.  The first    */
-  /*                  face has index~0.                                    */
+  /*    face_index :: See @FT_Open_Face for a detailed description of this */
+  /*                  parameter.                                           */
   /*                                                                       */
   /* <Output>                                                              */
   /*    aface      :: A handle to a new face object.  If `face_index' is   */
   /*                  greater than or equal to zero, it must be non-NULL.  */
-  /*                  See @FT_Open_Face for more details.                  */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
@@ -1999,8 +2188,8 @@
   /*    FT_New_Memory_Face                                                 */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function calls @FT_Open_Face to open a font that has been     */
-  /*    loaded into memory.                                                */
+  /*    Call @FT_Open_Face to open a font that has been loaded into        */
+  /*    memory.                                                            */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    library    :: A handle to the library resource.                    */
@@ -2010,13 +2199,12 @@
   /*                                                                       */
   /*    file_size  :: The size of the memory chunk used by the font data.  */
   /*                                                                       */
-  /*    face_index :: The index of the face within the font.  The first    */
-  /*                  face has index~0.                                    */
+  /*    face_index :: See @FT_Open_Face for a detailed description of this */
+  /*                  parameter.                                           */
   /*                                                                       */
   /* <Output>                                                              */
   /*    aface      :: A handle to a new face object.  If `face_index' is   */
   /*                  greater than or equal to zero, it must be non-NULL.  */
-  /*                  See @FT_Open_Face for more details.                  */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
@@ -2048,13 +2236,44 @@
   /*    args       :: A pointer to an `FT_Open_Args' structure that must   */
   /*                  be filled by the caller.                             */
   /*                                                                       */
-  /*    face_index :: The index of the face within the font.  The first    */
-  /*                  face has index~0.                                    */
+  /*    face_index :: This field holds two different values.  Bits 0-15    */
+  /*                  are the index of the face in the font file (starting */
+  /*                  with value~0).  Set it to~0 if there is only one     */
+  /*                  face in the font file.                               */
+  /*                                                                       */
+  /*                  [Since 2.6.1] Bits 16-30 are relevant to GX and      */
+  /*                  OpenType variation fonts only, specifying the named  */
+  /*                  instance index for the current face index (starting  */
+  /*                  with value~1; value~0 makes FreeType ignore named    */
+  /*                  instances).  For non-variation fonts, bits 16-30 are */
+  /*                  ignored.  Assuming that you want to access the third */
+  /*                  named instance in face~4, `face_index' should be set */
+  /*                  to 0x00030004.  If you want to access face~4 without */
+  /*                  variation handling, simply set `face_index' to       */
+  /*                  value~4.                                             */
+  /*                                                                       */
+  /*                  `FT_Open_Face' and its siblings can be used to       */
+  /*                  quickly check whether the font format of a given     */
+  /*                  font resource is supported by FreeType.  In general, */
+  /*                  if the `face_index' argument is negative, the        */
+  /*                  function's return value is~0 if the font format is   */
+  /*                  recognized, or non-zero otherwise.  The function     */
+  /*                  allocates a more or less empty face handle in        */
+  /*                  `*aface' (if `aface' isn't NULL); the only two       */
+  /*                  useful fields in this special case are               */
+  /*                  `face->num_faces' and `face->style_flags'.  For any  */
+  /*                  negative value of `face_index', `face->num_faces'    */
+  /*                  gives the number of faces within the font file.  For */
+  /*                  the negative value `-(N+1)' (with `N' a non-negative */
+  /*                  16-bit value), bits 16-30 in `face->style_flags'     */
+  /*                  give the number of named instances in face `N' if we */
+  /*                  have a variation font (or zero otherwise).  After    */
+  /*                  examination, the returned @FT_Face structure should  */
+  /*                  be deallocated with a call to @FT_Done_Face.         */
   /*                                                                       */
   /* <Output>                                                              */
   /*    aface      :: A handle to a new face object.  If `face_index' is   */
   /*                  greater than or equal to zero, it must be non-NULL.  */
-  /*                  See note below.                                      */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
@@ -2064,16 +2283,6 @@
   /*    slot for the face object that can be accessed directly through     */
   /*    `face->glyph'.                                                     */
   /*                                                                       */
-  /*    FT_Open_Face can be used to quickly check whether the font         */
-  /*    format of a given font resource is supported by FreeType.  If the  */
-  /*    `face_index' field is negative, the function's return value is~0   */
-  /*    if the font format is recognized, or non-zero otherwise;           */
-  /*    the function returns a more or less empty face handle in `*aface'  */
-  /*    (if `aface' isn't NULL).  The only useful field in this special    */
-  /*    case is `face->num_faces' that gives the number of faces within    */
-  /*    the font file.  After examination, the returned @FT_Face structure */
-  /*    should be deallocated with a call to @FT_Done_Face.                */
-  /*                                                                       */
   /*    Each new face object created with this function also owns a        */
   /*    default @FT_Size object, accessible as `face->size'.               */
   /*                                                                       */
@@ -2084,6 +2293,74 @@
   /*    See the discussion of reference counters in the description of     */
   /*    @FT_Reference_Face.                                                */
   /*                                                                       */
+  /*    To loop over all faces, use code similar to the following snippet  */
+  /*    (omitting the error handling).                                     */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      ...                                                              */
+  /*      FT_Face  face;                                                   */
+  /*      FT_Long  i, num_faces;                                           */
+  /*                                                                       */
+  /*                                                                       */
+  /*      error = FT_Open_Face( library, args, -1, &face );                */
+  /*      if ( error ) { ... }                                             */
+  /*                                                                       */
+  /*      num_faces = face->num_faces;                                     */
+  /*      FT_Done_Face( face );                                            */
+  /*                                                                       */
+  /*      for ( i = 0; i < num_faces; i++ )                                */
+  /*      {                                                                */
+  /*        ...                                                            */
+  /*        error = FT_Open_Face( library, args, i, &face );               */
+  /*        ...                                                            */
+  /*        FT_Done_Face( face );                                          */
+  /*        ...                                                            */
+  /*      }                                                                */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    To loop over all valid values for `face_index', use something      */
+  /*    similar to the following snippet, again without error handling.    */
+  /*    The code accesses all faces immediately (thus only a single call   */
+  /*    of `FT_Open_Face' within the do-loop), with and without named      */
+  /*    instances.                                                         */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      ...                                                              */
+  /*      FT_Face  face;                                                   */
+  /*                                                                       */
+  /*      FT_Long  num_faces     = 0;                                      */
+  /*      FT_Long  num_instances = 0;                                      */
+  /*                                                                       */
+  /*      FT_Long  face_idx     = 0;                                       */
+  /*      FT_Long  instance_idx = 0;                                       */
+  /*                                                                       */
+  /*                                                                       */
+  /*      do                                                               */
+  /*      {                                                                */
+  /*        FT_Long  id = ( instance_idx << 16 ) + face_idx;               */
+  /*                                                                       */
+  /*                                                                       */
+  /*        error = FT_Open_Face( library, args, id, &face );              */
+  /*        if ( error ) { ... }                                           */
+  /*                                                                       */
+  /*        num_faces     = face->num_faces;                               */
+  /*        num_instances = face->style_flags >> 16;                       */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        FT_Done_Face( face );                                          */
+  /*                                                                       */
+  /*        if ( instance_idx < num_instances )                            */
+  /*          instance_idx++;                                              */
+  /*        else                                                           */
+  /*        {                                                              */
+  /*          face_idx++;                                                  */
+  /*          instance_idx = 0;                                            */
+  /*        }                                                              */
+  /*                                                                       */
+  /*      } while ( face_idx < num_faces )                                 */
+  /*    }                                                                  */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Open_Face( FT_Library           library,
                 const FT_Open_Args*  args,
@@ -2097,7 +2374,7 @@
   /*    FT_Attach_File                                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function calls @FT_Attach_Stream to attach a file.            */
+  /*    Call @FT_Attach_Stream to attach a file.                           */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face         :: The target face object.                            */
@@ -2141,7 +2418,7 @@
   /*                                                                       */
   /*    Client applications are expected to know what they are doing       */
   /*    when invoking this function.  Most drivers simply do not implement */
-  /*    file attachments.                                                  */
+  /*    file or stream attachments.                                        */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Attach_Stream( FT_Face        face,
@@ -2204,7 +2481,10 @@
   /*    FT_Select_Size                                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Select a bitmap strike.                                            */
+  /*    Select a bitmap strike.  To be more precise, this function sets    */
+  /*    the scaling factors of the active @FT_Size object in a face so     */
+  /*    that bitmaps from this particular strike are taken by              */
+  /*    @FT_Load_Glyph and friends.                                        */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face         :: A handle to a target face object.                  */
@@ -2216,6 +2496,20 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    For bitmaps embedded in outline fonts it is common that only a     */
+  /*    subset of the available glyphs at a given ppem value is available. */
+  /*    FreeType silently uses outlines if there is no bitmap for a given  */
+  /*    glyph index.                                                       */
+  /*                                                                       */
+  /*    For GX and OpenType variation fonts, a bitmap strike makes sense   */
+  /*    only if the default instance is active (this is, no glyph          */
+  /*    variation takes place); otherwise, FreeType simply ignores bitmap  */
+  /*    strikes.  The same is true for all named instances that are        */
+  /*    different from the default instance.                               */
+  /*                                                                       */
+  /*    Don't use this function if you are using the FreeType cache API.   */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Select_Size( FT_Face  face,
                   FT_Int   strike_index );
@@ -2227,17 +2521,26 @@
   /*    FT_Size_Request_Type                                               */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An enumeration type that lists the supported size request types.   */
+  /*    An enumeration type that lists the supported size request types,   */
+  /*    i.e., what input size (in font units) maps to the requested output */
+  /*    size (in pixels, as computed from the arguments of                 */
+  /*    @FT_Size_Request).                                                 */
   /*                                                                       */
   /* <Values>                                                              */
   /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */
   /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */
   /*      used to determine both scaling values.                           */
   /*                                                                       */
+  /*      This is the standard scaling found in most applications.  In     */
+  /*      particular, use this size request type for TrueType fonts if     */
+  /*      they provide optical scaling or something similar.  Note,        */
+  /*      however, that `units_per_EM' is a rather abstract value which    */
+  /*      bears no relation to the actual size of the glyphs in a font.    */
+  /*                                                                       */
   /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */
-  /*      The real dimension.  The sum of the the `ascender' and (minus    */
-  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */
-  /*      both scaling values.                                             */
+  /*      The real dimension.  The sum of the `ascender' and (minus of)    */
+  /*      the `descender' fields of @FT_FaceRec is used to determine both  */
+  /*      scaling values.                                                  */
   /*                                                                       */
   /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */
   /*      The font bounding box.  The width and height of the `bbox' field */
@@ -2282,27 +2585,36 @@
   /*    FT_Size_RequestRec                                                 */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a size request.                          */
+  /*    A structure to model a size request.                               */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    type           :: See @FT_Size_Request_Type.                       */
   /*                                                                       */
-  /*    width          :: The desired width.                               */
+  /*    width          :: The desired width, given as a 26.6 fractional    */
+  /*                      point value (with 72pt = 1in).                   */
   /*                                                                       */
-  /*    height         :: The desired height.                              */
+  /*    height         :: The desired height, given as a 26.6 fractional   */
+  /*                      point value (with 72pt = 1in).                   */
   /*                                                                       */
-  /*    horiResolution :: The horizontal resolution.  If set to zero,      */
-  /*                      `width' is treated as a 26.6 fractional pixel    */
-  /*                      value.                                           */
+  /*    horiResolution :: The horizontal resolution (dpi, i.e., pixels per */
+  /*                      inch).  If set to zero, `width' is treated as a  */
+  /*                      26.6 fractional *pixel* value, which gets        */
+  /*                      internally rounded to an integer.                */
   /*                                                                       */
-  /*    vertResolution :: The vertical resolution.  If set to zero,        */
-  /*                      `height' is treated as a 26.6 fractional pixel   */
-  /*                      value.                                           */
+  /*    vertResolution :: The vertical resolution (dpi, i.e., pixels per   */
+  /*                      inch).  If set to zero, `height' is treated as a */
+  /*                      26.6 fractional *pixel* value, which gets        */
+  /*                      internally rounded to an integer.                */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    If `width' is zero, then the horizontal scaling value is set equal */
+  /*    If `width' is zero, the horizontal scaling value is set equal      */
   /*    to the vertical scaling value, and vice versa.                     */
   /*                                                                       */
+  /*    If `type' is FT_SIZE_REQUEST_TYPE_SCALES, `width' and `height' are */
+  /*    interpreted directly as 16.16 fractional scaling values, without   */
+  /*    any further modification, and both `horiResolution' and            */
+  /*    `vertResolution' are ignored.                                      */
+  /*                                                                       */
   typedef struct  FT_Size_RequestRec_
   {
     FT_Size_Request_Type  type;
@@ -2352,7 +2664,11 @@
   /*    size is dependent entirely on how the size is defined in the       */
   /*    source face.  The font designer chooses the final size of each     */
   /*    glyph relative to this size.  For more information refer to        */
-  /*    `http://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'      */
+  /*    `https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'.    */
+  /*                                                                       */
+  /*    Contrary to @FT_Set_Char_Size, this function doesn't have special  */
+  /*    code to normalize zero-valued widths, heights, or resolutions      */
+  /*    (which lead to errors in most cases).                              */
   /*                                                                       */
   /*    Don't use this function if you are using the FreeType cache API.   */
   /*                                                                       */
@@ -2367,8 +2683,7 @@
   /*    FT_Set_Char_Size                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function calls @FT_Request_Size to request the nominal size   */
-  /*    (in points).                                                       */
+  /*    Call @FT_Request_Size to request the nominal size (in points).     */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face            :: A handle to a target face object.               */
@@ -2386,6 +2701,10 @@
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
+  /*    While this function allows fractional points as input values, the  */
+  /*    resulting ppem value for the given resolution is always rounded to */
+  /*    the nearest integer.                                               */
+  /*                                                                       */
   /*    If either the character width or height is zero, it is set equal   */
   /*    to the other value.                                                */
   /*                                                                       */
@@ -2411,8 +2730,7 @@
   /*    FT_Set_Pixel_Sizes                                                 */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function calls @FT_Request_Size to request the nominal size   */
-  /*    (in pixels).                                                       */
+  /*    Call @FT_Request_Size to request the nominal size (in pixels).     */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face         :: A handle to the target face object.                */
@@ -2426,8 +2744,8 @@
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    You should not rely on the resulting glyphs matching, or being     */
-  /*    constrained, to this pixel size.  Refer to @FT_Request_Size to     */
+  /*    You should not rely on the resulting glyphs matching or being      */
+  /*    constrained to this pixel size.  Refer to @FT_Request_Size to      */
   /*    understand how requested sizes relate to actual sizes.             */
   /*                                                                       */
   /*    Don't use this function if you are using the FreeType cache API.   */
@@ -2444,8 +2762,7 @@
   /*    FT_Load_Glyph                                                      */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A function used to load a single glyph into the glyph slot of a    */
-  /*    face object.                                                       */
+  /*    Load a glyph into the glyph slot of a face object.                 */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face        :: A handle to the target face object where the glyph  */
@@ -2474,6 +2791,10 @@
   /*    don't have a corresponding glyph in the font).  See the discussion */
   /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */
   /*                                                                       */
+  /*    If you receive `FT_Err_Glyph_Too_Big', try getting the glyph       */
+  /*    outline at EM size, then scale it manually and fill it as a        */
+  /*    graphics operation.                                                */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Load_Glyph( FT_Face   face,
                  FT_UInt   glyph_index,
@@ -2486,8 +2807,8 @@
   /*    FT_Load_Char                                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A function used to load a single glyph into the glyph slot of a    */
-  /*    face object, according to its character code.                      */
+  /*    Load a glyph into the glyph slot of a face object, accessed by its */
+  /*    character code.                                                    */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face        :: A handle to a target face object where the glyph    */
@@ -2509,6 +2830,14 @@
   /* <Note>                                                                */
   /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */
   /*                                                                       */
+  /*    Many fonts contain glyphs that can't be loaded by this function    */
+  /*    since its glyph indices are not listed in any of the font's        */
+  /*    charmaps.                                                          */
+  /*                                                                       */
+  /*    If no active cmap is set up (i.e., `face->charmap' is zero), the   */
+  /*    call to @FT_Get_Char_Index is omitted, and the function behaves    */
+  /*    identically to @FT_Load_Glyph.                                     */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Load_Char( FT_Face   face,
                 FT_ULong  char_code,
@@ -2521,8 +2850,8 @@
    *   FT_LOAD_XXX
    *
    * @description:
-   *   A list of bit-field constants used with @FT_Load_Glyph to indicate
-   *   what kind of operations to perform during glyph loading.
+   *   A list of bit field constants for @FT_Load_Glyph to indicate what
+   *   kind of operations to perform during glyph loading.
    *
    * @values:
    *   FT_LOAD_DEFAULT ::
@@ -2534,13 +2863,13 @@
    *        The bitmap data can be accessed from the glyph slot (see note
    *        below).
    *
-   *     2. If no embedded bitmap is searched or found, FreeType looks for a
-   *        scalable outline.  If one is found, it is loaded from the font
-   *        file, scaled to device pixels, then `hinted' to the pixel grid
-   *        in order to optimize it.  The outline data can be accessed from
-   *        the glyph slot (see note below).
+   *     2. If no embedded bitmap is searched for or found, FreeType looks
+   *        for a scalable outline.  If one is found, it is loaded from
+   *        the font file, scaled to device pixels, then `hinted' to the
+   *        pixel grid in order to optimize it.  The outline data can be
+   *        accessed from the glyph slot (see note below).
    *
-   *     Note that by default, the glyph loader doesn't render outlines into
+   *     Note that by default the glyph loader doesn't render outlines into
    *     bitmaps.  The following flags are used to modify this default
    *     behaviour to more specific and useful cases.
    *
@@ -2587,13 +2916,13 @@
    *     various font formats.
    *
    *   FT_LOAD_FORCE_AUTOHINT ::
-   *     Indicates that the auto-hinter is preferred over the font's native
-   *     hinter.  See also the note below.
+   *     Prefer the auto-hinter over the font's native hinter.  See also
+   *     the note below.
    *
    *   FT_LOAD_PEDANTIC ::
-   *     Indicates that the font driver should perform pedantic verifications
-   *     during glyph loading.  This is mostly used to detect broken glyphs
-   *     in fonts.  By default, FreeType tries to handle broken fonts also.
+   *     Make the font driver perform pedantic verifications during glyph
+   *     loading.  This is mostly used to detect broken glyphs in fonts.
+   *     By default, FreeType tries to handle broken fonts also.
    *
    *     In particular, errors from the TrueType bytecode engine are not
    *     passed to the application if this flag is not set; this might
@@ -2601,17 +2930,16 @@
    *     bytecode is buggy.
    *
    *   FT_LOAD_NO_RECURSE ::
-   *     Indicate that the font driver should not load composite glyphs
-   *     recursively.  Instead, it should set the `num_subglyph' and
-   *     `subglyphs' values of the glyph slot accordingly, and set
-   *     `glyph->format' to @FT_GLYPH_FORMAT_COMPOSITE.  The description of
-   *     subglyphs can then be accessed with @FT_Get_SubGlyph_Info.
+   *     Don't load composite glyphs recursively.  Instead, the font
+   *     driver should set the `num_subglyph' and `subglyphs' values of
+   *     the glyph slot accordingly, and set `glyph->format' to
+   *     @FT_GLYPH_FORMAT_COMPOSITE.  The description of subglyphs can
+   *     then be accessed with @FT_Get_SubGlyph_Info.
    *
    *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
    *
    *   FT_LOAD_IGNORE_TRANSFORM ::
-   *     Indicates that the transform matrix set by @FT_Set_Transform should
-   *     be ignored.
+   *     Ignore the transform matrix set by @FT_Set_Transform.
    *
    *   FT_LOAD_MONOCHROME ::
    *     This flag is used with @FT_LOAD_RENDER to indicate that you want to
@@ -2623,21 +2951,37 @@
    *     monochrome-optimized hinting algorithm is used.
    *
    *   FT_LOAD_LINEAR_DESIGN ::
-   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'
-   *     fields of @FT_GlyphSlotRec should be kept in font units.  See
-   *     @FT_GlyphSlotRec for details.
+   *     Keep  `linearHoriAdvance' and `linearVertAdvance' fields of
+   *     @FT_GlyphSlotRec in font units.  See @FT_GlyphSlotRec for
+   *     details.
    *
    *   FT_LOAD_NO_AUTOHINT ::
-   *     Disable auto-hinter.  See also the note below.
+   *     Disable the auto-hinter.  See also the note below.
    *
    *   FT_LOAD_COLOR ::
-   *     This flag is used to request loading of color embedded-bitmap
-   *     images.  The resulting color bitmaps, if available, will have the
-   *     @FT_PIXEL_MODE_BGRA format.  When the flag is not used and color
-   *     bitmaps are found, they will be converted to 256-level gray
-   *     bitmaps transparently.  Those bitmaps will be in the
+   *     [Since 2.5] Load embedded color bitmap images.  The resulting color
+   *     bitmaps, if available, will have the @FT_PIXEL_MODE_BGRA format.
+   *     If the flag is not set and color bitmaps are found, they are
+   *     converted to 256-level gray bitmaps transparently, using the
    *     @FT_PIXEL_MODE_GRAY format.
    *
+   *   FT_LOAD_COMPUTE_METRICS ::
+   *     [Since 2.6.1] Compute glyph metrics from the glyph data, without
+   *     the use of bundled metrics tables (for example, the `hdmx' table in
+   *     TrueType fonts).  This flag is mainly used by font validating or
+   *     font editing applications, which need to ignore, verify, or edit
+   *     those tables.
+   *
+   *     Currently, this flag is only implemented for TrueType fonts.
+   *
+   *   FT_LOAD_BITMAP_METRICS_ONLY ::
+   *     [Since 2.7.1] Request loading of the metrics and bitmap image
+   *     information of a (possibly embedded) bitmap glyph without
+   *     allocating or copying the bitmap image data itself.  No effect if
+   *     the target glyph is not a bitmap image.
+   *
+   *     This flag unsets @FT_LOAD_RENDER.
+   *
    *   FT_LOAD_CROP_BITMAP ::
    *     Ignored.  Deprecated.
    *
@@ -2681,12 +3025,14 @@
 #define FT_LOAD_MONOCHROME                   ( 1L << 12 )
 #define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )
 #define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )
-  /* Bits 16..19 are used by `FT_LOAD_TARGET_' */
+  /* Bits 16-19 are used by `FT_LOAD_TARGET_' */
 #define FT_LOAD_COLOR                        ( 1L << 20 )
+#define FT_LOAD_COMPUTE_METRICS              ( 1L << 21 )
+#define FT_LOAD_BITMAP_METRICS_ONLY          ( 1L << 22 )
 
   /* */
 
-  /* used internally only by certain font drivers! */
+  /* used internally only by certain font drivers */
 #define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )
 #define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )
 
@@ -2697,29 +3043,40 @@
    *   FT_LOAD_TARGET_XXX
    *
    * @description:
-   *   A list of values that are used to select a specific hinting algorithm
-   *   to use by the hinter.  You should OR one of these values to your
-   *   `load_flags' when calling @FT_Load_Glyph.
+   *   A list of values to select a specific hinting algorithm for the
+   *   hinter.  You should OR one of these values to your `load_flags'
+   *   when calling @FT_Load_Glyph.
    *
-   *   Note that font's native hinters may ignore the hinting algorithm you
-   *   have specified (e.g., the TrueType bytecode interpreter).  You can set
-   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
-   *
-   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
-   *   always implies @FT_LOAD_FORCE_AUTOHINT.
+   *   Note that a font's native hinters may ignore the hinting algorithm
+   *   you have specified (e.g., the TrueType bytecode interpreter).  You
+   *   can set @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is
+   *   used.
    *
    * @values:
    *   FT_LOAD_TARGET_NORMAL ::
-   *     This corresponds to the default hinting algorithm, optimized for
-   *     standard gray-level rendering.  For monochrome output, use
-   *     @FT_LOAD_TARGET_MONO instead.
+   *     The default hinting algorithm, optimized for standard gray-level
+   *     rendering.  For monochrome output, use @FT_LOAD_TARGET_MONO
+   *     instead.
    *
    *   FT_LOAD_TARGET_LIGHT ::
-   *     A lighter hinting algorithm for non-monochrome modes.  Many
-   *     generated glyphs are more fuzzy but better resemble its original
-   *     shape.  A bit like rendering on Mac OS~X.
+   *     A lighter hinting algorithm for gray-level modes.  Many generated
+   *     glyphs are fuzzier but better resemble their original shape.  This
+   *     is achieved by snapping glyphs to the pixel grid only vertically
+   *     (Y-axis), as is done by FreeType's new CFF engine or Microsoft's
+   *     ClearType font renderer.  This preserves inter-glyph spacing in
+   *     horizontal text.  The snapping is done either by the native font
+   *     driver, if the driver itself and the font support it, or by the
+   *     auto-hinter.
    *
-   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+   *     Advance widths are rounded to integer values; however, using the
+   *     `lsb_delta' and `rsb_delta' fields of @FT_GlyphSlotRec, it is
+   *     possible to get fractional advance widths for subpixel positioning
+   *     (which is recommended to use).
+   *
+   *     If configuration option AF_CONFIG_OPTION_TT_SIZE_METRICS is active,
+   *     TrueType-like metrics are used to make this mode behave similarly
+   *     as in unpatched FreeType versions between 2.4.6 and 2.7.1
+   *     (inclusive).
    *
    *   FT_LOAD_TARGET_MONO ::
    *     Strong hinting algorithm that should only be used for monochrome
@@ -2727,7 +3084,7 @@
    *     in non-monochrome modes.
    *
    *   FT_LOAD_TARGET_LCD ::
-   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+   *     A variant of @FT_LOAD_TARGET_LIGHT optimized for horizontally
    *     decimated LCD displays.
    *
    *   FT_LOAD_TARGET_LCD_V ::
@@ -2740,7 +3097,7 @@
    *
    *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the
    *   corresponding mode (i.e., the mode that matches the used algorithm
-   *   best).  An exeption is FT_LOAD_TARGET_MONO since it implies
+   *   best).  An exception is FT_LOAD_TARGET_MONO since it implies
    *   @FT_LOAD_MONOCHROME.
    *
    *   You can use a hinting algorithm that doesn't correspond to the same
@@ -2755,6 +3112,13 @@
    *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
    *     }
    *
+   *   In general, you should stick with one rendering mode.  For example,
+   *   switching between @FT_LOAD_TARGET_NORMAL and @FT_LOAD_TARGET_MONO
+   *   enforces a lot of recomputation for TrueType fonts, which is slow.
+   *   Another reason is caching: Selecting a different mode usually causes
+   *   changes in both the outlines and the rasterized bitmaps; it is thus
+   *   necessary to empty the cache after a mode switch to avoid false hits.
+   *
    */
 #define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
 
@@ -2784,18 +3148,17 @@
   /*    FT_Set_Transform                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A function used to set the transformation that is applied to glyph */
-  /*    images when they are loaded into a glyph slot through              */
-  /*    @FT_Load_Glyph.                                                    */
+  /*    Set the transformation that is applied to glyph images when they   */
+  /*    are loaded into a glyph slot through @FT_Load_Glyph.               */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face   :: A handle to the source face object.                      */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */
-  /*              the identity matrix.                                     */
-  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */
-  /*              vector.                                                  */
+  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use NULL  */
+  /*              for the identity matrix.                                 */
+  /*    delta  :: A pointer to the translation vector.  Use NULL for the   */
+  /*              null vector.                                             */
   /*                                                                       */
   /* <Note>                                                                */
   /*    The transformation is only applied to scalable image formats after */
@@ -2818,20 +3181,22 @@
   /*    FT_Render_Mode                                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An enumeration type that lists the render modes supported by       */
-  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */
-  /*    conversion performed on the outline.                               */
+  /*    Render modes supported by FreeType~2.  Each mode corresponds to a  */
+  /*    specific type of scanline conversion performed on the outline.     */
   /*                                                                       */
   /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */
   /*    field in the @FT_GlyphSlotRec structure gives the format of the    */
   /*    returned bitmap.                                                   */
   /*                                                                       */
-  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */
+  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity,   */
+  /*    indicating pixel coverage.  Use linear alpha blending and gamma    */
+  /*    correction to correctly render non-monochrome glyph bitmaps onto a */
+  /*    surface; see @FT_Render_Glyph.                                     */
   /*                                                                       */
   /* <Values>                                                              */
   /*    FT_RENDER_MODE_NORMAL ::                                           */
-  /*      This is the default render mode; it corresponds to 8-bit         */
-  /*      anti-aliased bitmaps.                                            */
+  /*      Default render mode; it corresponds to 8-bit anti-aliased        */
+  /*      bitmaps.                                                         */
   /*                                                                       */
   /*    FT_RENDER_MODE_LIGHT ::                                            */
   /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */
@@ -2844,23 +3209,25 @@
   /*      opacity).                                                        */
   /*                                                                       */
   /*    FT_RENDER_MODE_LCD ::                                              */
-  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */
+  /*      This mode corresponds to horizontal RGB and BGR subpixel         */
   /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */
   /*      3~times the width of the original glyph outline in pixels, and   */
   /*      which use the @FT_PIXEL_MODE_LCD mode.                           */
   /*                                                                       */
   /*    FT_RENDER_MODE_LCD_V ::                                            */
-  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */
+  /*      This mode corresponds to vertical RGB and BGR subpixel displays  */
   /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */
   /*      8-bit bitmaps that are 3~times the height of the original        */
   /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
-  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
-  /*    (not active in the default builds).  It is up to the caller to     */
-  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */
-  /*    filtering itself.                                                  */
+  /*    Should you define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your      */
+  /*    `ftoption.h', which enables patented ClearType-style rendering,    */
+  /*    the LCD-optimized glyph bitmaps should be filtered to reduce color */
+  /*    fringes inherent to this technology.  You can either set up LCD    */
+  /*    filtering with @FT_Library_SetLcdFilter or @FT_Face_Properties,    */
+  /*    or do the filtering yourself.  The default FreeType LCD rendering  */
+  /*    technology does not require filtering.                             */
   /*                                                                       */
   /*    The selected render mode only affects vector glyphs of a font.     */
   /*    Embedded bitmaps often have a different pixel mode like            */
@@ -2901,16 +3268,93 @@
   /*                   convert.                                            */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    render_mode :: This is the render mode used to render the glyph    */
-  /*                   image into a bitmap.  See @FT_Render_Mode for a     */
-  /*                   list of possible values.                            */
+  /*    render_mode :: The render mode used to render the glyph image into */
+  /*                   a bitmap.  See @FT_Render_Mode for a list of        */
+  /*                   possible values.                                    */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
   /* <Note>                                                                */
   /*    To get meaningful results, font scaling values must be set with    */
-  /*    functions like @FT_Set_Char_Size before calling FT_Render_Glyph.   */
+  /*    functions like @FT_Set_Char_Size before calling `FT_Render_Glyph'. */
+  /*                                                                       */
+  /*    When FreeType outputs a bitmap of a glyph, it really outputs an    */
+  /*    alpha coverage map.  If a pixel is completely covered by a         */
+  /*    filled-in outline, the bitmap contains 0xFF at that pixel, meaning */
+  /*    that 0xFF/0xFF fraction of that pixel is covered, meaning the      */
+  /*    pixel is 100% black (or 0% bright).  If a pixel is only 50%        */
+  /*    covered (value 0x80), the pixel is made 50% black (50% bright or a */
+  /*    middle shade of grey).  0% covered means 0% black (100% bright or  */
+  /*    white).                                                            */
+  /*                                                                       */
+  /*    On high-DPI screens like on smartphones and tablets, the pixels    */
+  /*    are so small that their chance of being completely covered and     */
+  /*    therefore completely black are fairly good.  On the low-DPI        */
+  /*    screens, however, the situation is different.  The pixels are too  */
+  /*    large for most of the details of a glyph and shades of gray are    */
+  /*    the norm rather than the exception.                                */
+  /*                                                                       */
+  /*    This is relevant because all our screens have a second problem:    */
+  /*    they are not linear.  1~+~1 is not~2.  Twice the value does not    */
+  /*    result in twice the brightness.  When a pixel is only 50% covered, */
+  /*    the coverage map says 50% black, and this translates to a pixel    */
+  /*    value of 128 when you use 8~bits per channel (0-255).  However,    */
+  /*    this does not translate to 50% brightness for that pixel on our    */
+  /*    sRGB and gamma~2.2 screens.  Due to their non-linearity, they      */
+  /*    dwell longer in the darks and only a pixel value of about 186      */
+  /*    results in 50% brightness -- 128 ends up too dark on both bright   */
+  /*    and dark backgrounds.  The net result is that dark text looks      */
+  /*    burnt-out, pixely and blotchy on bright background, bright text    */
+  /*    too frail on dark backgrounds, and colored text on colored         */
+  /*    background (for example, red on green) seems to have dark halos or */
+  /*    `dirt' around it.  The situation is especially ugly for diagonal   */
+  /*    stems like in `w' glyph shapes where the quality of FreeType's     */
+  /*    anti-aliasing depends on the correct display of grays.  On         */
+  /*    high-DPI screens where smaller, fully black pixels reign supreme,  */
+  /*    this doesn't matter, but on our low-DPI screens with all the gray  */
+  /*    shades, it does.  0% and 100% brightness are the same things in    */
+  /*    linear and non-linear space, just all the shades in-between        */
+  /*    aren't.                                                            */
+  /*                                                                       */
+  /*    The blending function for placing text over a background is        */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      dst = alpha * src + (1 - alpha) * dst    ,                       */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    which is known as the OVER operator.                               */
+  /*                                                                       */
+  /*    To correctly composite an antialiased pixel of a glyph onto a      */
+  /*    surface,                                                           */
+  /*                                                                       */
+  /*    1. take the foreground and background colors (e.g., in sRGB space) */
+  /*       and apply gamma to get them in a linear space,                  */
+  /*                                                                       */
+  /*    2. use OVER to blend the two linear colors using the glyph pixel   */
+  /*       as the alpha value (remember, the glyph bitmap is an alpha      */
+  /*       coverage bitmap), and                                           */
+  /*                                                                       */
+  /*    3. apply inverse gamma to the blended pixel and write it back to   */
+  /*       the image.                                                      */
+  /*                                                                       */
+  /*    Internal testing at Adobe found that a target inverse gamma of~1.8 */
+  /*    for step~3 gives good results across a wide range of displays with */
+  /*    an sRGB gamma curve or a similar one.                              */
+  /*                                                                       */
+  /*    This process can cost performance.  There is an approximation that */
+  /*    does not need to know about the background color; see              */
+  /*    https://bel.fi/alankila/lcd/ and                                   */
+  /*    https://bel.fi/alankila/lcd/alpcor.html for details.               */
+  /*                                                                       */
+  /*    *ATTENTION*: Linear blending is even more important when dealing   */
+  /*    with subpixel-rendered glyphs to prevent color-fringing!  A        */
+  /*    subpixel-rendered glyph must first be filtered with a filter that  */
+  /*    gives equal weight to the three color primaries and does not       */
+  /*    exceed a sum of 0x100, see section @lcd_filtering.  Then the       */
+  /*    only difference to gray linear blending is that subpixel-rendered  */
+  /*    linear blending is done 3~times per pixel: red foreground subpixel */
+  /*    to red background subpixel and so on for green and blue.           */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Render_Glyph( FT_GlyphSlot    slot,
@@ -2923,22 +3367,31 @@
   /*    FT_Kerning_Mode                                                    */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An enumeration used to specify which kerning values to return in   */
+  /*    An enumeration to specify the format of kerning values returned by */
   /*    @FT_Get_Kerning.                                                   */
   /*                                                                       */
   /* <Values>                                                              */
-  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */
-  /*                           distances (value is~0).                     */
+  /*    FT_KERNING_DEFAULT  :: Return grid-fitted kerning distances in     */
+  /*                           26.6 fractional pixels.                     */
   /*                                                                       */
-  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */
-  /*                           distances.                                  */
+  /*    FT_KERNING_UNFITTED :: Return un-grid-fitted kerning distances in  */
+  /*                           26.6 fractional pixels.                     */
   /*                                                                       */
   /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */
   /*                           units.                                      */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    FT_KERNING_DEFAULT returns full pixel values; it also makes        */
+  /*    FreeType heuristically scale down kerning distances at small ppem  */
+  /*    values so that they don't become too big.                          */
+  /*                                                                       */
+  /*    Both FT_KERNING_DEFAULT and FT_KERNING_UNFITTED use the current    */
+  /*    horizontal scaling factor (as set e.g. with @FT_Set_Char_Size) to  */
+  /*    convert font units to pixels.                                      */
+  /*                                                                       */
   typedef enum  FT_Kerning_Mode_
   {
-    FT_KERNING_DEFAULT  = 0,
+    FT_KERNING_DEFAULT = 0,
     FT_KERNING_UNFITTED,
     FT_KERNING_UNSCALED
 
@@ -2958,7 +3411,7 @@
   /*    FT_Get_Kerning                                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return the kerning vector between two glyphs of a same face.       */
+  /*    Return the kerning vector between two glyphs of the same face.     */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face        :: A handle to a source face object.                   */
@@ -2972,9 +3425,10 @@
   /*                   kerning vector.                                     */
   /*                                                                       */
   /* <Output>                                                              */
-  /*    akerning    :: The kerning vector.  This is either in font units   */
-  /*                   or in pixels (26.6 format) for scalable formats,    */
-  /*                   and in pixels for fixed-sizes formats.              */
+  /*    akerning    :: The kerning vector.  This is either in font units,  */
+  /*                   fractional pixels (26.6 format), or pixels for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
@@ -2985,6 +3439,10 @@
   /*    kernings, are out of the scope of this API function -- they can be */
   /*    implemented through format-specific interfaces.                    */
   /*                                                                       */
+  /*    Kerning for OpenType fonts implemented in a `GPOS' table is not    */
+  /*    supported; use @FT_HAS_KERNING to find out whether a font has data */
+  /*    that can be extracted with `FT_Get_Kerning'.                       */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Kerning( FT_Face     face,
                   FT_UInt     left_glyph,
@@ -3024,7 +3482,7 @@
   /*    @FT_Attach_Stream).                                                */
   /*                                                                       */
   /*    Only very few AFM files come with track kerning data; please refer */
-  /*    to the Adobe's AFM specification for more details.                 */
+  /*    to Adobe's AFM specification for more details.                     */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Track_Kerning( FT_Face    face,
@@ -3070,7 +3528,7 @@
   /*    `.notdef').                                                        */
   /*                                                                       */
   /*    This function always returns an error if the config macro          */
-  /*    `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is not defined in `ftoptions.h'. */
+  /*    `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is not defined in `ftoption.h'.  */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Glyph_Name( FT_Face     face,
@@ -3086,7 +3544,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Retrieve the ASCII PostScript name of a given face, if available.  */
-  /*    This only works with PostScript and TrueType fonts.                */
+  /*    This only works with PostScript, TrueType, and OpenType fonts.     */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face :: A handle to the source face object.                        */
@@ -3098,6 +3556,20 @@
   /*    The returned pointer is owned by the face and is destroyed with    */
   /*    it.                                                                */
   /*                                                                       */
+  /*    For variation fonts, this string changes if you select a different */
+  /*    instance, and you have to call `FT_Get_PostScript_Name' again to   */
+  /*    retrieve it.  FreeType follows Adobe TechNote #5902, `Generating   */
+  /*    PostScript Names for Fonts Using OpenType Font Variations'.        */
+  /*                                                                       */
+  /*      https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html */
+  /*                                                                       */
+  /*    [Since 2.9] Special PostScript names for named instances are only  */
+  /*    returned if the named instance is set with @FT_Set_Named_Instance  */
+  /*    (and the font has corresponding entries in its `fvar' table).  If  */
+  /*    @FT_IS_VARIATION returns true, the algorithmically derived         */
+  /*    PostScript name is provided, not looking up special entries for    */
+  /*    named instances.                                                   */
+  /*                                                                       */
   FT_EXPORT( const char* )
   FT_Get_Postscript_Name( FT_Face  face );
 
@@ -3157,7 +3629,8 @@
   /*    the face (i.e., if it is not listed in the `face->charmaps'        */
   /*    table).                                                            */
   /*                                                                       */
-  /*    It also fails if a type~14 charmap is selected.                    */
+  /*    It also fails if an OpenType type~14 charmap is selected (which    */
+  /*    doesn't map character codes to glyph indices at all).              */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Set_Charmap( FT_Face     face,
@@ -3192,7 +3665,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return the glyph index of a given character code.  This function   */
-  /*    uses a charmap object to do the mapping.                           */
+  /*    uses the currently selected charmap to do the mapping.             */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face     :: A handle to the source face object.                    */
@@ -3226,9 +3699,8 @@
   /*    FT_Get_First_Char                                                  */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function is used to return the first character code in the    */
-  /*    current charmap of a given face.  It also returns the              */
-  /*    corresponding glyph index.                                         */
+  /*    Return the first character code in the current charmap of a given  */
+  /*    face, together with its corresponding glyph index.                 */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face    :: A handle to the source face object.                     */
@@ -3241,7 +3713,7 @@
   /*    The charmap's first character code.                                */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    You should use this function with @FT_Get_Next_Char to be able to  */
+  /*    You should use this function together with @FT_Get_Next_Char to    */
   /*    parse all character codes available in a given charmap.  The code  */
   /*    should look like this:                                             */
   /*                                                                       */
@@ -3259,6 +3731,13 @@
   /*      }                                                                */
   /*    }                                                                  */
   /*                                                                       */
+  /*    Be aware that character codes can have values up to 0xFFFFFFFF;    */
+  /*    this might happen for non-Unicode or malformed cmaps.  However,    */
+  /*    even with regular Unicode encoding, so-called `last resort fonts'  */
+  /*    (using SFNT cmap format 13, see function @FT_Get_CMap_Format)      */
+  /*    normally have entries for all Unicode characters up to 0x1FFFFF,   */
+  /*    which can cause *a lot* of iterations.                             */
+  /*                                                                       */
   /*    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    */
   /*    if the value~0 is the first valid character code.                  */
@@ -3274,12 +3753,13 @@
   /*    FT_Get_Next_Char                                                   */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This function is used to return the next character code in the     */
-  /*    current charmap of a given face following the value `char_code',   */
-  /*    as well as the corresponding glyph index.                          */
+  /*    Return the next character code in the current charmap of a given   */
+  /*    face following the value `char_code', as well as the corresponding */
+  /*    glyph index.                                                       */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face      :: A handle to the source face object.                   */
+  /*                                                                       */
   /*    char_code :: The starting character code.                          */
   /*                                                                       */
   /* <Output>                                                              */
@@ -3292,7 +3772,7 @@
   /* <Note>                                                                */
   /*    You should use this function with @FT_Get_First_Char to walk       */
   /*    over all character codes available in a given charmap.  See the    */
-  /*    note for this function for a simple code example.                  */
+  /*    note for that function for a simple code example.                  */
   /*                                                                       */
   /*    Note that `*agindex' is set to~0 when there are no more codes in   */
   /*    the charmap.                                                       */
@@ -3303,14 +3783,112 @@
                     FT_UInt   *agindex );
 
 
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Face_Properties
+   *
+   * @description:
+   *   Set or override certain (library or module-wide) properties on a
+   *   face-by-face basis.  Useful for finer-grained control and avoiding
+   *   locks on shared structures (threads can modify their own faces as
+   *   they see fit).
+   *
+   *   Contrary to @FT_Property_Set, this function uses @FT_Parameter so
+   *   that you can pass multiple properties to the target face in one call.
+   *   Note that only a subset of the available properties can be
+   *   controlled.
+   *
+   *   * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the
+   *     property `no-stem-darkening' provided by the `autofit', `cff',
+   *     `type1', and `t1cid' modules; see @no-stem-darkening).
+   *
+   *   * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding
+   *     to function @FT_Library_SetLcdFilterWeights).
+   *
+   *   * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID
+   *     `random' operator, corresponding to the `random-seed' property
+   *     provided by the `cff', `type1', and `t1cid' modules; see
+   *     @random-seed).
+   *
+   *   Pass NULL as `data' in @FT_Parameter for a given tag to reset the
+   *   option and use the library or module default again.
+   *
+   * @input:
+   *   face ::
+   *     A handle to the source face object.
+   *
+   *   num_properties ::
+   *     The number of properties that follow.
+   *
+   *   properties ::
+   *     A handle to an @FT_Parameter array with `num_properties' elements.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Here an example that sets three properties.  You must define
+   *   FT_CONFIG_OPTION_SUBPIXEL_RENDERING to make the LCD filter examples
+   *   work.
+   *
+   *   {
+   *     FT_Parameter         property1;
+   *     FT_Bool              darken_stems = 1;
+   *
+   *     FT_Parameter         property2;
+   *     FT_LcdFiveTapFilter  custom_weight =
+   *                            { 0x11, 0x44, 0x56, 0x44, 0x11 };
+   *
+   *     FT_Parameter         property3;
+   *     FT_Int32             random_seed = 314159265;
+   *
+   *     FT_Parameter         properties[3] = { property1,
+   *                                            property2,
+   *                                            property3 };
+   *
+   *
+   *     property1.tag  = FT_PARAM_TAG_STEM_DARKENING;
+   *     property1.data = &darken_stems;
+   *
+   *     property2.tag  = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
+   *     property2.data = custom_weight;
+   *
+   *     property3.tag  = FT_PARAM_TAG_RANDOM_SEED;
+   *     property3.data = &random_seed;
+   *
+   *     FT_Face_Properties( face, 3, properties );
+   *   }
+   *
+   *   The next example resets a single property to its default value.
+   *
+   *   {
+   *     FT_Parameter  property;
+   *
+   *
+   *     property.tag  = FT_PARAM_TAG_LCD_FILTER_WEIGHTS;
+   *     property.data = NULL;
+   *
+   *     FT_Face_Properties( face, 1, &property );
+   *   }
+   *
+   * @since:
+   *   2.8
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Face_Properties( FT_Face        face,
+                      FT_UInt        num_properties,
+                      FT_Parameter*  properties );
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
   /*    FT_Get_Name_Index                                                  */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return the glyph index of a given glyph name.  This function uses  */
-  /*    driver specific objects to do the translation.                     */
+  /*    Return the glyph index of a given glyph name.                      */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face       :: A handle to the source face object.                  */
@@ -3331,8 +3909,10 @@
    *   FT_SUBGLYPH_FLAG_XXX
    *
    * @description:
-   *   A list of constants used to describe subglyphs.  Please refer to the
-   *   TrueType specification for the meaning of the various flags.
+   *   A list of constants describing subglyphs.  Please refer to the
+   *   `glyf' table description in the OpenType specification for the
+   *   meaning of the various flags (which get synthesized for
+   *   non-OpenType subglyphs).
    *
    * @values:
    *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
@@ -3393,7 +3973,7 @@
    * @note:
    *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
    *   interpreted depending on the flags returned in `*p_flags'.  See the
-   *   TrueType specification for details.
+   *   OpenType specification for details.
    *
    */
   FT_EXPORT( FT_Error )
@@ -3419,7 +3999,7 @@
   /*    and subsetting restrictions associated with a font.                */
   /*                                                                       */
   /*    See                                                                */
-  /*    http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */
+  /*    https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */
   /*    for more details.                                                  */
   /*                                                                       */
   /* <Values>                                                              */
@@ -3433,30 +4013,31 @@
   /*      the font software copyright owner.                               */
   /*                                                                       */
   /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */
-  /*      If this bit is set, the font may be embedded and temporarily     */
-  /*      loaded on the remote system.  Documents containing Preview &     */
-  /*      Print fonts must be opened `read-only'; no edits can be applied  */
-  /*      to the document.                                                 */
+  /*      The font may be embedded and temporarily loaded on the remote    */
+  /*      system.  Documents containing Preview & Print fonts must be      */
+  /*      opened `read-only'; no edits can be applied to the document.     */
   /*                                                                       */
   /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */
-  /*      If this bit is set, the font may be embedded but must only be    */
-  /*      installed temporarily on other systems.  In contrast to Preview  */
-  /*      & Print fonts, documents containing editable fonts may be opened */
-  /*      for reading, editing is permitted, and changes may be saved.     */
+  /*      The font may be embedded but must only be installed temporarily  */
+  /*      on other systems.  In contrast to Preview & Print fonts,         */
+  /*      documents containing editable fonts may be opened for reading,   */
+  /*      editing is permitted, and changes may be saved.                  */
   /*                                                                       */
   /*    FT_FSTYPE_NO_SUBSETTING ::                                         */
-  /*      If this bit is set, the font may not be subsetted prior to       */
-  /*      embedding.                                                       */
+  /*      The font may not be subsetted prior to embedding.                */
   /*                                                                       */
   /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */
-  /*      If this bit is set, only bitmaps contained in the font may be    */
-  /*      embedded; no outline data may be embedded.  If there are no      */
-  /*      bitmaps available in the font, then the font is unembeddable.    */
+  /*      Only bitmaps contained in the font may be embedded; no outline   */
+  /*      data may be embedded.  If there are no bitmaps available in the  */
+  /*      font, then the font is unembeddable.                             */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    While the fsType flags can indicate that a font may be embedded, a */
-  /*    license with the font vendor may be separately required to use the */
-  /*    font in this way.                                                  */
+  /*    The flags are ORed together, thus more than a single value can be  */
+  /*    returned.                                                          */
+  /*                                                                       */
+  /*    While the `fsType' flags can indicate that a font may be embedded, */
+  /*    a license with the font vendor may be separately required to use   */
+  /*    the font in this way.                                              */
   /*                                                                       */
 #define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000
 #define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002
@@ -3472,13 +4053,13 @@
   /*    FT_Get_FSType_Flags                                                */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return the fsType flags for a font.                                */
+  /*    Return the `fsType' flags for a font.                              */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face :: A handle to the source face object.                        */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */
+  /*    The `fsType' flags, see @FT_FSTYPE_XXX.                            */
   /*                                                                       */
   /* <Note>                                                                */
   /*    Use this function rather than directly reading the `fs_type' field */
@@ -3498,39 +4079,51 @@
   /*    glyph_variants                                                     */
   /*                                                                       */
   /* <Title>                                                               */
-  /*    Glyph Variants                                                     */
+  /*    Unicode Variation Sequences                                        */
   /*                                                                       */
   /* <Abstract>                                                            */
-  /*    The FreeType~2 interface to Unicode Ideographic Variation          */
-  /*    Sequences (IVS), using the SFNT cmap format~14.                    */
+  /*    The FreeType~2 interface to Unicode Variation Sequences (UVS),     */
+  /*    using the SFNT cmap format~14.                                     */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Many CJK characters have variant forms.  They are a sort of grey   */
-  /*    area somewhere between being totally irrelevant and semantically   */
-  /*    distinct; for this reason, the Unicode consortium decided to       */
-  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */
-  /*    Unicode base character and one of 240 variant selectors            */
-  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */
-  /*    code range for CJK characters.                                     */
+  /*    Many characters, especially for CJK scripts, have variant forms.   */
+  /*    They are a sort of grey area somewhere between being totally       */
+  /*    irrelevant and semantically distinct; for this reason, the Unicode */
+  /*    consortium decided to introduce Variation Sequences (VS),          */
+  /*    consisting of a Unicode base character and a variation selector    */
+  /*    instead of further extending the already huge number of            */
+  /*    characters.                                                        */
   /*                                                                       */
-  /*    An IVS is registered and unique; for further details please refer  */
-  /*    to Unicode Technical Standard #37, the Ideographic Variation       */
-  /*    Database:                                                          */
+  /*    Unicode maintains two different sets, namely `Standardized         */
+  /*    Variation Sequences' and registered `Ideographic Variation         */
+  /*    Sequences' (IVS), collected in the `Ideographic Variation          */
+  /*    Database' (IVD).                                                   */
   /*                                                                       */
-  /*      http://www.unicode.org/reports/tr37/                             */
+  /*      https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt */
+  /*      https://unicode.org/reports/tr37/                                */
+  /*      https://unicode.org/ivd/                                         */
   /*                                                                       */
-  /*    To date (November 2014), the character with the most variants is   */
-  /*    U+9089, having 32 such IVS.                                        */
+  /*    To date (January 2017), the character with the most ideographic    */
+  /*    variations is U+9089, having 32 such IVS.                          */
   /*                                                                       */
-  /*    Adobe and MS decided to support IVS with a new cmap subtable       */
-  /*    (format~14).  It is an odd subtable because it is not a mapping of */
-  /*    input code points to glyphs, but contains lists of all variants    */
-  /*    supported by the font.                                             */
+  /*    Three Mongolian Variation Selectors have the values U+180B-U+180D; */
+  /*    256 generic Variation Selectors are encoded in the ranges          */
+  /*    U+FE00-U+FE0F and U+E0100-U+E01EF.  IVS currently use Variation    */
+  /*    Selectors from the range U+E0100-U+E01EF only.                     */
   /*                                                                       */
-  /*    A variant may be either `default' or `non-default'.  A default     */
-  /*    variant is the one you will get for that code point if you look it */
-  /*    up in the standard Unicode cmap.  A non-default variant is a       */
-  /*    different glyph.                                                   */
+  /*    A VS consists of the base character value followed by a single     */
+  /*    Variation Selector.  For example, to get the first variation of    */
+  /*    U+9089, you have to write the character sequence `U+9089 U+E0100'. */
+  /*                                                                       */
+  /*    Adobe and MS decided to support both standardized and ideographic  */
+  /*    VS with a new cmap subtable (format~14).  It is an odd subtable    */
+  /*    because it is not a mapping of input code points to glyphs, but    */
+  /*    contains lists of all variations supported by the font.            */
+  /*                                                                       */
+  /*    A variation may be either `default' or `non-default' for a given   */
+  /*    font.  A default variation is the one you will get for that code   */
+  /*    point if you look it up in the standard Unicode cmap.  A           */
+  /*    non-default variation is a different glyph.                        */
   /*                                                                       */
   /*************************************************************************/
 
@@ -3586,8 +4179,8 @@
   /*    FT_Face_GetCharVariantIsDefault                                    */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Check whether this variant of this Unicode character is the one to */
-  /*    be found in the `cmap'.                                            */
+  /*    Check whether this variation of this Unicode character is the one  */
+  /*    to be found in the `cmap'.                                         */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face ::                                                            */
@@ -3601,7 +4194,7 @@
   /*                                                                       */
   /* <Return>                                                              */
   /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */
-  /*    variation selector cmap, or -1 if it is not a variant.             */
+  /*    variation selector cmap, or -1 if it is not a variation.           */
   /*                                                                       */
   /* <Note>                                                                */
   /*    This function is only meaningful if the font has a variation       */
@@ -3622,7 +4215,7 @@
   /*    FT_Face_GetVariantSelectors                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    Return a zero-terminated list of Unicode variation selectors found */
   /*    in the font.                                                       */
   /*                                                                       */
   /* <Input>                                                               */
@@ -3631,7 +4224,7 @@
   /*                                                                       */
   /* <Return>                                                              */
   /*    A pointer to an array of selector code points, or NULL if there is */
-  /*    no valid variant selector cmap subtable.                           */
+  /*    no valid variation selector cmap subtable.                         */
   /*                                                                       */
   /* <Note>                                                                */
   /*    The last item in the array is~0; the array is owned by the         */
@@ -3651,7 +4244,7 @@
   /*    FT_Face_GetVariantsOfChar                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    Return a zero-terminated list of Unicode variation selectors found */
   /*    for the specified character code.                                  */
   /*                                                                       */
   /* <Input>                                                               */
@@ -3662,7 +4255,7 @@
   /*      The character codepoint in Unicode.                              */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    A pointer to an array of variant selector code points that are     */
+  /*    A pointer to an array of variation selector code points that are   */
   /*    active for the given character, or NULL if the corresponding list  */
   /*    is empty.                                                          */
   /*                                                                       */
@@ -3686,19 +4279,19 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return a zero-terminated list of Unicode character codes found for */
-  /*    the specified variant selector.                                    */
+  /*    the specified variation selector.                                  */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face ::                                                            */
   /*      A handle to the source face object.                              */
   /*                                                                       */
   /*    variantSelector ::                                                 */
-  /*      The variant selector code point in Unicode.                      */
+  /*      The variation selector code point in Unicode.                    */
   /*                                                                       */
   /* <Return>                                                              */
   /*    A list of all the code points that are specified by this selector  */
   /*    (both default and non-default codes are returned) or NULL if there */
-  /*    is no valid cmap or the variant selector is invalid.               */
+  /*    is no valid cmap or the variation selector is invalid.             */
   /*                                                                       */
   /* <Note>                                                                */
   /*    The last item in the array is~0; the array is owned by the         */
@@ -3748,16 +4341,17 @@
   /*    FT_MulDiv                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to perform the computation `(a*b)/c'   */
-  /*    with maximum accuracy (it uses a 64-bit intermediate integer       */
-  /*    whenever necessary).                                               */
+  /*    Compute `(a*b)/c' with maximum accuracy, using a 64-bit            */
+  /*    intermediate integer whenever necessary.                           */
   /*                                                                       */
   /*    This function isn't necessarily as fast as some processor specific */
   /*    operations, but is at least completely portable.                   */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The first multiplier.                                         */
+  /*                                                                       */
   /*    b :: The second multiplier.                                        */
+  /*                                                                       */
   /*    c :: The divisor.                                                  */
   /*                                                                       */
   /* <Return>                                                              */
@@ -3777,12 +4371,12 @@
   /*    FT_MulFix                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to perform the computation             */
-  /*    `(a*b)/0x10000' with maximum accuracy.  Most of the time this is   */
-  /*    used to multiply a given value by a 16.16 fixed-point factor.      */
+  /*    Compute `(a*b)/0x10000' with maximum accuracy.  Its main use is to */
+  /*    multiply a given value by a 16.16 fixed-point factor.              */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The first multiplier.                                         */
+  /*                                                                       */
   /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
   /*         possible (see note below).                                    */
   /*                                                                       */
@@ -3811,12 +4405,12 @@
   /*    FT_DivFix                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to perform the computation             */
-  /*    `(a*0x10000)/b' with maximum accuracy.  Most of the time, this is  */
-  /*    used to divide a given value by a 16.16 fixed-point factor.        */
+  /*    Compute `(a*0x10000)/b' with maximum accuracy.  Its main use is to */
+  /*    divide a given value by a 16.16 fixed-point factor.                */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The numerator.                                                */
+  /*                                                                       */
   /*    b :: The denominator.  Use a 16.16 factor here.                    */
   /*                                                                       */
   /* <Return>                                                              */
@@ -3833,13 +4427,17 @@
   /*    FT_RoundFix                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to round a 16.16 fixed number.         */
+  /*    Round a 16.16 fixed number.                                        */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The number to be rounded.                                     */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The result of `(a + 0x8000) & -0x10000'.                           */
+  /*    `a' rounded to the nearest 16.16 fixed integer, halfway cases away */
+  /*    from zero.                                                         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses wrap-around arithmetic.                          */
   /*                                                                       */
   FT_EXPORT( FT_Fixed )
   FT_RoundFix( FT_Fixed  a );
@@ -3851,14 +4449,16 @@
   /*    FT_CeilFix                                                         */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to compute the ceiling function of a   */
-  /*    16.16 fixed number.                                                */
+  /*    Compute the smallest following integer of a 16.16 fixed number.    */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The number for which the ceiling function is to be computed.  */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */
+  /*    `a' rounded towards plus infinity.                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses wrap-around arithmetic.                          */
   /*                                                                       */
   FT_EXPORT( FT_Fixed )
   FT_CeilFix( FT_Fixed  a );
@@ -3870,14 +4470,13 @@
   /*    FT_FloorFix                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A very simple function used to compute the floor function of a     */
-  /*    16.16 fixed number.                                                */
+  /*    Compute the largest previous integer of a 16.16 fixed number.      */
   /*                                                                       */
   /* <Input>                                                               */
   /*    a :: The number for which the floor function is to be computed.    */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The result of `a & -0x10000'.                                      */
+  /*    `a' rounded towards minus infinity.                                */
   /*                                                                       */
   FT_EXPORT( FT_Fixed )
   FT_FloorFix( FT_Fixed  a );
@@ -3957,8 +4556,8 @@
    *
    */
 #define FREETYPE_MAJOR  2
-#define FREETYPE_MINOR  6
-#define FREETYPE_PATCH  0
+#define FREETYPE_MINOR  9
+#define FREETYPE_PATCH  1
 
 
   /*************************************************************************/
@@ -4003,20 +4602,13 @@
   /*    FT_Face_CheckTrueTypePatents                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Parse all bytecode instructions of a TrueType font file to check   */
-  /*    whether any of the patented opcodes are used.  This is only useful */
-  /*    if you want to be able to use the unpatented hinter with           */
-  /*    fonts that do *not* use these opcodes.                             */
-  /*                                                                       */
-  /*    Note that this function parses *all* glyph instructions in the     */
-  /*    font file, which may be slow.                                      */
+  /*    Deprecated, does nothing.                                          */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face :: A face handle.                                             */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    1~if this is a TrueType font that uses one of the patented         */
-  /*    opcodes, 0~otherwise.                                              */
+  /*    Always returns false.                                              */
   /*                                                                       */
   /* <Note>                                                                */
   /*    Since May 2010, TrueType hinting is no longer patented.            */
@@ -4034,9 +4626,7 @@
   /*    FT_Face_SetUnpatentedHinting                                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Enable or disable the unpatented hinter for a given face.          */
-  /*    Only enable it if you have determined that the face doesn't        */
-  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */
+  /*    Deprecated, does nothing.                                          */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face  :: A face handle.                                            */
@@ -4044,9 +4634,7 @@
   /*    value :: New boolean setting.                                      */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The old setting value.  This will always be false if this is not   */
-  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */
-  /*    instance of the library.                                           */
+  /*    Always returns false.                                              */
   /*                                                                       */
   /* <Note>                                                                */
   /*    Since May 2010, TrueType hinting is no longer patented.            */
@@ -4063,7 +4651,7 @@
 
 FT_END_HEADER
 
-#endif /* __FREETYPE_H__ */
+#endif /* FREETYPE_H_ */
 
 
 /* END */
diff --git a/include/ftadvanc.h b/include/freetype/ftadvanc.h
similarity index 98%
rename from include/ftadvanc.h
rename to include/freetype/ftadvanc.h
index b4d2aed..f78e8b1 100644
--- a/include/ftadvanc.h
+++ b/include/freetype/ftadvanc.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Quick computation of advance widths (specification only).            */
 /*                                                                         */
-/*  Copyright 2008-2015 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTADVANC_H__
-#define __FTADVANC_H__
+#ifndef FTADVANC_H_
+#define FTADVANC_H_
 
 
 #include <ft2build.h>
@@ -181,7 +181,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTADVANC_H__ */
+#endif /* FTADVANC_H_ */
 
 
 /* END */
diff --git a/include/ftbbox.h b/include/freetype/ftbbox.h
similarity index 95%
rename from include/ftbbox.h
rename to include/freetype/ftbbox.h
index 9d9d040..f9eb70b 100644
--- a/include/ftbbox.h
+++ b/include/freetype/ftbbox.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType exact bbox computation (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,8 +27,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTBBOX_H__
-#define __FTBBOX_H__
+#ifndef FTBBOX_H_
+#define FTBBOX_H_
 
 
 #include <ft2build.h>
@@ -61,7 +61,7 @@
   /*    Compute the exact bounding box of an outline.  This is slower      */
   /*    than computing the control box.  However, it uses an advanced      */
   /*    algorithm that returns _very_ quickly when the two boxes           */
-  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
+  /*    coincide.  Otherwise, the outline Bezier arcs are traversed to     */
   /*    extract their extrema.                                             */
   /*                                                                       */
   /* <Input>                                                               */
@@ -90,7 +90,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTBBOX_H__ */
+#endif /* FTBBOX_H_ */
 
 
 /* END */
diff --git a/include/ftbdf.h b/include/freetype/ftbdf.h
similarity index 97%
rename from include/ftbdf.h
rename to include/freetype/ftbdf.h
index 0bdabf4..1b6dea6 100644
--- a/include/ftbdf.h
+++ b/include/freetype/ftbdf.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing BDF-specific strings (specification).     */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTBDF_H__
-#define __FTBDF_H__
+#ifndef FTBDF_H_
+#define FTBDF_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -204,7 +204,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTBDF_H__ */
+#endif /* FTBDF_H_ */
 
 
 /* END */
diff --git a/include/ftbitmap.h b/include/freetype/ftbitmap.h
similarity index 98%
rename from include/ftbitmap.h
rename to include/freetype/ftbitmap.h
index 46cc47b..a43187c 100644
--- a/include/ftbitmap.h
+++ b/include/freetype/ftbitmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility functions for bitmaps (specification).              */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTBITMAP_H__
-#define __FTBITMAP_H__
+#ifndef FTBITMAP_H_
+#define FTBITMAP_H_
 
 
 #include <ft2build.h>
@@ -97,7 +97,7 @@
   FT_EXPORT( FT_Error )
   FT_Bitmap_Copy( FT_Library        library,
                   const FT_Bitmap  *source,
-                  FT_Bitmap        *target);
+                  FT_Bitmap        *target );
 
 
   /*************************************************************************/
@@ -234,7 +234,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTBITMAP_H__ */
+#endif /* FTBITMAP_H_ */
 
 
 /* END */
diff --git a/include/ftbzip2.h b/include/freetype/ftbzip2.h
similarity index 96%
rename from include/ftbzip2.h
rename to include/freetype/ftbzip2.h
index c25f946..6edfa03 100644
--- a/include/ftbzip2.h
+++ b/include/freetype/ftbzip2.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Bzip2-compressed stream support.                                     */
 /*                                                                         */
-/*  Copyright 2010-2015 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  Joel Klinghed.                                                         */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTBZIP2_H__
-#define __FTBZIP2_H__
+#ifndef FTBZIP2_H_
+#define FTBZIP2_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -96,7 +96,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTBZIP2_H__ */
+#endif /* FTBZIP2_H_ */
 
 
 /* END */
diff --git a/include/ftcache.h b/include/freetype/ftcache.h
similarity index 97%
rename from include/ftcache.h
rename to include/freetype/ftcache.h
index 68525bb..52d5f00 100644
--- a/include/ftcache.h
+++ b/include/freetype/ftcache.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache subsystem (specification).                            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTCACHE_H__
-#define __FTCACHE_H__
+#ifndef FTCACHE_H_
+#define FTCACHE_H_
 
 
 #include <ft2build.h>
@@ -540,13 +540,6 @@
                             FTC_FaceID   face_id );
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
   /*************************************************************************
    *
    * @type:
@@ -624,14 +617,6 @@
 
 
   /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -749,7 +734,7 @@
   /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */
   /*              failure.                                                 */
   /*                                                                       */
-  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*    anode  :: Used to return the address of the corresponding cache    */
   /*              node after incrementing its reference count (see note    */
   /*              below).                                                  */
   /*                                                                       */
@@ -802,7 +787,7 @@
   /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */
   /*                  failure.                                             */
   /*                                                                       */
-  /*    anode      :: Used to return the address of of the corresponding   */
+  /*    anode      :: Used to return the address of the corresponding      */
   /*                  cache node after incrementing its reference count    */
   /*                  (see note below).                                    */
   /*                                                                       */
@@ -957,7 +942,7 @@
   /* <Output>                                                              */
   /*    sbit   :: A handle to a small bitmap descriptor.                   */
   /*                                                                       */
-  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*    anode  :: Used to return the address of the corresponding cache    */
   /*              node after incrementing its reference count (see note    */
   /*              below).                                                  */
   /*                                                                       */
@@ -1012,7 +997,7 @@
   /* <Output>                                                              */
   /*    sbit       :: A handle to a small bitmap descriptor.               */
   /*                                                                       */
-  /*    anode      :: Used to return the address of of the corresponding   */
+  /*    anode      :: Used to return the address of the corresponding      */
   /*                  cache node after incrementing its reference count    */
   /*                  (see note below).                                    */
   /*                                                                       */
@@ -1051,7 +1036,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTCACHE_H__ */
+#endif /* FTCACHE_H_ */
 
 
 /* END */
diff --git a/include/ftchapters.h b/include/freetype/ftchapters.h
similarity index 86%
rename from include/ftchapters.h
rename to include/freetype/ftchapters.h
index d333761..51257bb 100644
--- a/include/ftchapters.h
+++ b/include/freetype/ftchapters.h
@@ -76,7 +76,11 @@
 /* <Sections>                                                              */
 /*    auto_hinter                                                          */
 /*    cff_driver                                                           */
+/*    t1_cid_driver                                                        */
 /*    tt_driver                                                            */
+/*    pcf_driver                                                           */
+/*    properties                                                           */
+/*    parameter_tags                                                       */
 /*                                                                         */
 /***************************************************************************/
 
@@ -119,3 +123,17 @@
 /*    lcd_filtering                                                        */
 /*                                                                         */
 /***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    error_codes                                                          */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Error Codes                                                          */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    error_enumerations                                                   */
+/*    error_code_values                                                    */
+/*                                                                         */
+/***************************************************************************/
diff --git a/include/ftcid.h b/include/freetype/ftcid.h
similarity index 94%
rename from include/ftcid.h
rename to include/freetype/ftcid.h
index 05741c8..5e9100a 100644
--- a/include/ftcid.h
+++ b/include/freetype/ftcid.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing CID font information (specification).     */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Dereg Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTCID_H__
-#define __FTCID_H__
+#ifndef FTCID_H_
+#define FTCID_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -87,7 +87,7 @@
   FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
                                            const char*  *registry,
                                            const char*  *ordering,
-                                           FT_Int       *supplement);
+                                           FT_Int       *supplement );
 
 
   /**********************************************************************
@@ -97,8 +97,8 @@
    *
    * @description:
    *    Retrieve the type of the input face, CID keyed or not.  In
-   *    constrast to the @FT_IS_CID_KEYED macro this function returns
-   *    successfully also for CID-keyed fonts in an SNFT wrapper.
+   *    contrast to the @FT_IS_CID_KEYED macro this function returns
+   *    successfully also for CID-keyed fonts in an SFNT wrapper.
    *
    * @input:
    *    face ::
@@ -162,7 +162,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTCID_H__ */
+#endif /* FTCID_H_ */
 
 
 /* END */
diff --git a/include/freetype/ftdriver.h b/include/freetype/ftdriver.h
new file mode 100644
index 0000000..e90475b
--- /dev/null
+++ b/include/freetype/ftdriver.h
@@ -0,0 +1,1225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdriver.h                                                             */
+/*                                                                         */
+/*    FreeType API for controlling driver modules (specification only).    */
+/*                                                                         */
+/*  Copyright 2017-2018 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 FTDRIVER_H_
+#define FTDRIVER_H_
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_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:
+   *   auto_hinter
+   *
+   * @title:
+   *   The auto-hinter
+   *
+   * @abstract:
+   *   Controlling the auto-hinting module.
+   *
+   * @description:
+   *   While FreeType's auto-hinter doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   Note that the auto-hinter's module name is `autofitter' for
+   *   historical reasons.
+   *
+   *   Available properties are @increase-x-height, @no-stem-darkening
+   *   (experimental), @darkening-parameters (experimental), @warping
+   *   (experimental), @glyph-to-script-map (experimental), @fallback-script
+   *   (experimental), and @default-script (experimental), as documented in
+   *   the @properties section.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   cff_driver
+   *
+   * @title:
+   *   The CFF driver
+   *
+   * @abstract:
+   *   Controlling the CFF driver module.
+   *
+   * @description:
+   *   While FreeType's CFF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.
+   *
+   *   The CFF driver's module name is `cff'.
+   *
+   *   Available properties are @hinting-engine, @no-stem-darkening,
+   *   @darkening-parameters, and @random-seed, as documented in the
+   *   @properties section.
+   *
+   *
+   *   *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine*
+   *
+   *   The rasterizer is positioning horizontal features (e.g., ascender
+   *   height & x-height, or crossbars) on the pixel grid and minimizing the
+   *   amount of antialiasing applied to them, while placing vertical
+   *   features (vertical stems) on the pixel grid without hinting, thus
+   *   representing the stem position and weight accurately.  Sometimes the
+   *   vertical stems may be only partially black.  In this context,
+   *   `antialiasing' means that stems are not positioned exactly on pixel
+   *   borders, causing a fuzzy appearance.
+   *
+   *   There are two principles behind this approach.
+   *
+   *   1) No hinting in the horizontal direction: Unlike `superhinted'
+   *   TrueType, which changes glyph widths to accommodate regular
+   *   inter-glyph spacing, Adobe's approach is `faithful to the design' in
+   *   representing both the glyph width and the inter-glyph spacing
+   *   designed for the font.  This makes the screen display as close as it
+   *   can be to the result one would get with infinite resolution, while
+   *   preserving what is considered the key characteristics of each glyph.
+   *   Note that the distances between unhinted and grid-fitted positions at
+   *   small sizes are comparable to kerning values and thus would be
+   *   noticeable (and distracting) while reading if hinting were applied.
+   *
+   *   One of the reasons to not hint horizontally is antialiasing for LCD
+   *   screens: The pixel geometry of modern displays supplies three
+   *   vertical subpixels as the eye moves horizontally across each visible
+   *   pixel.  On devices where we can be certain this characteristic is
+   *   present a rasterizer can take advantage of the subpixels to add
+   *   increments of weight.  In Western writing systems this turns out to
+   *   be the more critical direction anyway; the weights and spacing of
+   *   vertical stems (see above) are central to Armenian, Cyrillic, Greek,
+   *   and Latin type designs.  Even when the rasterizer uses greyscale
+   *   antialiasing instead of color (a necessary compromise when one
+   *   doesn't know the screen characteristics), the unhinted vertical
+   *   features preserve the design's weight and spacing much better than
+   *   aliased type would.
+   *
+   *   2) Alignment in the vertical direction: Weights and spacing along the
+   *   y~axis are less critical; what is much more important is the visual
+   *   alignment of related features (like cap-height and x-height).  The
+   *   sense of alignment for these is enhanced by the sharpness of grid-fit
+   *   edges, while the cruder vertical resolution (full pixels instead of
+   *   1/3 pixels) is less of a problem.
+   *
+   *   On the technical side, horizontal alignment zones for ascender,
+   *   x-height, and other important height values (traditionally called
+   *   `blue zones') as defined in the font are positioned independently,
+   *   each being rounded to the nearest pixel edge, taking care of
+   *   overshoot suppression at small sizes, stem darkening, and scaling.
+   *
+   *   Hstems (this is, hint values defined in the font to help align
+   *   horizontal features) that fall within a blue zone are said to be
+   *   `captured' and are aligned to that zone.  Uncaptured stems are moved
+   *   in one of four ways, top edge up or down, bottom edge up or down.
+   *   Unless there are conflicting hstems, the smallest movement is taken
+   *   to minimize distortion.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   pcf_driver
+   *
+   * @title:
+   *   The PCF driver
+   *
+   * @abstract:
+   *   Controlling the PCF driver module.
+   *
+   * @description:
+   *   While FreeType's PCF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  Right now, there is a single property
+   *   @no-long-family-names available if FreeType is compiled with
+   *   PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
+   *
+   *   The PCF driver's module name is `pcf'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   t1_cid_driver
+   *
+   * @title:
+   *   The Type 1 and CID drivers
+   *
+   * @abstract:
+   *   Controlling the Type~1 and CID driver modules.
+   *
+   * @description:
+   *   It is possible to control the behaviour of FreeType's Type~1 and
+   *   Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get.
+   *
+   *   Behind the scenes, both drivers use the Adobe CFF engine for hinting;
+   *   however, the used properties must be specified separately.
+   *
+   *   The Type~1 driver's module name is `type1'; the CID driver's module
+   *   name is `t1cid'.
+   *
+   *   Available properties are @hinting-engine, @no-stem-darkening,
+   *   @darkening-parameters, and @random-seed, as documented in the
+   *   @properties section.
+   *
+   *   Please see the @cff_driver section for more details on the new
+   *   hinting engine.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   tt_driver
+   *
+   * @title:
+   *   The TrueType driver
+   *
+   * @abstract:
+   *   Controlling the TrueType driver module.
+   *
+   * @description:
+   *   While FreeType's TrueType driver doesn't expose API functions by
+   *   itself, it is possible to control its behaviour with @FT_Property_Set
+   *   and @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The TrueType driver's module name is `truetype'.
+   *
+   *   A single property @interpreter-version is available, as documented in
+   *   the @properties section.
+   *
+   *   We start with a list of definitions, kindly provided by Greg
+   *   Hitchcock.
+   *
+   *   _Bi-Level_ _Rendering_
+   *
+   *   Monochromatic rendering, exclusively used in the early days of
+   *   TrueType by both Apple and Microsoft.  Microsoft's GDI interface
+   *   supported hinting of the right-side bearing point, such that the
+   *   advance width could be non-linear.  Most often this was done to
+   *   achieve some level of glyph symmetry.  To enable reasonable
+   *   performance (e.g., not having to run hinting on all glyphs just to
+   *   get the widths) there was a bit in the head table indicating if the
+   *   side bearing was hinted, and additional tables, `hdmx' and `LTSH', to
+   *   cache hinting widths across multiple sizes and device aspect ratios.
+   *
+   *   _Font_ _Smoothing_
+   *
+   *   Microsoft's GDI implementation of anti-aliasing.  Not traditional
+   *   anti-aliasing as the outlines were hinted before the sampling.  The
+   *   widths matched the bi-level rendering.
+   *
+   *   _ClearType_ _Rendering_
+   *
+   *   Technique that uses physical subpixels to improve rendering on LCD
+   *   (and other) displays.  Because of the higher resolution, many methods
+   *   of improving symmetry in glyphs through hinting the right-side
+   *   bearing were no longer necessary.  This lead to what GDI calls
+   *   `natural widths' ClearType, see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec21.  Since hinting
+   *   has extra resolution, most non-linearity went away, but it is still
+   *   possible for hints to change the advance widths in this mode.
+   *
+   *   _ClearType_ _Compatible_ _Widths_
+   *
+   *   One of the earliest challenges with ClearType was allowing the
+   *   implementation in GDI to be selected without requiring all UI and
+   *   documents to reflow.  To address this, a compatible method of
+   *   rendering ClearType was added where the font hints are executed once
+   *   to determine the width in bi-level rendering, and then re-run in
+   *   ClearType, with the difference in widths being absorbed in the font
+   *   hints for ClearType (mostly in the white space of hints); see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec20.  Somewhat by
+   *   definition, compatible width ClearType allows for non-linear widths,
+   *   but only when the bi-level version has non-linear widths.
+   *
+   *   _ClearType_ _Subpixel_ _Positioning_
+   *
+   *   One of the nice benefits of ClearType is the ability to more crisply
+   *   display fractional widths; unfortunately, the GDI model of integer
+   *   bitmaps did not support this.  However, the WPF and Direct Write
+   *   frameworks do support fractional widths.  DWrite calls this `natural
+   *   mode', not to be confused with GDI's `natural widths'.  Subpixel
+   *   positioning, in the current implementation of Direct Write,
+   *   unfortunately does not support hinted advance widths, see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec22.  Note that the
+   *   TrueType interpreter fully allows the advance width to be adjusted in
+   *   this mode, just the DWrite client will ignore those changes.
+   *
+   *   _ClearType_ _Backward_ _Compatibility_
+   *
+   *   This is a set of exceptions made in the TrueType interpreter to
+   *   minimize hinting techniques that were problematic with the extra
+   *   resolution of ClearType; see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec1 and
+   *   https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
+   *   This technique is not to be confused with ClearType compatible
+   *   widths.  ClearType backward compatibility has no direct impact on
+   *   changing advance widths, but there might be an indirect impact on
+   *   disabling some deltas.  This could be worked around in backward
+   *   compatibility mode.
+   *
+   *   _Native_ _ClearType_ _Mode_
+   *
+   *   (Not to be confused with `natural widths'.)  This mode removes all
+   *   the exceptions in the TrueType interpreter when running with
+   *   ClearType.  Any issues on widths would still apply, though.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   properties
+   *
+   * @title:
+   *   Driver properties
+   *
+   * @abstract:
+   *   Controlling driver modules.
+   *
+   * @description:
+   *   Driver modules can be controlled by setting and unsetting properties,
+   *   using the functions @FT_Property_Set and @FT_Property_Get.  This
+   *   section documents the available properties, together with auxiliary
+   *   macros and structures.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_HINTING_XXX
+   *
+   * @description:
+   *   A list of constants used for the @hinting-engine property to
+   *   select the hinting engine for CFF, Type~1, and CID fonts.
+   *
+   * @values:
+   *   FT_HINTING_FREETYPE ::
+   *     Use the old FreeType hinting engine.
+   *
+   *   FT_HINTING_ADOBE ::
+   *     Use the hinting engine contributed by Adobe.
+   *
+   * @since:
+   *   2.9
+   *
+   */
+#define FT_HINTING_FREETYPE  0
+#define FT_HINTING_ADOBE     1
+
+  /* these constants (introduced in 2.4.12) are deprecated */
+#define FT_CFF_HINTING_FREETYPE  FT_HINTING_FREETYPE
+#define FT_CFF_HINTING_ADOBE     FT_HINTING_ADOBE
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   hinting-engine
+   *
+   * @description:
+   *   Thanks to Adobe, which contributed a new hinting (and parsing)
+   *   engine, an application can select between `freetype' and `adobe' if
+   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
+   *   macro isn't defined, `hinting-engine' does nothing.
+   *
+   *   The same holds for the Type~1 and CID modules if compiled with
+   *   T1_CONFIG_OPTION_OLD_ENGINE.
+   *
+   *   For the `cff' module, the default engine is `freetype' if
+   *   CFF_CONFIG_OPTION_OLD_ENGINE is defined, and `adobe' otherwise.
+   *
+   *   For both the `type1' and `t1cid' modules, the default engine is
+   *   `freetype' if T1_CONFIG_OPTION_OLD_ENGINE is defined, and `adobe'
+   *   otherwise.
+   *
+   *   The following example code demonstrates how to select Adobe's hinting
+   *   engine for the `cff' module (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "hinting-engine", &hinting_engine );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values `adobe' or `freetype').
+   *
+   * @since:
+   *   2.4.12 (for `cff' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-stem-darkening
+   *
+   * @description:
+   *   All glyphs that pass through the auto-hinter will be emboldened
+   *   unless this property is set to TRUE.  The same is true for the CFF,
+   *   Type~1, and CID font modules if the `Adobe' engine is selected (which
+   *   is the default).
+   *
+   *   Stem darkening emboldens glyphs at smaller sizes to make them more
+   *   readable on common low-DPI screens when using linear alpha blending
+   *   and gamma correction, see @FT_Render_Glyph.  When not using linear
+   *   alpha blending and gamma correction, glyphs will appear heavy and
+   *   fuzzy!
+   *
+   *   Gamma correction essentially lightens fonts since shades of grey are
+   *   shifted to higher pixel values (=~higher brightness) to match the
+   *   original intention to the reality of our screens.  The side-effect is
+   *   that glyphs `thin out'.  Mac OS~X and Adobe's proprietary font
+   *   rendering library implement a counter-measure: stem darkening at
+   *   smaller sizes where shades of gray dominate.  By emboldening a glyph
+   *   slightly in relation to its pixel size, individual pixels get higher
+   *   coverage of filled-in outlines and are therefore `blacker'.  This
+   *   counteracts the `thinning out' of glyphs, making text remain readable
+   *   at smaller sizes.
+   *
+   *   By default, the Adobe engines for CFF, Type~1, and CID fonts darken
+   *   stems at smaller sizes, regardless of hinting, to enhance contrast. 
+   *   Setting this property, stem darkening gets switched off.
+   *
+   *   For the auto-hinter, stem-darkening is experimental currently and
+   *   thus switched off by default (this is, `no-stem-darkening' is set to
+   *   TRUE by default).  Total consistency with the CFF driver is not
+   *   achieved right now because the emboldening method differs and glyphs
+   *   must be scaled down on the Y-axis to keep outline points inside their
+   *   precomputed blue zones.  The smaller the size (especially 9ppem and
+   *   down), the higher the loss of emboldening versus the CFF driver.
+   *
+   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is
+   *   set.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     no_stem_darkening = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "no-stem-darkening", &no_stem_darkening );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *   It can also be set per face using @FT_Face_Properties with
+   *   @FT_PARAM_TAG_STEM_DARKENING.
+   *
+   * @since:
+   *   2.4.12 (for `cff' module)
+   *
+   *   2.6.2 (for `autofitter' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   darkening-parameters
+   *
+   * @description:
+   *   By default, the Adobe hinting engine, as used by the CFF, Type~1, and
+   *   CID font drivers, darkens stems as follows (if the
+   *   `no-stem-darkening' property isn't set):
+   *
+   *   {
+   *     stem width <= 0.5px:   darkening amount = 0.4px
+   *     stem width  = 1px:     darkening amount = 0.275px
+   *     stem width  = 1.667px: darkening amount = 0.275px
+   *     stem width >= 2.333px: darkening amount = 0px
+   *   }
+   *
+   *   and piecewise linear in-between.  At configuration time, these four
+   *   control points can be set with the macro
+   *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'; the CFF, Type~1, and CID
+   *   drivers share these values.  At runtime, the control points can be
+   *   changed using the `darkening-parameters' property, as the following
+   *   example demonstrates for the Type~1 driver.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
+   *                                      1000, 200,   // x2, y2
+   *                                      1500, 100,   // x3, y3
+   *                                      2000,   0 }; // x4, y4
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "type1",
+   *                               "darkening-parameters", darken_params );
+   *   }
+   *
+   *   The x~values give the stem width, and the y~values the darkening
+   *   amount.  The unit is 1000th of pixels.  All coordinate values must be
+   *   positive; the x~values must be monotonically increasing; the
+   *   y~values must be monotonically decreasing and smaller than or
+   *   equal to 500 (corresponding to half a pixel); the slope of each
+   *   linear piece must be shallower than -1 (e.g., -.4).
+   *
+   *   The auto-hinter provides this property, too, as an experimental
+   *   feature.  See @no-stem-darkening for more.
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable, using eight comma-separated integers without spaces.  Here
+   *   the above example, using `\' to break the line for readability.
+   *
+   *   {
+   *     FREETYPE_PROPERTIES=\
+   *     type1:darkening-parameters=500,300,1000,200,1500,100,2000,0
+   *   }
+   *
+   * @since:
+   *   2.5.1 (for `cff' module)
+   *
+   *   2.6.2 (for `autofitter' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   random-seed
+   *
+   * @description:
+   *   By default, the seed value for the CFF `random' operator and the
+   *   similar `0 28 callothersubr pop' command for the Type~1 and CID
+   *   drivers is set to a random value.  However, mainly for debugging
+   *   purposes, it is often necessary to use a known value as a seed so
+   *   that the pseudo-random number sequences generated by `random' are
+   *   repeatable.
+   *
+   *   The `random-seed' property does that.  Its argument is a signed 32bit
+   *   integer; if the value is zero or negative, the seed given by the
+   *   `intitialRandomSeed' private DICT operator in a CFF file gets used
+   *   (or a default value if there is no such operator).  If the value is
+   *   positive, use it instead of `initialRandomSeed', which is
+   *   consequently ignored.
+   *
+   * @note:
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable.  It can also be set per face using @FT_Face_Properties with
+   *   @FT_PARAM_TAG_RANDOM_SEED.
+   *
+   * @since:
+   *   2.8 (for `cff' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-long-family-names
+   *
+   * @description:
+   *   If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling
+   *   FreeType, the PCF driver constructs long family names.
+   *
+   *   There are many PCF fonts just called `Fixed' which look completely
+   *   different, and which have nothing to do with each other.  When
+   *   selecting `Fixed' in KDE or Gnome one gets results that appear rather
+   *   random, the style changes often if one changes the size and one
+   *   cannot select some fonts at all.  The improve this situation, the PCF
+   *   module prepends the foundry name (plus a space) to the family name.
+   *   It also checks whether there are `wide' characters; all put together,
+   *   family names like `Sony Fixed' or `Misc Fixed Wide' are constructed.
+   *
+   *   If `no-long-family-names' is set, this feature gets switched off.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     no_long_family_names = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "pcf",
+   *                               "no-long-family-names",
+   *                               &no_long_family_names );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *
+   * @since:
+   *   2.8
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   TT_INTERPRETER_VERSION_XXX
+   *
+   * @description:
+   *   A list of constants used for the @interpreter-version property to
+   *   select the hinting engine for Truetype fonts.
+   *
+   *   The numeric value in the constant names represents the version
+   *   number as returned by the `GETINFO' bytecode instruction.
+   *
+   * @values:
+   *   TT_INTERPRETER_VERSION_35 ::
+   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+   *     Windows~98; only grayscale and B/W rasterizing is supported.
+   *
+   *   TT_INTERPRETER_VERSION_38 ::
+   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as can
+   *     be found, for example, in the Internet Explorer~9 running on
+   *     Windows~7).  It is used in FreeType to select the `Infinality'
+   *     subpixel hinting code.  The code may be removed in a future
+   *     version.
+   *
+   *   TT_INTERPRETER_VERSION_40 ::
+   *     Version~40 corresponds to MS rasterizer v.2.1; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as can
+   *     be found, for example, in Microsoft's Edge Browser on Windows~10).
+   *     It is used in FreeType to select the `minimal' subpixel hinting
+   *     code, a stripped-down and higher performance version of the
+   *     `Infinality' code.
+   *
+   * @note:
+   *   This property controls the behaviour of the bytecode interpreter
+   *   and thus how outlines get hinted.  It does *not* control how glyph
+   *   get rasterized!  In particular, it does not control subpixel color
+   *   filtering.
+   *
+   *   If FreeType has not been compiled with the configuration option
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 or~40 causes
+   *   an `FT_Err_Unimplemented_Feature' error.
+   *
+   *   Depending on the graphics framework, Microsoft uses different
+   *   bytecode and rendering engines.  As a consequence, the version
+   *   numbers returned by a call to the `GETINFO' bytecode instruction are
+   *   more convoluted than desired.
+   *
+   *   Here are two tables that try to shed some light on the possible
+   *   values for the MS rasterizer engine, together with the additional
+   *   features introduced by it.
+   *
+   *   {
+   *     GETINFO framework               version feature
+   *     -------------------------------------------------------------------
+   *         3   GDI (Win 3.1),            v1.0  16-bit, first version
+   *             TrueImage
+   *        33   GDI (Win NT 3.1),         v1.5  32-bit
+   *             HP Laserjet
+   *        34   GDI (Win 95)              v1.6  font smoothing,
+   *                                             new SCANTYPE opcode
+   *        35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
+   *                                               bits in composite glyphs
+   *        36   MGDI (Win CE 2)           v1.6+ classic ClearType
+   *        37   GDI (XP and later),       v1.8  ClearType
+   *             GDI+ old (before Vista)
+   *        38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
+   *             WPF                             Y-direction ClearType,
+   *                                             additional error checking
+   *        39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
+   *                                               in GETINFO opcode,
+   *                                             bug fixes
+   *        40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
+   *             DWrite (Win 8)                    in GETINFO opcode,
+   *                                             Gray ClearType
+   *   }
+   *
+   *   The `version' field gives a rough orientation only, since some
+   *   applications provided certain features much earlier (as an example,
+   *   Microsoft Reader used subpixel and Y-direction ClearType already in
+   *   Windows 2000).  Similarly, updates to a given framework might include
+   *   improved hinting support.
+   *
+   *   {
+   *      version   sampling          rendering        comment
+   *               x        y       x           y
+   *     --------------------------------------------------------------
+   *       v1.0   normal  normal  B/W           B/W    bi-level
+   *       v1.6   high    high    gray          gray   grayscale
+   *       v1.8   high    normal  color-filter  B/W    (GDI) ClearType
+   *       v1.9   high    high    color-filter  gray   Color ClearType
+   *       v2.1   high    normal  gray          B/W    Gray ClearType
+   *       v2.1   high    high    gray          gray   Gray ClearType
+   *   }
+   *
+   *   Color and Gray ClearType are the two available variants of
+   *   `Y-direction ClearType', meaning grayscale rasterization along the
+   *   Y-direction; the name used in the TrueType specification for this
+   *   feature is `symmetric smoothing'.  `Classic ClearType' is the
+   *   original algorithm used before introducing a modified version in
+   *   Win~XP.  Another name for v1.6's grayscale rendering is `font
+   *   smoothing', and `Color ClearType' is sometimes also called `DWrite
+   *   ClearType'.  To differentiate between today's Color ClearType and the
+   *   earlier ClearType variant with B/W rendering along the vertical axis,
+   *   the latter is sometimes called `GDI ClearType'.
+   *
+   *   `Normal' and `high' sampling describe the (virtual) resolution to
+   *   access the rasterized outline after the hinting process.  `Normal'
+   *   means 1 sample per grid line (i.e., B/W).  In the current Microsoft
+   *   implementation, `high' means an extra virtual resolution of 16x16 (or
+   *   16x1) grid lines per pixel for bytecode instructions like `MIRP'.
+   *   After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid
+   *   lines for color filtering if Color ClearType is activated.
+   *
+   *   Note that `Gray ClearType' is essentially the same as v1.6's
+   *   grayscale rendering.  However, the GETINFO instruction handles it
+   *   differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1
+   *   returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing),
+   *   and~19 (Gray ClearType).  Also, this mode respects bits 2 and~3 for
+   *   the version~1 gasp table exclusively (like Color ClearType), while
+   *   v1.6 only respects the values of version~0 (bits 0 and~1).
+   *
+   *   Keep in mind that the features of the above interpreter versions
+   *   might not map exactly to FreeType features or behavior because it is
+   *   a fundamentally different library with different internals.
+   *
+   */
+#define TT_INTERPRETER_VERSION_35  35
+#define TT_INTERPRETER_VERSION_38  38
+#define TT_INTERPRETER_VERSION_40  40
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   interpreter-version
+   *
+   * @description:
+   *   Currently, three versions are available, two representing the
+   *   bytecode interpreter with subpixel hinting support (old `Infinality'
+   *   code and new stripped-down and higher performance `minimal' code) and
+   *   one without, respectively.  The default is subpixel support if
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel support
+   *   otherwise (since it isn't available then).
+   *
+   *   If subpixel hinting is on, many TrueType bytecode instructions behave
+   *   differently compared to B/W or grayscale rendering (except if `native
+   *   ClearType' is selected by the font).  Microsoft's main idea is to
+   *   render at a much increased horizontal resolution, then sampling down
+   *   the created output to subpixel precision.  However, many older fonts
+   *   are not suited to this and must be specially taken care of by
+   *   applying (hardcoded) tweaks in Microsoft's interpreter.
+   *
+   *   Details on subpixel hinting and some of the necessary tweaks can be
+   *   found in Greg Hitchcock's whitepaper at
+   *   `https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+   *   Note that FreeType currently doesn't really `subpixel hint' (6x1, 6x2,
+   *   or 6x5 supersampling) like discussed in the paper.  Depending on the
+   *   chosen interpreter, it simply ignores instructions on vertical stems
+   *   to arrive at very similar results.
+   *
+   *   The following example code demonstrates how to deactivate subpixel
+   *   hinting (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "truetype",
+   *                               "interpreter-version",
+   *                               &interpreter_version );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values `35', `38', or `40').
+   *
+   * @since:
+   *   2.5
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   glyph-to-script-map
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The auto-hinter provides various script modules to hint glyphs.
+   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
+   *   auto-hinted, the Unicode character map of the font gets examined, and
+   *   the script is then determined based on Unicode character ranges, see
+   *   below.
+   *
+   *   OpenType fonts, however, often provide much more glyphs than
+   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
+   *   to be controlled by so-called `features'.  Handling OpenType features
+   *   can be quite complicated and thus needs a separate library on top of
+   *   FreeType.
+   *
+   *   The mapping between glyph indices and scripts (in the auto-hinter
+   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+   *   array with `num_glyphs' elements, as found in the font's @FT_Face
+   *   structure.  The `glyph-to-script-map' property returns a pointer to
+   *   this array, which can be modified as needed.  Note that the
+   *   modification should happen before the first glyph gets processed by
+   *   the auto-hinter so that the global analysis of the font shapes
+   *   actually uses the modified mapping.
+   *
+   *   The following example code demonstrates how to access it (omitting
+   *   the error handling).
+   *
+   *   {
+   *     FT_Library                library;
+   *     FT_Face                   face;
+   *     FT_Prop_GlyphToScriptMap  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *
+   *     prop.face = face;
+   *
+   *     FT_Property_Get( library, "autofitter",
+   *                               "glyph-to-script-map", &prop );
+   *
+   *     // adjust `prop.map' as needed right here
+   *
+   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+   *   }
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_AUTOHINTER_SCRIPT_XXX
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   A list of constants used for the @glyph-to-script-map property to
+   *   specify the script submodule the auto-hinter should use for hinting a
+   *   particular glyph.
+   *
+   * @values:
+   *   FT_AUTOHINTER_SCRIPT_NONE ::
+   *     Don't auto-hint this glyph.
+   *
+   *   FT_AUTOHINTER_SCRIPT_LATIN ::
+   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
+   *     very broad term, including Cyrillic and Greek also since characters
+   *     from those scripts share the same design constraints.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0020 - U+007F  // Basic Latin (no control characters)
+   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
+   *       U+0100 - U+017F  // Latin Extended-A
+   *       U+0180 - U+024F  // Latin Extended-B
+   *       U+0250 - U+02AF  // IPA Extensions
+   *       U+02B0 - U+02FF  // Spacing Modifier Letters
+   *       U+0300 - U+036F  // Combining Diacritical Marks
+   *       U+0370 - U+03FF  // Greek and Coptic
+   *       U+0400 - U+04FF  // Cyrillic
+   *       U+0500 - U+052F  // Cyrillic Supplement
+   *       U+1D00 - U+1D7F  // Phonetic Extensions
+   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
+   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
+   *       U+1E00 - U+1EFF  // Latin Extended Additional
+   *       U+1F00 - U+1FFF  // Greek Extended
+   *       U+2000 - U+206F  // General Punctuation
+   *       U+2070 - U+209F  // Superscripts and Subscripts
+   *       U+20A0 - U+20CF  // Currency Symbols
+   *       U+2150 - U+218F  // Number Forms
+   *       U+2460 - U+24FF  // Enclosed Alphanumerics
+   *       U+2C60 - U+2C7F  // Latin Extended-C
+   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
+   *       U+2E00 - U+2E7F  // Supplemental Punctuation
+   *       U+A640 - U+A69F  // Cyrillic Extended-B
+   *       U+A720 - U+A7FF  // Latin Extended-D
+   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
+   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_CJK ::
+   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+   *     Vietnamese, and some other scripts.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+1100 - U+11FF  // Hangul Jamo
+   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
+   *       U+2F00 - U+2FDF  // Kangxi Radicals
+   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
+   *       U+3000 - U+303F  // CJK Symbols and Punctuation
+   *       U+3040 - U+309F  // Hiragana
+   *       U+30A0 - U+30FF  // Katakana
+   *       U+3100 - U+312F  // Bopomofo
+   *       U+3130 - U+318F  // Hangul Compatibility Jamo
+   *       U+3190 - U+319F  // Kanbun
+   *       U+31A0 - U+31BF  // Bopomofo Extended
+   *       U+31C0 - U+31EF  // CJK Strokes
+   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
+   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
+   *       U+3300 - U+33FF  // CJK Compatibility
+   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
+   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
+   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
+   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
+   *       U+AC00 - U+D7AF  // Hangul Syllables
+   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
+   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
+   *       U+FE10 - U+FE1F  // Vertical forms
+   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
+   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
+   *      U+1B000 - U+1B0FF // Kana Supplement
+   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_INDIC ::
+   *     Apply the indic auto-hinter, covering all major scripts from the
+   *     Indian sub-continent and some other related scripts like Thai, Lao,
+   *     or Tibetan.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0900 - U+0DFF  // Indic Range
+   *       U+0F00 - U+0FFF  // Tibetan
+   *       U+1900 - U+194F  // Limbu
+   *       U+1B80 - U+1BBF  // Sundanese
+   *       U+A800 - U+A82F  // Syloti Nagri
+   *       U+ABC0 - U+ABFF  // Meetei Mayek
+   *      U+11800 - U+118DF // Sharada
+   *     }
+   *
+   *     Note that currently Indic support is rudimentary only, missing blue
+   *     zone support.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+#define FT_AUTOHINTER_SCRIPT_NONE   0
+#define FT_AUTOHINTER_SCRIPT_LATIN  1
+#define FT_AUTOHINTER_SCRIPT_CJK    2
+#define FT_AUTOHINTER_SCRIPT_INDIC  3
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_GlyphToScriptMap
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The data exchange structure for the @glyph-to-script-map property.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+  typedef struct  FT_Prop_GlyphToScriptMap_
+  {
+    FT_Face     face;
+    FT_UShort*  map;
+
+  } FT_Prop_GlyphToScriptMap;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   fallback-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If no auto-hinter script module can be assigned to a glyph, a
+   *   fallback script gets assigned to it (see also the
+   *   @glyph-to-script-map property).  By default, this is
+   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
+   *   this fallback value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "fallback-script", &fallback_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map that eventually uses the
+   *   fallback script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the fallback script will affect this face.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   default-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
+   *   the HarfBuzz library access OpenType features for getting better
+   *   glyph coverages, this property sets the (auto-fitter) script to be
+   *   used for the default (OpenType) script data of a font's GSUB table.
+   *   Features for the default script are intended for all scripts not
+   *   explicitly handled in GSUB; an example is a `dlig' feature,
+   *   containing the combination of the characters `T', `E', and `L' to
+   *   form a `TEL' ligature.
+   *
+   *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
+   *   `default-script' property, this default value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "default-script", &default_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map that eventually uses the
+   *   default script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the default script will affect this face.
+   *
+   * @since:
+   *   2.5.3
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   increase-x-height
+   *
+   * @description:
+   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
+   *   up the font's x~height much more often than normally.  If the value
+   *   is set to~0, which is the default, this feature is switched off.  Use
+   *   this property to improve the legibility of small font sizes if
+   *   necessary.
+   *
+   *   {
+   *     FT_Library               library;
+   *     FT_Face                  face;
+   *     FT_Prop_IncreaseXHeight  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+   *
+   *     prop.face  = face;
+   *     prop.limit = 14;
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "increase-x-height", &prop );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   Set this value right after calling @FT_Set_Char_Size, but before
+   *   loading any glyph (using the auto-hinter).
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_IncreaseXHeight
+   *
+   * @description:
+   *   The data exchange structure for the @increase-x-height property.
+   *
+   */
+  typedef struct  FT_Prop_IncreaseXHeight_
+  {
+    FT_Face  face;
+    FT_UInt  limit;
+
+  } FT_Prop_IncreaseXHeight;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   warping
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
+   *   activate the warp hinting code in the auto-hinter, this property
+   *   switches warping on and off.
+   *
+   *   Warping only works in `normal' auto-hinting mode replacing it.
+   *   The idea of the code is to slightly scale and shift a glyph along
+   *   the non-hinted dimension (which is usually the horizontal axis) so
+   *   that as much of its segments are aligned (more or less) to the grid.
+   *   To find out a glyph's optimal scaling and shifting value, various
+   *   parameter combinations are tried and scored.
+   *
+   *   By default, warping is off.  The example below shows how to switch on
+   *   warping (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     warping = 1;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "warping", &warping );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *
+   *   The warping code can also change advance widths.  Have a look at the
+   *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
+   *   for details on improving inter-glyph distances while rendering.
+   *
+   *   Since warping is a global property of the auto-hinter it is best to
+   *   change its value before rendering any face.  Otherwise, you should
+   *   reload all faces that get auto-hinted in `normal' hinting mode.
+   *
+   * @since:
+   *   2.6
+   *
+   */
+
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* FTDRIVER_H_ */
+
+
+/* END */
diff --git a/include/fterrdef.h b/include/freetype/fterrdef.h
similarity index 80%
rename from include/fterrdef.h
rename to include/freetype/fterrdef.h
index 1bf0751..8ffd346 100644
--- a/include/fterrdef.h
+++ b/include/freetype/fterrdef.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType error codes (specification).                                */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,18 +16,43 @@
 /***************************************************************************/
 
 
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****                LIST OF ERROR CODES/MESSAGES             *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   error_code_values                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   Error Code Values                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   All possible error codes returned by FreeType functions.            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   The list below is taken verbatim from the file `fterrdef.h'         */
+  /*   (loaded automatically by including `FT_FREETYPE_H').  The first     */
+  /*   argument of the `FT_ERROR_DEF_' macro is the error label; by        */
+  /*   default, the prefix `FT_Err_' gets added so that you get error      */
+  /*   names like `FT_Err_Cannot_Open_Resource'.  The second argument is   */
+  /*   the error code, and the last argument an error string, which is not */
+  /*   used by FreeType.                                                   */
+  /*                                                                       */
+  /*   Within your application you should *only* use error names and       */
+  /*   *never* its numeric values!  The latter might (and actually do)     */
+  /*   change in forthcoming FreeType versions.                            */
+  /*                                                                       */
+  /*   Macro `FT_NOERRORDEF_' defines `FT_Err_Ok', which is always zero.   */
+  /*   See the `Error Enumerations' subsection how to automatically        */
+  /*   generate a list of error strings.                                   */
+  /*                                                                       */
+  /*************************************************************************/
 
 
-  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
-  /* including this file.                                           */
-
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Err_XXX                                                         */
+  /*                                                                       */
+  /*************************************************************************/
 
   /* generic errors */
 
@@ -206,6 +231,10 @@
                 "invalid PostScript (post) table format" )
   FT_ERRORDEF_( Invalid_Post_Table,                          0x9B,
                 "invalid PostScript (post) table" )
+  FT_ERRORDEF_( DEF_In_Glyf_Bytecode,                        0x9C,
+                "found FDEF or IDEF opcode in glyf bytecode" )
+  FT_ERRORDEF_( Missing_Bitmap,                              0x9D,
+                "missing bitmap in strike" )
 
   /* CFF, CID, and Type 1 errors */
 
@@ -218,7 +247,7 @@
   FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3,
                 "no Unicode glyph name found" )
   FT_ERRORDEF_( Glyph_Too_Big,                               0xA4,
-                "glyph to big for hinting" )
+                "glyph too big for hinting" )
 
   /* BDF errors */
 
@@ -245,5 +274,7 @@
   FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA,
                 "Font glyphs corrupted or missing fields" )
 
+  /* */
+
 
 /* END */
diff --git a/include/freetype/fterrors.h b/include/freetype/fterrors.h
new file mode 100644
index 0000000..f6ee5c2
--- /dev/null
+++ b/include/freetype/fterrors.h
@@ -0,0 +1,226 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrors.h                                                             */
+/*                                                                         */
+/*    FreeType error code handling (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2018 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   error_enumerations                                                  */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   Error Enumerations                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   How to handle errors and error strings.                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   The header file `fterrors.h' (which is automatically included by    */
+  /*   `freetype.h' defines the handling of FreeType's enumeration         */
+  /*   constants.  It can also be used to generate error message strings   */
+  /*   with a small macro trick explained below.                           */
+  /*                                                                       */
+  /*   *Error* *Formats*                                                   */
+  /*                                                                       */
+  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */
+  /*   defined in `ftoption.h' in order to make the higher byte indicate   */
+  /*   the module where the error has happened (this is not compatible     */
+  /*   with standard builds of FreeType~2, however).  See the file         */
+  /*   `ftmoderr.h' for more details.                                      */
+  /*                                                                       */
+  /*   *Error* *Message* *Strings*                                         */
+  /*                                                                       */
+  /*   Error definitions are set up with special macros that allow client  */
+  /*   applications to build a table of error message strings.  The        */
+  /*   strings are not included in a normal build of FreeType~2 to save    */
+  /*   space (most client applications do not use them).                   */
+  /*                                                                       */
+  /*   To do so, you have to define the following macros before including  */
+  /*   this file.                                                          */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_ERROR_START_LIST                                               */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*   This macro is called before anything else to define the start of    */
+  /*   the error list.  It is followed by several FT_ERROR_DEF calls.      */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_ERROR_DEF( e, v, s )                                           */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*   This macro is called to define one single error.  `e' is the error  */
+  /*   code identifier (e.g., `Invalid_Argument'), `v' is the error's      */
+  /*   numerical value, and `s' is the corresponding error string.         */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_ERROR_END_LIST                                                 */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*   This macro ends the list.                                           */
+  /*                                                                       */
+  /*   Additionally, you have to undefine `FTERRORS_H_' before #including  */
+  /*   this file.                                                          */
+  /*                                                                       */
+  /*   Here is a simple example.                                           */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     #undef FTERRORS_H_                                                */
+  /*     #define FT_ERRORDEF( e, v, s )  { e, s },                         */
+  /*     #define FT_ERROR_START_LIST     {                                 */
+  /*     #define FT_ERROR_END_LIST       { 0, NULL } };                    */
+  /*                                                                       */
+  /*     const struct                                                      */
+  /*     {                                                                 */
+  /*       int          err_code;                                          */
+  /*       const char*  err_msg;                                           */
+  /*     } ft_errors[] =                                                   */
+  /*                                                                       */
+  /*     #include FT_ERRORS_H                                              */
+  /*   }                                                                   */
+  /*                                                                       */
+  /*   Note that `FT_Err_Ok' is _not_ defined with `FT_ERRORDEF' but with  */
+  /*   `FT_NOERRORDEF'; it is always zero.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* */
+
+  /* In previous FreeType versions we used `__FTERRORS_H__'.  However, */
+  /* using two successive underscores in a non-system symbol name      */
+  /* violates the C (and C++) standard, so it was changed to the       */
+  /* current form.  In spite of this, we have to make                  */
+  /*                                                                   */
+  /*   #undefine __FTERRORS_H__                                        */
+  /*                                                                   */
+  /* work for backward compatibility.                                  */
+  /*                                                                   */
+#if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) )
+#define FTERRORS_H_
+#define __FTERRORS_H__
+
+
+  /* include module base error codes */
+#include FT_MODULE_ERRORS_H
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+
+  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+  /* By default, we use `FT_Err_'.                            */
+  /*                                                          */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FT_Err_
+#endif
+
+
+  /* FT_ERR_BASE is used as the base for module-specific errors. */
+  /*                                                             */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE  FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE  0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+  /* If FT_ERRORDEF is not defined, we need to define a simple */
+  /* enumeration type.                                         */
+  /*                                                           */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s )  e = v,
+#define FT_ERROR_START_LIST     enum {
+#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+  /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s )                                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+  /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s )                             \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+  FT_ERROR_START_LIST
+#endif
+
+
+  /* now include the error codes */
+#include FT_ERROR_DEFINITIONS_H
+
+
+#ifdef FT_ERROR_END_LIST
+  FT_ERROR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      SIMPLE CLEANUP                     *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+  /* FT_ERR_PREFIX is needed internally */
+#ifndef FT2_BUILD_LIBRARY
+#undef FT_ERR_PREFIX
+#endif
+
+#endif /* !(FTERRORS_H_ && __FTERRORS_H__) */
+
+
+/* END */
diff --git a/include/ftfntfmt.h b/include/freetype/ftfntfmt.h
similarity index 96%
rename from include/ftfntfmt.h
rename to include/freetype/ftfntfmt.h
index 1f8ff28..cc86efa 100644
--- a/include/ftfntfmt.h
+++ b/include/freetype/ftfntfmt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Support functions for font formats.                                  */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTFNTFMT_H__
-#define __FTFNTFMT_H__
+#ifndef FTFNTFMT_H_
+#define FTFNTFMT_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -89,4 +89,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTFNTFMT_H__ */
+#endif /* FTFNTFMT_H_ */
+
+
+/* END */
diff --git a/include/ftgasp.h b/include/freetype/ftgasp.h
similarity index 86%
rename from include/ftgasp.h
rename to include/freetype/ftgasp.h
index 9a9b632..fc1248f 100644
--- a/include/ftgasp.h
+++ b/include/freetype/ftgasp.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Access of TrueType's `gasp' table (specification).                   */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef _FT_GASP_H_
-#define _FT_GASP_H_
+#ifndef FTGASP_H_
+#define FTGASP_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -29,6 +29,9 @@
 #endif
 
 
+FT_BEGIN_HEADER
+
+
   /***************************************************************************
    *
    * @section:
@@ -92,8 +95,8 @@
 #define FT_GASP_NO_TABLE               -1
 #define FT_GASP_DO_GRIDFIT           0x01
 #define FT_GASP_DO_GRAY              0x02
+#define FT_GASP_SYMMETRIC_GRIDFIT    0x04
 #define FT_GASP_SYMMETRIC_SMOOTHING  0x08
-#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
 
 
   /*************************************************************************
@@ -102,17 +105,25 @@
    *   FT_Get_Gasp
    *
    * @description:
-   *   Read the `gasp' table from a TrueType or OpenType font file and
-   *   return the entry corresponding to a given character pixel size.
+   *   For a TrueType or OpenType font file, return the rasterizer behaviour
+   *   flags from the font's `gasp' table corresponding to a given
+   *   character pixel size.
    *
    * @input:
    *   face :: The source face handle.
+   *
    *   ppem :: The vertical character pixel size.
    *
    * @return:
    *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
    *   `gasp' table in the face.
    *
+   * @note:
+   *   If you want to use the MM functionality of OpenType variation fonts
+   *   (i.e., using @FT_Set_Var_Design_Coordinates and friends), call this
+   *   function *after* setting an instance since the return values can
+   *   change.
+   *
    * @since:
    *   2.3.0
    */
@@ -123,7 +134,9 @@
   /* */
 
 
-#endif /* _FT_GASP_H_ */
+FT_END_HEADER
+
+#endif /* FTGASP_H_ */
 
 
 /* END */
diff --git a/include/ftglyph.h b/include/freetype/ftglyph.h
similarity index 97%
rename from include/ftglyph.h
rename to include/freetype/ftglyph.h
index 803ad39..5f3fc00 100644
--- a/include/ftglyph.h
+++ b/include/freetype/ftglyph.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType convenience functions to handle glyphs (specification).     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,8 +29,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTGLYPH_H__
-#define __FTGLYPH_H__
+#ifndef FTGLYPH_H_
+#define FTGLYPH_H_
 
 
 #include <ft2build.h>
@@ -231,6 +231,12 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    Because `*aglyph->advance.x' and '*aglyph->advance.y' are 16.16    */
+  /*    fixed-point numbers, `slot->advance.x' and `slot->advance.y'       */
+  /*    (which are in 26.6 fixed-point format) must be in the range        */
+  /*    ]-32768;32768[.                                                    */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Glyph( FT_GlyphSlot  slot,
                 FT_Glyph     *aglyph );
@@ -341,10 +347,10 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return a glyph's `control box'.  The control box encloses all the  */
-  /*    outline's points, including Bézier control points.  Though it      */
+  /*    outline's points, including Bezier control points.  Though it      */
   /*    coincides with the exact bounding box for most glyphs, it can be   */
   /*    slightly larger in some situations (like when rotating an outline  */
-  /*    that contains Bézier outside arcs).                                */
+  /*    that contains Bezier outside arcs).                                */
   /*                                                                       */
   /*    Computing the control box is very fast, while getting the bounding */
   /*    box can take much more time as it needs to walk over all segments  */
@@ -453,7 +459,7 @@
   /*                                                                       */
   /*                                                                       */
   /*        // load glyph                                                  */
-  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */
+  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT );    */
   /*                                                                       */
   /*        // extract glyph image                                         */
   /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */
@@ -566,6 +572,9 @@
   /* <Note>                                                                */
   /*    The result is undefined if either `a' or `b' is zero.              */
   /*                                                                       */
+  /*    Since the function uses wrap-around arithmetic, results become     */
+  /*    meaningless if the arguments are very large.                       */
+  /*                                                                       */
   FT_EXPORT( void )
   FT_Matrix_Multiply( const FT_Matrix*  a,
                       FT_Matrix*        b );
@@ -594,7 +603,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTGLYPH_H__ */
+#endif /* FTGLYPH_H_ */
 
 
 /* END */
diff --git a/include/ftgxval.h b/include/freetype/ftgxval.h
similarity index 97%
rename from include/ftgxval.h
rename to include/freetype/ftgxval.h
index 0e9ac1d..8382d59 100644
--- a/include/ftgxval.h
+++ b/include/freetype/ftgxval.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K,                                           */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTGXVAL_H__
-#define __FTGXVAL_H__
+#ifndef FTGXVAL_H_
+#define FTGXVAL_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -101,15 +101,15 @@
    *   The number of tables checked in this module.  Use it as a parameter
    *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.
    */
-#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
+#define FT_VALIDATE_GX_LENGTH  ( FT_VALIDATE_GX_LAST_INDEX + 1 )
 
   /* */
 
   /* Up to 0x1000 is used by otvalid.
      Ox2xxx is reserved for feature OT extension. */
-#define FT_VALIDATE_GX_START 0x4000
-#define FT_VALIDATE_GX_BITFIELD( tag )                  \
-  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+#define FT_VALIDATE_GX_START  0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag ) \
+          ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
 
 
  /**********************************************************************
@@ -351,7 +351,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTGXVAL_H__ */
+#endif /* FTGXVAL_H_ */
 
 
 /* END */
diff --git a/include/ftgzip.h b/include/freetype/ftgzip.h
similarity index 91%
rename from include/ftgzip.h
rename to include/freetype/ftgzip.h
index b3a532d..db033da 100644
--- a/include/ftgzip.h
+++ b/include/freetype/ftgzip.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Gzip-compressed stream support.                                      */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTGZIP_H__
-#define __FTGZIP_H__
+#ifndef FTGZIP_H_
+#define FTGZIP_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -117,11 +117,11 @@
   *
   * @inout:
   *   output_len ::
-  *     Before calling the function, this is the the total size of the
-  *     output buffer, which must be large enough to hold the entire
-  *     uncompressed data (so the size of the uncompressed data must be
-  *     known in advance).  After calling the function, `output_len' is the
-  *     size of the used data in `output'.
+  *     Before calling the function, this is the total size of the output
+  *     buffer, which must be large enough to hold the entire uncompressed
+  *     data (so the size of the uncompressed data must be known in
+  *     advance).  After calling the function, `output_len' is the size of
+  *     the used data in `output'.
   *
   * @return:
   *   FreeType error code.  0~means success.
@@ -129,6 +129,9 @@
   * @note:
   *   This function may return `FT_Err_Unimplemented_Feature' if your build
   *   of FreeType was not compiled with zlib support.
+  *
+  * @since:
+  *   2.5.1
   */
   FT_EXPORT( FT_Error )
   FT_Gzip_Uncompress( FT_Memory       memory,
@@ -142,7 +145,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTGZIP_H__ */
+#endif /* FTGZIP_H_ */
 
 
 /* END */
diff --git a/include/ftimage.h b/include/freetype/ftimage.h
similarity index 95%
rename from include/ftimage.h
rename to include/freetype/ftimage.h
index 82f284c..79ede19 100644
--- a/include/ftimage.h
+++ b/include/freetype/ftimage.h
@@ -5,7 +5,7 @@
 /*    FreeType glyph image formats and default raster interface            */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,12 +24,12 @@
   /*************************************************************************/
 
 
-#ifndef __FTIMAGE_H__
-#define __FTIMAGE_H__
+#ifndef FTIMAGE_H_
+#define FTIMAGE_H_
 
 
-  /* _STANDALONE_ is from ftgrays.c */
-#ifndef _STANDALONE_
+  /* STANDALONE_ is from ftgrays.c */
+#ifndef STANDALONE_
 #include <ft2build.h>
 #endif
 
@@ -169,13 +169,13 @@
   /*      @FT_RENDER_MODE_LCD_V.                                           */
   /*                                                                       */
   /*    FT_PIXEL_MODE_BGRA ::                                              */
-  /*      An image with four 8-bit channels per pixel, representing a      */
-  /*      color image (such as emoticons) with alpha channel.  For each    */
-  /*      pixel, the format is BGRA, which means, the blue channel comes   */
-  /*      first in memory.  The color channels are pre-multiplied and in   */
-  /*      the sRGB colorspace.  For example, full red at half-translucent  */
-  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
-  /*      See also @FT_LOAD_COLOR.                                         */
+  /*      [Since 2.5] An image with four 8-bit channels per pixel,         */
+  /*      representing a color image (such as emoticons) with alpha        */
+  /*      channel.  For each pixel, the format is BGRA, which means, the   */
+  /*      blue channel comes first in memory.  The color channels are      */
+  /*      pre-multiplied and in the sRGB colorspace.  For example, full    */
+  /*      red at half-translucent opacity will be represented as           */
+  /*      `00,00,80,80', not `00,00,FF,80'.  See also @FT_LOAD_COLOR.      */
   /*                                                                       */
   typedef enum  FT_Pixel_Mode_
   {
@@ -301,11 +301,11 @@
   /*                  each outline point's type.                           */
   /*                                                                       */
   /*                  If bit~0 is unset, the point is `off' the curve,     */
-  /*                  i.e., a Bézier control point, while it is `on' if    */
+  /*                  i.e., a Bezier control point, while it is `on' if    */
   /*                  set.                                                 */
   /*                                                                       */
   /*                  Bit~1 is meaningful for `off' points only.  If set,  */
-  /*                  it indicates a third-order Bézier arc control point; */
+  /*                  it indicates a third-order Bezier arc control point; */
   /*                  and a second-order control point if unset.           */
   /*                                                                       */
   /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
@@ -532,7 +532,7 @@
   /*    A function pointer type used to describe the signature of a `conic */
   /*    to' function during outline walking or decomposition.              */
   /*                                                                       */
-  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */
+  /*    A `conic to' is emitted to indicate a second-order Bezier arc in   */
   /*    the outline.                                                       */
   /*                                                                       */
   /* <Input>                                                               */
@@ -564,12 +564,12 @@
   /*    A function pointer type used to describe the signature of a `cubic */
   /*    to' function during outline walking or decomposition.              */
   /*                                                                       */
-  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */
+  /*    A `cubic to' is emitted to indicate a third-order Bezier arc.      */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    control1 :: A pointer to the first Bézier control point.           */
+  /*    control1 :: A pointer to the first Bezier control point.           */
   /*                                                                       */
-  /*    control2 :: A pointer to the second Bézier control point.          */
+  /*    control2 :: A pointer to the second Bezier control point.          */
   /*                                                                       */
   /*    to       :: A pointer to the target end point.                     */
   /*                                                                       */
@@ -595,16 +595,16 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    A structure to hold various function pointers used during outline  */
-  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
+  /*    decomposition in order to emit segments, conic, and cubic Beziers. */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    move_to  :: The `move to' emitter.                                 */
   /*                                                                       */
   /*    line_to  :: The segment emitter.                                   */
   /*                                                                       */
-  /*    conic_to :: The second-order Bézier arc emitter.                   */
+  /*    conic_to :: The second-order Bezier arc emitter.                   */
   /*                                                                       */
-  /*    cubic_to :: The third-order Bézier arc emitter.                    */
+  /*    cubic_to :: The third-order Bezier arc emitter.                    */
   /*                                                                       */
   /*    shift    :: The shift that is applied to coordinates before they   */
   /*                are sent to the emitter.                               */
@@ -619,7 +619,7 @@
   /*                                                                       */
   /*    {                                                                  */
   /*      x' = (x << shift) - delta                                        */
-  /*      y' = (x << shift) - delta                                        */
+  /*      y' = (y << shift) - delta                                        */
   /*    }                                                                  */
   /*                                                                       */
   /*    Set the values of `shift' and `delta' to~0 to get the original     */
@@ -701,7 +701,7 @@
   /*                                                                       */
   /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */
   /*      The glyph image is a vectorial outline made of line segments     */
-  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */
+  /*      and Bezier arcs; it can be described as an @FT_Outline; you      */
   /*      generally want to access the `outline' field of the              */
   /*      @FT_GlyphSlotRec structure to read it.                           */
   /*                                                                       */
@@ -747,7 +747,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* A raster is a scan converter, in charge of rendering an outline into  */
-  /* a a bitmap.  This section contains the public API for rasters.        */
+  /* a bitmap.  This section contains the public API for rasters.          */
   /*                                                                       */
   /* Note that in FreeType 2, all rasters are now encapsulated within      */
   /* specific modules called `renderers'.  See `ftrender.h' for more       */
@@ -860,16 +860,6 @@
   /*    This can be used to write anti-aliased outlines directly to a      */
   /*    given background bitmap, and even perform translucency.            */
   /*                                                                       */
-  /*    Note that the `count' field cannot be greater than a fixed value   */
-  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */
-  /*    `ftoption.h'.  By default, this value is set to~32, which means    */
-  /*    that if there are more than 32~spans on a given scanline, the      */
-  /*    callback is called several times with the same `y' parameter in    */
-  /*    order to draw all callbacks.                                       */
-  /*                                                                       */
-  /*    Otherwise, the callback is only called once per scan-line, and     */
-  /*    only for those scanlines that do have `gray' pixels on them.       */
-  /*                                                                       */
   typedef void
   (*FT_SpanFunc)( int             y,
                   int             count,
@@ -1074,24 +1064,24 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    FreeType used to provide an area of memory called the `render      */
-  /*    pool' available to all registered rasters.  This was not thread    */
-  /*    safe however and now FreeType never allocates this pool.  NULL     */
-  /*    is always passed in as pool_base.                                  */
+  /*    pool' available to all registered rasterizers.  This was not       */
+  /*    thread safe, however, and now FreeType never allocates this pool.  */
   /*                                                                       */
-  /*    This function is called each time the render pool changes, or just */
-  /*    after a new raster object is created.                              */
+  /*    This function is called after a new raster object is created.      */
   /*                                                                       */
   /* <Input>                                                               */
   /*    raster    :: A handle to the new raster object.                    */
   /*                                                                       */
-  /*    pool_base :: The address in memory of the render pool.             */
+  /*    pool_base :: Previously, the address in memory of the render pool. */
+  /*                 Set this to NULL.                                     */
   /*                                                                       */
-  /*    pool_size :: The size in bytes of the render pool.                 */
+  /*    pool_size :: Previously, the size in bytes of the render pool.     */
+  /*                 Set this to 0.                                        */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    Rasters should ignore the render pool and rely on dynamic or stack */
-  /*    allocation if they want to (a handle to the memory allocator is    */
-  /*    passed to the raster constructor).                                 */
+  /*    Rasterizers should rely on dynamic or stack allocation if they     */
+  /*    want to (a handle to the memory allocator is passed to the         */
+  /*    rasterizer constructor).                                           */
   /*                                                                       */
   typedef void
   (*FT_Raster_ResetFunc)( FT_Raster       raster,
@@ -1190,6 +1180,7 @@
   typedef struct  FT_Raster_Funcs_
   {
     FT_Glyph_Format        glyph_format;
+
     FT_Raster_NewFunc      raster_new;
     FT_Raster_ResetFunc    raster_reset;
     FT_Raster_SetModeFunc  raster_set_mode;
@@ -1203,7 +1194,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTIMAGE_H__ */
+#endif /* FTIMAGE_H_ */
 
 
 /* END */
diff --git a/include/ftincrem.h b/include/freetype/ftincrem.h
similarity index 95%
rename from include/ftincrem.h
rename to include/freetype/ftincrem.h
index 840af25..44619f9 100644
--- a/include/ftincrem.h
+++ b/include/freetype/ftincrem.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType incremental loading (specification).                        */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,11 +16,12 @@
 /***************************************************************************/
 
 
-#ifndef __FTINCREM_H__
-#define __FTINCREM_H__
+#ifndef FTINCREM_H_
+#define FTINCREM_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_H
 
 #ifdef FREETYPE_H
 #error "freetype.h of FreeType 1 has been loaded!"
@@ -331,24 +332,12 @@
   typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;
 
 
-  /***************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_INCREMENTAL
-   *
-   * @description:
-   *   A constant used as the tag of @FT_Parameter structures to indicate
-   *   an incremental loading object to be used by FreeType.
-   *
-   */
-#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
-
   /* */
 
 
 FT_END_HEADER
 
-#endif /* __FTINCREM_H__ */
+#endif /* FTINCREM_H_ */
 
 
 /* END */
diff --git a/include/freetype/ftlcdfil.h b/include/freetype/ftlcdfil.h
new file mode 100644
index 0000000..2a27196
--- /dev/null
+++ b/include/freetype/ftlcdfil.h
@@ -0,0 +1,309 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.h                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs           */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2006-2018 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 FTLCDFIL_H_
+#define FTLCDFIL_H_
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_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:
+   *   lcd_filtering
+   *
+   * @title:
+   *   LCD Filtering
+   *
+   * @abstract:
+   *   Reduce color fringes of subpixel-rendered bitmaps.
+   *
+   * @description:
+   *   Should you #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your
+   *   `ftoption.h', which enables patented ClearType-style rendering,
+   *   the LCD-optimized glyph bitmaps should be filtered to reduce color
+   *   fringes inherent to this technology.  The default FreeType LCD
+   *   rendering uses different technology, and API described below,
+   *   although available, does nothing.
+   *
+   *   ClearType-style LCD rendering exploits the color-striped structure of
+   *   LCD pixels, increasing the available resolution in the direction of
+   *   the stripe (usually horizontal RGB) by a factor of~3.  Since these
+   *   subpixels are color pixels, using them unfiltered creates severe
+   *   color fringes.  Use the @FT_Library_SetLcdFilter API to specify a
+   *   low-pass filter, which is then applied to subpixel-rendered bitmaps
+   *   generated through @FT_Render_Glyph.  The filter sacrifices some of
+   *   the higher resolution to reduce color fringes, making the glyph image
+   *   slightly blurrier.  Positional improvements will remain.
+   *
+   *   A filter should have two properties:
+   *
+   *   1) It should be normalized, meaning the sum of the 5~components
+   *      should be 256 (0x100).  It is possible to go above or under this
+   *      target sum, however: going under means tossing out contrast, going
+   *      over means invoking clamping and thereby non-linearities that
+   *      increase contrast somewhat at the expense of greater distortion
+   *      and color-fringing.  Contrast is better enhanced through stem
+   *      darkening.
+   *
+   *   2) It should be color-balanced, meaning a filter `{~a, b, c, b, a~}'
+   *      where a~+ b~=~c.  It distributes the computed coverage for one
+   *      subpixel to all subpixels equally, sacrificing some won resolution
+   *      but drastically reducing color-fringing.  Positioning improvements
+   *      remain!  Note that color-fringing can only really be minimized
+   *      when using a color-balanced filter and alpha-blending the glyph
+   *      onto a surface in linear space; see @FT_Render_Glyph.
+   *
+   *   Regarding the form, a filter can be a `boxy' filter or a `beveled'
+   *   filter.  Boxy filters are sharper but are less forgiving of non-ideal
+   *   gamma curves of a screen (viewing angles!), beveled filters are
+   *   fuzzier but more tolerant.
+   *
+   *   Examples:
+   *
+   *   - [0x10 0x40 0x70 0x40 0x10] is beveled and neither balanced nor
+   *     normalized.
+   *
+   *   - [0x1A 0x33 0x4D 0x33 0x1A] is beveled and balanced but not
+   *     normalized.
+   *
+   *   - [0x19 0x33 0x66 0x4c 0x19] is beveled and normalized but not
+   *     balanced.
+   *
+   *   - [0x00 0x4c 0x66 0x4c 0x00] is boxily beveled and normalized but not
+   *     balanced.
+   *
+   *   - [0x00 0x55 0x56 0x55 0x00] is boxy, normalized, and almost
+   *     balanced.
+   *
+   *   - [0x08 0x4D 0x56 0x4D 0x08] is beveled, normalized and, almost
+   *     balanced.
+   *
+   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+   *   @FT_Load_Glyph, and @FT_Load_Char.  It does _not_ affect the output
+   *   of @FT_Outline_Render and @FT_Outline_Get_Bitmap.
+   *
+   *   If this feature is activated, the dimensions of LCD glyph bitmaps are
+   *   either wider or taller than the dimensions of the corresponding
+   *   outline with regard to the pixel grid.  For example, for
+   *   @FT_RENDER_MODE_LCD, the filter adds 3~subpixels to the left, and
+   *   3~subpixels to the right.  The bitmap offset values are adjusted
+   *   accordingly, so clients shouldn't need to modify their layout and
+   *   glyph positioning code when enabling the filter.
+   *
+   *   It is important to understand that linear alpha blending and gamma
+   *   correction is critical for correctly rendering glyphs onto surfaces
+   *   without artifacts and even more critical when subpixel rendering is
+   *   involved.
+   *
+   *   Each of the 3~alpha values (subpixels) is independently used to blend
+   *   one color channel.  That is, red alpha blends the red channel of the
+   *   text color with the red channel of the background pixel.  The
+   *   distribution of density values by the color-balanced filter assumes
+   *   alpha blending is done in linear space; only then color artifacts
+   *   cancel out.
+   */
+
+
+  /****************************************************************************
+   *
+   * @enum:
+   *   FT_LcdFilter
+   *
+   * @description:
+   *   A list of values to identify various types of LCD filters.
+   *
+   * @values:
+   *   FT_LCD_FILTER_NONE ::
+   *     Do not perform filtering.  When used with subpixel rendering, this
+   *     results in sometimes severe color fringes.
+   *
+   *   FT_LCD_FILTER_DEFAULT ::
+   *     The default filter reduces color fringes considerably, at the cost
+   *     of a slight blurriness in the output.
+   *
+   *     It is a beveled, normalized, and color-balanced five-tap filter
+   *     that is more forgiving to screens with non-ideal gamma curves and
+   *     viewing angles.  Note that while color-fringing is reduced, it can
+   *     only be minimized by using linear alpha blending and gamma
+   *     correction to render glyphs onto surfaces.  The default filter
+   *     weights are [0x08 0x4D 0x56 0x4D 0x08].
+   *
+   *   FT_LCD_FILTER_LIGHT ::
+   *     The light filter is a variant that is sharper at the cost of
+   *     slightly more color fringes than the default one.
+   *
+   *     It is a boxy, normalized, and color-balanced three-tap filter that
+   *     is less forgiving to screens with non-ideal gamma curves and
+   *     viewing angles.  This filter works best when the rendering system
+   *     uses linear alpha blending and gamma correction to render glyphs
+   *     onto surfaces.  The light filter weights are
+   *     [0x00 0x55 0x56 0x55 0x00].
+   *
+   *   FT_LCD_FILTER_LEGACY ::
+   *     This filter corresponds to the original libXft color filter.  It
+   *     provides high contrast output but can exhibit really bad color
+   *     fringes if glyphs are not extremely well hinted to the pixel grid.
+   *     In other words, it only works well if the TrueType bytecode
+   *     interpreter is enabled *and* high-quality hinted fonts are used.
+   *
+   *     This filter is only provided for comparison purposes, and might be
+   *     disabled or stay unsupported in the future.
+   *
+   *   FT_LCD_FILTER_LEGACY1 ::
+   *     For historical reasons, the FontConfig library returns a different
+   *     enumeration value for legacy LCD filtering.  To make code work that
+   *     (incorrectly) forwards FontConfig's enumeration value to
+   *     @FT_Library_SetLcdFilter without proper mapping, it is thus easiest
+   *     to have another enumeration value, which is completely equal to
+   *     `FT_LCD_FILTER_LEGACY'.
+   *
+   * @since:
+   *   2.3.0 (`FT_LCD_FILTER_LEGACY1' since 2.6.2)
+   */
+  typedef enum  FT_LcdFilter_
+  {
+    FT_LCD_FILTER_NONE    = 0,
+    FT_LCD_FILTER_DEFAULT = 1,
+    FT_LCD_FILTER_LIGHT   = 2,
+    FT_LCD_FILTER_LEGACY1 = 3,
+    FT_LCD_FILTER_LEGACY  = 16,
+
+    FT_LCD_FILTER_MAX   /* do not remove */
+
+  } FT_LcdFilter;
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilter
+   *
+   * @description:
+   *   This function is used to apply color filtering to LCD decimated
+   *   bitmaps, like the ones used when calling @FT_Render_Glyph with
+   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   filter ::
+   *     The filter type.
+   *
+   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+   *     well on most LCD screens.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This feature is always disabled by default.  Clients must make an
+   *   explicit call to this function with a `filter' value other than
+   *   @FT_LCD_FILTER_NONE in order to enable it.
+   *
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter );
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilterWeights
+   *
+   * @description:
+   *   This function can be used to enable LCD filter with custom weights,
+   *   instead of using presets in @FT_Library_SetLcdFilter.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   weights ::
+   *     A pointer to an array; the function copies the first five bytes and
+   *     uses them to specify the filter weights.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   LCD filter weights can also be set per face using @FT_Face_Properties
+   *   with @FT_PARAM_TAG_LCD_FILTER_WEIGHTS.
+   *
+   * @since:
+   *   2.4.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights );
+
+
+  /*
+   * @type:
+   *   FT_LcdFiveTapFilter
+   *
+   * @description:
+   *   A typedef for passing the five LCD filter weights to
+   *   @FT_Face_Properties within an @FT_Parameter structure.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_LCD_FILTER_FIVE_TAPS  5
+
+  typedef FT_Byte  FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS];
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* FTLCDFIL_H_ */
+
+
+/* END */
diff --git a/include/ftlist.h b/include/freetype/ftlist.h
similarity index 98%
rename from include/ftlist.h
rename to include/freetype/ftlist.h
index 12b48c7..117473b 100644
--- a/include/ftlist.h
+++ b/include/freetype/ftlist.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Generic list support for FreeType (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,8 +24,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTLIST_H__
-#define __FTLIST_H__
+#ifndef FTLIST_H_
+#define FTLIST_H_
 
 
 #include <ft2build.h>
@@ -270,7 +270,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTLIST_H__ */
+#endif /* FTLIST_H_ */
 
 
 /* END */
diff --git a/include/ftlzw.h b/include/freetype/ftlzw.h
similarity index 96%
rename from include/ftlzw.h
rename to include/freetype/ftlzw.h
index d3ec28e..1615912 100644
--- a/include/ftlzw.h
+++ b/include/freetype/ftlzw.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    LZW-compressed stream support.                                       */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTLZW_H__
-#define __FTLZW_H__
+#ifndef FTLZW_H_
+#define FTLZW_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -93,7 +93,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTLZW_H__ */
+#endif /* FTLZW_H_ */
 
 
 /* END */
diff --git a/include/ftmac.h b/include/freetype/ftmac.h
similarity index 97%
rename from include/ftmac.h
rename to include/freetype/ftmac.h
index 14c55cf..c1e497c 100644
--- a/include/ftmac.h
+++ b/include/freetype/ftmac.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Additional Mac-specific API.                                         */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTMAC_H__
-#define __FTMAC_H__
+#ifndef FTMAC_H_
+#define FTMAC_H_
 
 
 #include <ft2build.h>
@@ -35,11 +35,12 @@
 FT_BEGIN_HEADER
 
 
-/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+  /* gcc-3.1 and later can warn about functions tagged as deprecated */
 #ifndef FT_DEPRECATED_ATTRIBUTE
-#if defined(__GNUC__)                                               && \
-    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
-#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))
+#if defined( __GNUC__ )                                     && \
+    ( ( __GNUC__ >= 4 )                                  ||    \
+      ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) )
+#define FT_DEPRECATED_ATTRIBUTE  __attribute__(( deprecated ))
 #else
 #define FT_DEPRECATED_ATTRIBUTE
 #endif
@@ -268,7 +269,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTMAC_H__ */
+#endif /* FTMAC_H_ */
 
 
 /* END */
diff --git a/include/freetype/ftmm.h b/include/freetype/ftmm.h
new file mode 100644
index 0000000..9948102
--- /dev/null
+++ b/include/freetype/ftmm.h
@@ -0,0 +1,638 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.h                                                                 */
+/*                                                                         */
+/*    FreeType Multiple Master font interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2018 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 FTMM_H_
+#define FTMM_H_
+
+
+#include <ft2build.h>
+#include FT_TYPE1_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    multiple_masters                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Multiple Masters                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to manage Multiple Masters fonts.                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following types and functions are used to manage Multiple      */
+  /*    Master fonts, i.e., the selection of specific design instances by  */
+  /*    setting design axis coordinates.                                   */
+  /*                                                                       */
+  /*    Besides Adobe MM fonts, the interface supports Apple's TrueType GX */
+  /*    and OpenType variation fonts.  Some of the routines only work with */
+  /*    Adobe MM fonts, others will work with all three types.  They are   */
+  /*    similar enough that a consistent interface makes sense.            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Axis                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model a given axis in design space for Multiple     */
+  /*    Masters fonts.                                                     */
+  /*                                                                       */
+  /*    This structure can't be used for TrueType GX or OpenType variation */
+  /*    fonts.                                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  typedef struct  FT_MM_Axis_
+  {
+    FT_String*  name;
+    FT_Long     minimum;
+    FT_Long     maximum;
+
+  } FT_MM_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Multi_Master                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model the axes and space of a Multiple Masters      */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    This structure can't be used for TrueType GX or OpenType variation */
+  /*    fonts.                                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */
+  /*                                                                       */
+  /*    num_designs :: Number of designs; should be normally 2^num_axis    */
+  /*                   even though the Type~1 specification strangely      */
+  /*                   allows for intermediate designs to be present.      */
+  /*                   This number cannot exceed~16.                       */
+  /*                                                                       */
+  /*    axis        :: A table of axis descriptors.                        */
+  /*                                                                       */
+  typedef struct  FT_Multi_Master_
+  {
+    FT_UInt     num_axis;
+    FT_UInt     num_designs;
+    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
+
+  } FT_Multi_Master;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Axis                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model a given axis in design space for Multiple     */
+  /*    Masters, TrueType GX, and OpenType variation fonts.                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*               Not always meaningful for TrueType GX or OpenType       */
+  /*               variation fonts.                                        */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    def     :: The axis's default design coordinate.                   */
+  /*               FreeType computes meaningful default values for Adobe   */
+  /*               MM fonts.                                               */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  /*    tag     :: The axis's tag (the equivalent to `name' for TrueType   */
+  /*               GX and OpenType variation fonts).  FreeType provides    */
+  /*               default values for Adobe MM fonts if possible.          */
+  /*                                                                       */
+  /*    strid   :: The axis name entry in the font's `name' table.  This   */
+  /*               is another (and often better) version of the `name'     */
+  /*               field for TrueType GX or OpenType variation fonts.  Not */
+  /*               meaningful for Adobe MM fonts.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The fields `minimum', `def', and `maximum' are 16.16 fractional    */
+  /*    values for TrueType GX and OpenType variation fonts.  For Adobe MM */
+  /*    fonts, the values are integers.                                    */
+  /*                                                                       */
+  typedef struct  FT_Var_Axis_
+  {
+    FT_String*  name;
+
+    FT_Fixed    minimum;
+    FT_Fixed    def;
+    FT_Fixed    maximum;
+
+    FT_ULong    tag;
+    FT_UInt     strid;
+
+  } FT_Var_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Named_Style                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model a named instance in a TrueType GX or OpenType */
+  /*    variation font.                                                    */
+  /*                                                                       */
+  /*    This structure can't be used for Adobe MM fonts.                   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    coords :: The design coordinates for this instance.                */
+  /*              This is an array with one entry for each axis.           */
+  /*                                                                       */
+  /*    strid  :: The entry in `name' table identifying this instance.     */
+  /*                                                                       */
+  /*    psid   :: The entry in `name' table identifying a PostScript name  */
+  /*              for this instance.  Value 0xFFFF indicates a missing     */
+  /*              entry.                                                   */
+  /*                                                                       */
+  typedef struct  FT_Var_Named_Style_
+  {
+    FT_Fixed*  coords;
+    FT_UInt    strid;
+    FT_UInt    psid;   /* since 2.7.1 */
+
+  } FT_Var_Named_Style;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Var                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model the axes and space of an Adobe MM, TrueType   */
+  /*    GX, or OpenType variation font.                                    */
+  /*                                                                       */
+  /*    Some fields are specific to one format and not to the others.      */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis        :: The number of axes.  The maximum value is~4 for */
+  /*                       Adobe MM fonts; no limit in TrueType GX or      */
+  /*                       OpenType variation fonts.                       */
+  /*                                                                       */
+  /*    num_designs     :: The number of designs; should be normally       */
+  /*                       2^num_axis for Adobe MM fonts.  Not meaningful  */
+  /*                       for TrueType GX or OpenType variation fonts     */
+  /*                       (where every glyph could have a different       */
+  /*                       number of designs).                             */
+  /*                                                                       */
+  /*    num_namedstyles :: The number of named styles; a `named style' is  */
+  /*                       a tuple of design coordinates that has a string */
+  /*                       ID (in the `name' table) associated with it.    */
+  /*                       The font can tell the user that, for example,   */
+  /*                       [Weight=1.5,Width=1.1] is `Bold'.  Another name */
+  /*                       for `named style' is `named instance'.          */
+  /*                                                                       */
+  /*                       For Adobe Multiple Masters fonts, this value is */
+  /*                       always zero because the format does not support */
+  /*                       named styles.                                   */
+  /*                                                                       */
+  /*    axis            :: An axis descriptor table.                       */
+  /*                       TrueType GX and OpenType variation fonts        */
+  /*                       contain slightly more data than Adobe MM fonts. */
+  /*                       Memory management of this pointer is done       */
+  /*                       internally by FreeType.                         */
+  /*                                                                       */
+  /*    namedstyle      :: A named style (instance) table.                 */
+  /*                       Only meaningful for TrueType GX and OpenType    */
+  /*                       variation fonts.  Memory management of this     */
+  /*                       pointer is done internally by FreeType.         */
+  /*                                                                       */
+  typedef struct  FT_MM_Var_
+  {
+    FT_UInt              num_axis;
+    FT_UInt              num_designs;
+    FT_UInt              num_namedstyles;
+    FT_Var_Axis*         axis;
+    FT_Var_Named_Style*  namedstyle;
+
+  } FT_MM_Var;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Multi_Master                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a variation descriptor of a given Adobe MM font.          */
+  /*                                                                       */
+  /*    This function can't be used with TrueType GX or OpenType variation */
+  /*    fonts.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters descriptor.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a variation descriptor for a given font.                  */
+  /*                                                                       */
+  /*    This function works with all supported variation formats.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The variation descriptor.                               */
+  /*               Allocates a data structure, which the user must         */
+  /*               deallocate with a call to @FT_Done_MM_Var after use.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_MM_Var                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Free the memory allocated by @FT_Get_MM_Var.                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle of the face's parent library object that was   */
+  /*               used in the call to @FT_Get_MM_Var to create `amaster'. */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_MM_Var( FT_Library   library,
+                  FT_MM_Var   *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Design_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Adobe MM fonts, choose an interpolated font design through     */
+  /*    design coordinates.                                                */
+  /*                                                                       */
+  /*    This function can't be used with TrueType GX or OpenType variation */
+  /*    fonts.                                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of available design coordinates.  If it   */
+  /*                  is larger than the number of axes, ignore the excess */
+  /*                  values.  If it is smaller than the number of axes,   */
+  /*                  use default values for the remaining axes.           */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Design_Coordinates                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Choose an interpolated font design through design coordinates.     */
+  /*                                                                       */
+  /*    This function works with all supported variation formats.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of available design coordinates.  If it   */
+  /*                  is larger than the number of axes, ignore the excess */
+  /*                  values.  If it is smaller than the number of axes,   */
+  /*                  use default values for the remaining axes.           */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*    [Since 2.9] `Default values' means the currently selected named    */
+  /*    instance (or the base font if no named instance is selected).      */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Var_Design_Coordinates                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the design coordinates of the currently selected interpolated  */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    This function works with all supported variation formats.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /*    num_coords :: The number of design coordinates to retrieve.  If it */
+  /*                  is larger than the number of axes, set the excess    */
+  /*                  values to~0.                                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    coords     :: The design coordinates array.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Blend_Coordinates                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Choose an interpolated font design through normalized blend        */
+  /*    coordinates.                                                       */
+  /*                                                                       */
+  /*    This function works with all supported variation formats.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of available design coordinates.  If it   */
+  /*                  is larger than the number of axes, ignore the excess */
+  /*                  values.  If it is smaller than the number of axes,   */
+  /*                  use default values for the remaining axes.           */
+  /*                                                                       */
+  /*    coords     :: The design coordinates array (each element must be   */
+  /*                  between 0 and 1.0 for Adobe MM fonts, and between    */
+  /*                  -1.0 and 1.0 for TrueType GX and OpenType variation  */
+  /*                  fonts).                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*    [Since 2.9] `Default values' means the currently selected named    */
+  /*    instance (or the base font if no named instance is selected).      */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_MM_Blend_Coordinates                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the normalized blend coordinates of the currently selected     */
+  /*    interpolated font.                                                 */
+  /*                                                                       */
+  /*    This function works with all supported variation formats.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /*    num_coords :: The number of normalized blend coordinates to        */
+  /*                  retrieve.  If it is larger than the number of axes,  */
+  /*                  set the excess values to~0.5 for Adobe MM fonts, and */
+  /*                  to~0 for TrueType GX and OpenType variation fonts.   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    coords     :: The normalized blend coordinates array.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Blend_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Var_Blend_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is another name of @FT_Get_MM_Blend_Coordinates.              */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_VAR_AXIS_FLAG_XXX                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the return value of                    */
+  /*    @FT_Get_Var_Axis_Flags.                                            */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_VAR_AXIS_FLAG_HIDDEN ::                                         */
+  /*      The variation axis should not be exposed to user interfaces.     */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8.1                                                              */
+  /*                                                                       */
+#define FT_VAR_AXIS_FLAG_HIDDEN  1
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Var_Axis_Flags                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the `flags' field of an OpenType Variation Axis Record.        */
+  /*                                                                       */
+  /*    Not meaningful for Adobe MM fonts (`*flags' is always zero).       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    master     :: The variation descriptor.                            */
+  /*                                                                       */
+  /*    axis_index :: The index of the requested variation axis.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    flags      :: The `flags' field.  See @FT_VAR_AXIS_FLAG_XXX for    */
+  /*                  possible values.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8.1                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Var_Axis_Flags( FT_MM_Var*  master,
+                         FT_UInt     axis_index,
+                         FT_UInt*    flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Named_Instance                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set or change the current named instance.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face           :: A handle to the source face.                     */
+  /*                                                                       */
+  /*    instance_index :: The index of the requested instance, starting    */
+  /*                      with value 1.  If set to value 0, FreeType       */
+  /*                      switches to font access without a named          */
+  /*                      instance.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses the value of `instance_index' to set bits 16-30  */
+  /*    of the face's `face_index' field.  It also resets any variation    */
+  /*    applied to the font, and the @FT_FACE_FLAG_VARIATION bit of the    */
+  /*    face's `face_flags' field gets reset to zero (i.e.,                */
+  /*    @FT_IS_VARIATION will return false).                               */
+  /*                                                                       */
+  /*    For Adobe MM fonts (which don't have named instances) this         */
+  /*    function simply resets the current face to the default instance.   */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.9                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Named_Instance( FT_Face  face,
+                         FT_UInt  instance_index );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* FTMM_H_ */
+
+
+/* END */
diff --git a/include/ftmodapi.h b/include/freetype/ftmodapi.h
similarity index 87%
rename from include/ftmodapi.h
rename to include/freetype/ftmodapi.h
index 2ef3f46..a6eb876 100644
--- a/include/ftmodapi.h
+++ b/include/freetype/ftmodapi.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType modules public interface (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTMODAPI_H__
-#define __FTMODAPI_H__
+#ifndef FTMODAPI_H_
+#define FTMODAPI_H_
 
 
 #include <ft2build.h>
@@ -63,7 +63,7 @@
   /*      psaux                                                            */
   /*      pshinter                                                         */
   /*      psnames                                                          */
-  /*      raster1, raster5                                                 */
+  /*      raster1                                                          */
   /*      sfnt                                                             */
   /*      smooth, smooth-lcd, smooth-lcdv                                  */
   /*      truetype                                                         */
@@ -89,6 +89,7 @@
   /*                                                                       */
   /*    FT_Property_Set                                                    */
   /*    FT_Property_Get                                                    */
+  /*    FT_Set_Default_Properties                                          */
   /*                                                                       */
   /*    FT_New_Library                                                     */
   /*    FT_Done_Library                                                    */
@@ -111,12 +112,14 @@
 #define FT_MODULE_HINTER              4  /* this module is a glyph hinter */
 #define FT_MODULE_STYLER              8  /* this module is a styler       */
 
-#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */
+#define FT_MODULE_DRIVER_SCALABLE      0x100  /* the driver supports      */
                                               /* scalable fonts           */
-#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */
+#define FT_MODULE_DRIVER_NO_OUTLINES   0x200  /* the driver does not      */
                                               /* support vector outlines  */
-#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */
+#define FT_MODULE_DRIVER_HAS_HINTER    0x400  /* the driver provides its  */
                                               /* own hinter               */
+#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800  /* the driver's hinter      */
+                                              /* produces LIGHT hints     */
 
 
   /* deprecated values */
@@ -125,9 +128,10 @@
 #define ft_module_hinter              FT_MODULE_HINTER
 #define ft_module_styler              FT_MODULE_STYLER
 
-#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE
-#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES
-#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER
+#define ft_module_driver_scalable       FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines    FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter     FT_MODULE_DRIVER_HAS_HINTER
+#define ft_module_driver_hints_lightly  FT_MODULE_DRIVER_HINTS_LIGHTLY
 
 
   typedef FT_Pointer  FT_Module_Interface;
@@ -319,16 +323,15 @@
    *       The module name.
    *
    *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
+   *       The property name.  Properties are described in section
+   *       @properties.
    *
    *       Note that only a few modules have properties.
    *
    *    value ::
    *       A generic pointer to a variable or structure that gives the new
    *       value of the property.  The exact definition of `value' is
-   *       dependent on the property; see the `Synopsis' subsection of the
-   *       module's documentation.
+   *       dependent on the property; see section @properties.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -386,15 +389,14 @@
    *       The module name.
    *
    *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
+   *       The property name.  Properties are described in section
+   *       @properties.
    *
    * @inout:
    *    value ::
    *       A generic pointer to a variable or structure that gives the
    *       value of the property.  The exact definition of `value' is
-   *       dependent on the property; see the `Synopsis' subsection of the
-   *       module's documentation.
+   *       dependent on the property; see section @properties.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -437,6 +439,50 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
+  /*    FT_Set_Default_Properties                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is   */
+  /*    set, this function reads the `FREETYPE_PROPERTIES' environment     */
+  /*    variable to control driver properties.  See section @properties    */
+  /*    for more.                                                          */
+  /*                                                                       */
+  /*    If the compilation option is not set, this function does nothing.  */
+  /*                                                                       */
+  /*    `FREETYPE_PROPERTIES' has the following syntax form (broken here   */
+  /*    into multiple lines for better readability).                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      <optional whitespace>                                            */
+  /*      <module-name1> ':'                                               */
+  /*      <property-name1> '=' <property-value1>                           */
+  /*      <whitespace>                                                     */
+  /*      <module-name2> ':'                                               */
+  /*      <property-name2> '=' <property-value2>                           */
+  /*      ...                                                              */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Example:                                                           */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FREETYPE_PROPERTIES=truetype:interpreter-version=35 \            */
+  /*                          cff:no-stem-darkening=1 \                    */
+  /*                          autofitter:warping=1                         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a new library object.                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Default_Properties( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
   /*    FT_Reference_Library                                               */
   /*                                                                       */
   /* <Description>                                                         */
@@ -474,8 +520,9 @@
   /*    valid for the life of the @FT_Library object.                      */
   /*                                                                       */
   /*    Normally, you would call this function (followed by a call to      */
-  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */
-  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */
+  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module,    */
+  /*    and a call to @FT_Set_Default_Properties) instead of               */
+  /*    @FT_Init_FreeType to initialize the FreeType library.              */
   /*                                                                       */
   /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */
   /*    library instance.                                                  */
@@ -610,12 +657,7 @@
    *       The library doesn't implement any kind of bytecode interpreter.
    *
    *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
-   *       The library implements a bytecode interpreter that doesn't
-   *       support the patented operations of the TrueType virtual machine.
-   *
-   *       Its main use is to load certain Asian fonts that position and
-   *       scale glyph components with bytecode instructions.  It produces
-   *       bad output for most other fonts.
+   *       Deprecated and removed.
    *
    *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
    *       The library implements a bytecode interpreter that covers
@@ -663,7 +705,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTMODAPI_H__ */
+#endif /* FTMODAPI_H_ */
 
 
 /* END */
diff --git a/include/ftmoderr.h b/include/freetype/ftmoderr.h
similarity index 97%
rename from include/ftmoderr.h
rename to include/freetype/ftmoderr.h
index 9d7f981..e0fc131 100644
--- a/include/ftmoderr.h
+++ b/include/freetype/ftmoderr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType module error offsets (specification).                       */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -74,7 +74,7 @@
   /* with something like                                                   */
   /*                                                                       */
   /*   {                                                                   */
-  /*     #undef __FTMODERR_H__                                             */
+  /*     #undef FTMODERR_H_                                                */
   /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */
   /*     #define FT_MODERR_START_LIST     {                                */
   /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */
@@ -91,8 +91,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTMODERR_H__
-#define __FTMODERR_H__
+#ifndef FTMODERR_H_
+#define FTMODERR_H_
 
 
   /*******************************************************************/
@@ -188,7 +188,7 @@
 #undef FT_NEED_EXTERN_C
 
 
-#endif /* __FTMODERR_H__ */
+#endif /* FTMODERR_H_ */
 
 
 /* END */
diff --git a/include/ftotval.h b/include/freetype/ftotval.h
similarity index 94%
rename from include/ftotval.h
rename to include/freetype/ftotval.h
index e744b71..26731c2 100644
--- a/include/ftotval.h
+++ b/include/freetype/ftotval.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating OpenType tables (specification).         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,8 +27,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTOTVAL_H__
-#define __FTOTVAL_H__
+#ifndef FTOTVAL_H_
+#define FTOTVAL_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -106,12 +106,12 @@
 #define FT_VALIDATE_JSTF  0x1000
 #define FT_VALIDATE_MATH  0x2000
 
-#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \
-                        FT_VALIDATE_GDEF | \
-                        FT_VALIDATE_GPOS | \
-                        FT_VALIDATE_GSUB | \
-                        FT_VALIDATE_JSTF | \
-                        FT_VALIDATE_MATH
+#define FT_VALIDATE_OT  ( FT_VALIDATE_BASE | \
+                          FT_VALIDATE_GDEF | \
+                          FT_VALIDATE_GPOS | \
+                          FT_VALIDATE_GSUB | \
+                          FT_VALIDATE_JSTF | \
+                          FT_VALIDATE_MATH )
 
  /**********************************************************************
   *
@@ -198,7 +198,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTOTVAL_H__ */
+#endif /* FTOTVAL_H_ */
 
 
 /* END */
diff --git a/include/ftoutln.h b/include/freetype/ftoutln.h
similarity index 96%
rename from include/ftoutln.h
rename to include/freetype/ftoutln.h
index 106cfde..89389a4 100644
--- a/include/ftoutln.h
+++ b/include/freetype/ftoutln.h
@@ -5,7 +5,7 @@
 /*    Support for the FT_Outline type used to store glyph shapes of        */
 /*    most scalable font formats (specification).                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTOUTLN_H__
-#define __FTOUTLN_H__
+#ifndef FTOUTLN_H_
+#define FTOUTLN_H_
 
 
 #include <ft2build.h>
@@ -89,7 +89,7 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Walk over an outline's structure to decompose it into individual   */
-  /*    segments and Bézier arcs.  This function also emits `move to'      */
+  /*    segments and Bezier arcs.  This function also emits `move to'      */
   /*    operations to indicate the start of new contours in the outline.   */
   /*                                                                       */
   /* <Input>                                                               */
@@ -115,6 +115,10 @@
   /*    outline for stroking purposes (otherwise it would result in a      */
   /*    visible dot when round caps are used).                             */
   /*                                                                       */
+  /*    Similarly, the function returns success for an empty outline also  */
+  /*    (doing nothing, this is, not calling any emitter); if necessary,   */
+  /*    you should filter this out, too.                                   */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Outline_Decompose( FT_Outline*              outline,
                         const FT_Outline_Funcs*  func_interface,
@@ -186,9 +190,6 @@
   /*    If the outline's `owner' field is not set, only the outline        */
   /*    descriptor will be released.                                       */
   /*                                                                       */
-  /*    The reason why this function takes an `library' parameter is       */
-  /*    simply to use ft_mem_free().                                       */
-  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Outline_Done( FT_Library   library,
                    FT_Outline*  outline );
@@ -213,6 +214,10 @@
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    An empty outline, or an outline with a single point only is also   */
+  /*    valid.                                                             */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Outline_Check( FT_Outline*  outline );
 
@@ -224,10 +229,10 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return an outline's `control box'.  The control box encloses all   */
-  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    the outline's points, including Bezier control points.  Though it  */
   /*    coincides with the exact bounding box for most glyphs, it can be   */
   /*    slightly larger in some situations (like when rotating an outline  */
-  /*    that contains Bézier outside arcs).                                */
+  /*    that contains Bezier outside arcs).                                */
   /*                                                                       */
   /*    Computing the control box is very fast, while getting the bounding */
   /*    box can take much more time as it needs to walk over all segments  */
@@ -354,8 +359,8 @@
   /*                                                                       */
   /*    {                                                                  */
   /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
-  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */
-  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */
+  /*      if ( face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )            */
+  /*        FT_Outline_Embolden( &face->glyph->outline, strength );        */
   /*    }                                                                  */
   /*                                                                       */
   /*    To get meaningful results, font scaling values must be set with    */
@@ -377,6 +382,9 @@
   /*    @FT_Outline_Embolden, which uses the same strength in both         */
   /*    directions.                                                        */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.10                                                             */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Outline_EmboldenXY( FT_Outline*  outline,
                          FT_Pos       xstrength,
@@ -563,7 +571,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTOUTLN_H__ */
+#endif /* FTOUTLN_H_ */
 
 
 /* END */
diff --git a/include/freetype/ftparams.h b/include/freetype/ftparams.h
new file mode 100644
index 0000000..5a9006c
--- /dev/null
+++ b/include/freetype/ftparams.h
@@ -0,0 +1,205 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftparams.h                                                             */
+/*                                                                         */
+/*    FreeType API for possible FT_Parameter tags (specification only).    */
+/*                                                                         */
+/*  Copyright 2017-2018 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 FTPARAMS_H_
+#define FTPARAMS_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:
+   *   parameter_tags
+   *
+   * @title:
+   *   Parameter Tags
+   *
+   * @abstract:
+   *   Macros for driver property and font loading parameter tags.
+   *
+   * @description:
+   *   This section contains macros for the @FT_Parameter structure that are
+   *   used with various functions to activate some special functionality or
+   *   different behaviour of various components of FreeType.
+   *
+   */
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
+   *
+   * @description:
+   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
+   *   family names in the `name' table (introduced in OpenType version
+   *   1.4).  Use this for backward compatibility with legacy systems that
+   *   have a four-faces-per-family restriction.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \
+          FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \
+          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
+   *
+   * @description:
+   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
+   *   subfamily names in the `name' table (introduced in OpenType version
+   *   1.4).  Use this for backward compatibility with legacy systems that
+   *   have a four-faces-per-family restriction.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \
+          FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \
+          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_INCREMENTAL
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Open_Face to indicate
+   *   incremental glyph loading.
+   *
+   */
+#define FT_PARAM_TAG_INCREMENTAL \
+          FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_LCD_FILTER_WEIGHTS
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding argument specifies the five LCD filter weights for a
+   *   given face (if using @FT_LOAD_TARGET_LCD, for example), overriding
+   *   the global default values or the values set up with
+   *   @FT_Library_SetLcdFilterWeights.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \
+          FT_MAKE_TAG( 'l', 'c', 'd', 'f' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_RANDOM_SEED
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding 32bit signed integer argument overrides the font
+   *   driver's random seed value with a face-specific one; see
+   *   @random-seed.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_RANDOM_SEED \
+          FT_MAKE_TAG( 's', 'e', 'e', 'd' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_STEM_DARKENING
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding Boolean argument specifies whether to apply stem
+   *   darkening, overriding the global default values or the values set up
+   *   with @FT_Property_Set (see @no-stem-darkening).
+   *
+   *   This is a passive setting that only takes effect if the font driver
+   *   or autohinter honors it, which the CFF, Type~1, and CID drivers
+   *   always do, but the autohinter only in `light' hinting mode (as of
+   *   version 2.9).
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_STEM_DARKENING \
+          FT_MAKE_TAG( 'd', 'a', 'r', 'k' )
+
+
+ /***************************************************************************
+  *
+  * @constant:
+  *   FT_PARAM_TAG_UNPATENTED_HINTING
+  *
+  * @description:
+  *   Deprecated, no effect.
+  *
+  *   Previously: A constant used as the tag of an @FT_Parameter structure to
+  *   indicate that unpatented methods only should be used by the TrueType
+  *   bytecode interpreter for a typeface opened by @FT_Open_Face.
+  *
+  */
+#define FT_PARAM_TAG_UNPATENTED_HINTING \
+          FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* FTPARAMS_H_ */
+
+
+/* END */
diff --git a/include/ftpfr.h b/include/freetype/ftpfr.h
similarity index 95%
rename from include/ftpfr.h
rename to include/freetype/ftpfr.h
index a1c02a2..a69cc48 100644
--- a/include/ftpfr.h
+++ b/include/freetype/ftpfr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing PFR-specific data (specification only).   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTPFR_H__
-#define __FTPFR_H__
+#ifndef FTPFR_H_
+#define FTPFR_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -71,7 +71,7 @@
   *
   *    ametrics_x_scale ::
   *      A 16.16 fixed-point number used to scale distance expressed
-  *      in metrics units to device sub-pixels.  This is equivalent to
+  *      in metrics units to device subpixels.  This is equivalent to
   *      `face->size->x_scale', but for metrics only.  Optional (parameter
   *      can be NULL).
   *
@@ -123,7 +123,7 @@
   *    mode, which always returns distances converted to outline units.
   *
   *    You can use the value of the `x_scale' and `y_scale' parameters
-  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+  *    returned by @FT_Get_PFR_Metrics to scale these to device subpixels.
   */
   FT_EXPORT( FT_Error )
   FT_Get_PFR_Kerning( FT_Face     face,
@@ -154,7 +154,7 @@
   *
   * @note:
   *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
-  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+  *    to convert the advance to device subpixels (i.e., 1/64th of pixels).
   */
   FT_EXPORT( FT_Error )
   FT_Get_PFR_Advance( FT_Face   face,
@@ -166,7 +166,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTPFR_H__ */
+#endif /* FTPFR_H_ */
 
 
 /* END */
diff --git a/include/ftrender.h b/include/freetype/ftrender.h
similarity index 97%
rename from include/ftrender.h
rename to include/freetype/ftrender.h
index ec8da70..fa8ad22 100644
--- a/include/ftrender.h
+++ b/include/freetype/ftrender.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType renderer modules public interface (specification).          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTRENDER_H__
-#define __FTRENDER_H__
+#ifndef FTRENDER_H_
+#define FTRENDER_H_
 
 
 #include <ft2build.h>
@@ -75,6 +75,7 @@
   {
     FT_Long                 glyph_size;
     FT_Glyph_Format         glyph_format;
+
     FT_Glyph_InitFunc       glyph_init;
     FT_Glyph_DoneFunc       glyph_done;
     FT_Glyph_CopyFunc       glyph_copy;
@@ -87,7 +88,7 @@
   typedef FT_Error
   (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
                              FT_GlyphSlot      slot,
-                             FT_UInt           mode,
+                             FT_Render_Mode    mode,
                              const FT_Vector*  origin );
 
   typedef FT_Error
@@ -226,7 +227,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTRENDER_H__ */
+#endif /* FTRENDER_H_ */
 
 
 /* END */
diff --git a/include/ftsizes.h b/include/freetype/ftsizes.h
similarity index 98%
rename from include/ftsizes.h
rename to include/freetype/ftsizes.h
index bef8424..72cb08b 100644
--- a/include/ftsizes.h
+++ b/include/freetype/ftsizes.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType size objects management (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,8 +25,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTSIZES_H__
-#define __FTSIZES_H__
+#ifndef FTSIZES_H_
+#define FTSIZES_H_
 
 
 #include <ft2build.h>
@@ -153,7 +153,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTSIZES_H__ */
+#endif /* FTSIZES_H_ */
 
 
 /* END */
diff --git a/include/freetype/ftsnames.h b/include/freetype/ftsnames.h
new file mode 100644
index 0000000..8eb8d70
--- /dev/null
+++ b/include/freetype/ftsnames.h
@@ -0,0 +1,253 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.h                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT `name' tables (which are used        */
+/*    to hold font names, copyright info, notices, etc.) (specification).  */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2018 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 FTSNAMES_H_
+#define FTSNAMES_H_
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_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>                                                             */
+  /*    sfnt_names                                                         */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    SFNT Names                                                         */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Access the names embedded in TrueType and OpenType files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType and OpenType specifications allow the inclusion of    */
+  /*    a special names table (`name') in font files.  This table contains */
+  /*    textual (and internationalized) information regarding the font,    */
+  /*    like family name, copyright, version, etc.                         */
+  /*                                                                       */
+  /*    The definitions below are used to access them if available.        */
+  /*                                                                       */
+  /*    Note that this has nothing to do with glyph names!                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SfntName                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model an SFNT `name' table entry.              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platform_id :: The platform ID for `string'.                       */
+  /*                   See @TT_PLATFORM_XXX for possible values.           */
+  /*                                                                       */
+  /*    encoding_id :: The encoding ID for `string'.                       */
+  /*                   See @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,               */
+  /*                   @TT_ISO_ID_XXX, @TT_MS_ID_XXX, and @TT_ADOBE_ID_XXX */
+  /*                   for possible values.                                */
+  /*                                                                       */
+  /*    language_id :: The language ID for `string'.                       */
+  /*                   See @TT_MAC_LANGID_XXX and @TT_MS_LANGID_XXX for    */
+  /*                   possible values.                                    */
+  /*                                                                       */
+  /*                   Registered OpenType values for `language_id' are    */
+  /*                   always smaller than 0x8000; values equal or larger  */
+  /*                   than 0x8000 usually indicate a language tag string  */
+  /*                   (introduced in OpenType version 1.6).  Use function */
+  /*                   @FT_Get_Sfnt_LangTag with `language_id' as its      */
+  /*                   argument to retrieve the associated language tag.   */
+  /*                                                                       */
+  /*    name_id     :: An identifier for `string'.                         */
+  /*                   See @TT_NAME_ID_XXX for possible values.            */
+  /*                                                                       */
+  /*    string      :: The `name' string.  Note that its format differs    */
+  /*                   depending on the (platform,encoding) pair, being    */
+  /*                   either a string of bytes (without a terminating     */
+  /*                   NULL byte) or containing UTF-16BE entities.         */
+  /*                                                                       */
+  /*    string_len  :: The length of `string' in bytes.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Please refer to the TrueType or OpenType specification for more    */
+  /*    details.                                                           */
+  /*                                                                       */
+  typedef struct  FT_SfntName_
+  {
+    FT_UShort  platform_id;
+    FT_UShort  encoding_id;
+    FT_UShort  language_id;
+    FT_UShort  name_id;
+
+    FT_Byte*   string;      /* this string is *not* null-terminated! */
+    FT_UInt    string_len;  /* in bytes                              */
+
+  } FT_SfntName;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name_Count                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the number of name strings in the SFNT `name' table.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of strings in the `name' table.                         */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a string of the SFNT `name' table for a given index.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to the source face.                              */
+  /*                                                                       */
+  /*    idx   :: The index of the `name' string.                           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aname :: The indexed @FT_SfntName structure.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `string' array returned in the `aname' structure is not        */
+  /*    null-terminated.  Note that you don't have to deallocate `string'  */
+  /*    by yourself; FreeType takes care of it if you call @FT_Done_Face.  */
+  /*                                                                       */
+  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */
+  /*    `name' table entries, then do a loop until you get the right       */
+  /*    platform, encoding, and name ID.                                   */
+  /*                                                                       */
+  /*    `name' table format~1 entries can use language tags also, see      */
+  /*    @FT_Get_Sfnt_LangTag.                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SfntLangTag                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to model a language tag entry from an SFNT `name'      */
+  /*    table.                                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    string      :: The language tag string, encoded in UTF-16BE        */
+  /*                   (without trailing NULL bytes).                      */
+  /*                                                                       */
+  /*    string_len  :: The length of `string' in *bytes*.                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Please refer to the TrueType or OpenType specification for more    */
+  /*    details.                                                           */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
+  typedef struct  FT_SfntLangTag_
+  {
+    FT_Byte*  string;      /* this string is *not* null-terminated! */
+    FT_UInt   string_len;  /* in bytes                              */
+
+  } FT_SfntLangTag;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_LangTag                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the language tag associated with a language ID of an SFNT */
+  /*    `name' table entry.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the source face.                           */
+  /*                                                                       */
+  /*    langID   :: The language ID, as returned by @FT_Get_Sfnt_Name.     */
+  /*                This is always a value larger than 0x8000.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alangTag :: The language tag associated with the `name' table      */
+  /*                entry's language ID.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `string' array returned in the `alangTag' structure is not     */
+  /*    null-terminated.  Note that you don't have to deallocate `string'  */
+  /*    by yourself; FreeType takes care of it if you call @FT_Done_Face.  */
+  /*                                                                       */
+  /*    Only `name' table format~1 supports language tags.  For format~0   */
+  /*    tables, this function always returns FT_Err_Invalid_Table.  For    */
+  /*    invalid format~1 language ID values, FT_Err_Invalid_Argument is    */
+  /*    returned.                                                          */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_LangTag( FT_Face          face,
+                       FT_UInt          langID,
+                       FT_SfntLangTag  *alangTag );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* FTSNAMES_H_ */
+
+
+/* END */
diff --git a/include/ftstroke.h b/include/freetype/ftstroke.h
similarity index 97%
rename from include/ftstroke.h
rename to include/freetype/ftstroke.h
index 7ebb1e7..44b6fbe 100644
--- a/include/ftstroke.h
+++ b/include/freetype/ftstroke.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType path stroker (specification).                               */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FT_STROKE_H__
-#define __FT_STROKE_H__
+#ifndef FTSTROKE_H_
+#define FTSTROKE_H_
 
 #include <ft2build.h>
 #include FT_OUTLINE_H
@@ -136,7 +136,7 @@
    *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
    *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias
    *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
-   *     backwards compatibility.
+   *     backward compatibility.
    */
   typedef enum  FT_Stroker_LineJoin_
   {
@@ -466,7 +466,7 @@
    *   FT_Stroker_ConicTo
    *
    * @description:
-   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
+   *   `Draw' a single quadratic Bezier in the stroker's current sub-path,
    *   from the last position.
    *
    * @input:
@@ -474,7 +474,7 @@
    *     The target stroker handle.
    *
    *   control ::
-   *     A pointer to a Bézier control point.
+   *     A pointer to a Bezier control point.
    *
    *   to ::
    *     A pointer to the destination point.
@@ -498,7 +498,7 @@
    *   FT_Stroker_CubicTo
    *
    * @description:
-   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
+   *   `Draw' a single cubic Bezier in the stroker's current sub-path,
    *   from the last position.
    *
    * @input:
@@ -506,10 +506,10 @@
    *     The target stroker handle.
    *
    *   control1 ::
-   *     A pointer to the first Bézier control point.
+   *     A pointer to the first Bezier control point.
    *
    *   control2 ::
-   *     A pointer to second Bézier control point.
+   *     A pointer to second Bezier control point.
    *
    *   to ::
    *     A pointer to the destination point.
@@ -774,7 +774,7 @@
 
 FT_END_HEADER
 
-#endif /* __FT_STROKE_H__ */
+#endif /* FTSTROKE_H_ */
 
 
 /* END */
diff --git a/include/ftsynth.h b/include/freetype/ftsynth.h
similarity index 96%
rename from include/ftsynth.h
rename to include/freetype/ftsynth.h
index fbcbad8..ff9fb43 100644
--- a/include/ftsynth.h
+++ b/include/freetype/ftsynth.h
@@ -5,7 +5,7 @@
 /*    FreeType synthesizing code for emboldening and slanting              */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -41,8 +41,8 @@
   /* adapted to the particular needs.                               */
 
 
-#ifndef __FTSYNTH_H__
-#define __FTSYNTH_H__
+#ifndef FTSYNTH_H_
+#define FTSYNTH_H_
 
 
 #include <ft2build.h>
@@ -78,7 +78,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTSYNTH_H__ */
+#endif /* FTSYNTH_H_ */
 
 
 /* END */
diff --git a/include/ftsystem.h b/include/freetype/ftsystem.h
similarity index 98%
rename from include/ftsystem.h
rename to include/freetype/ftsystem.h
index 2bc9999..f6b1629 100644
--- a/include/ftsystem.h
+++ b/include/freetype/ftsystem.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType low-level system interface definition (specification).      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTSYSTEM_H__
-#define __FTSYSTEM_H__
+#ifndef FTSYSTEM_H_
+#define FTSYSTEM_H_
 
 
 #include <ft2build.h>
@@ -290,7 +290,7 @@
    *     The stream size in bytes.
    *
    *     In case of compressed streams where the size is unknown before
-   *     actually doing the decompression, the value is set to 0x7FFFFFFF. 
+   *     actually doing the decompression, the value is set to 0x7FFFFFFF.
    *     (Note that this size value can occur for normal streams also; it is
    *     thus just a hint.)
    *
@@ -349,7 +349,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTSYSTEM_H__ */
+#endif /* FTSYSTEM_H_ */
 
 
 /* END */
diff --git a/include/fttrigon.h b/include/freetype/fttrigon.h
similarity index 96%
rename from include/fttrigon.h
rename to include/freetype/fttrigon.h
index 3d821ba..2e3f3f1 100644
--- a/include/fttrigon.h
+++ b/include/freetype/fttrigon.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType trigonometric functions (specification).                    */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTTRIGON_H__
-#define __FTTRIGON_H__
+#ifndef FTTRIGON_H_
+#define FTTRIGON_H_
 
 #include FT_FREETYPE_H
 
@@ -225,8 +225,8 @@
    *
    * @description:
    *   Return the unit vector corresponding to a given angle.  After the
-   *   call, the value of `vec.x' will be `sin(angle)', and the value of
-   *   `vec.y' will be `cos(angle)'.
+   *   call, the value of `vec.x' will be `cos(angle)', and the value of
+   *   `vec.y' will be `sin(angle)'.
    *
    *   This function is useful to retrieve both the sinus and cosinus of a
    *   given angle quickly.
@@ -344,7 +344,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTTRIGON_H__ */
+#endif /* FTTRIGON_H_ */
 
 
 /* END */
diff --git a/include/fttypes.h b/include/freetype/fttypes.h
similarity index 99%
rename from include/fttypes.h
rename to include/freetype/fttypes.h
index 706a1be..f638c2e 100644
--- a/include/fttypes.h
+++ b/include/freetype/fttypes.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType simple types definitions (specification only).              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTTYPES_H__
-#define __FTTYPES_H__
+#ifndef FTTYPES_H_
+#define FTTYPES_H_
 
 
 #include <ft2build.h>
@@ -425,7 +425,7 @@
   /*    The address of the FreeType object that is under finalization.     */
   /*    Its client data is accessed through its `generic' field.           */
   /*                                                                       */
-  typedef void  (*FT_Generic_Finalizer)(void*  object);
+  typedef void  (*FT_Generic_Finalizer)( void*  object );
 
 
   /*************************************************************************/
@@ -596,7 +596,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTTYPES_H__ */
+#endif /* FTTYPES_H_ */
 
 
 /* END */
diff --git a/include/ftwinfnt.h b/include/freetype/ftwinfnt.h
similarity index 97%
rename from include/ftwinfnt.h
rename to include/freetype/ftwinfnt.h
index caedaa1..461c65b 100644
--- a/include/ftwinfnt.h
+++ b/include/freetype/ftwinfnt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing Windows fnt-specific data.                */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTWINFNT_H__
-#define __FTWINFNT_H__
+#ifndef FTWINFNT_H_
+#define FTWINFNT_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -78,7 +78,7 @@
    *     Mac Roman encoding.
    *
    *   FT_WinFNT_ID_OEM ::
-   *     From Michael Pöttgen <michael@poettgen.de>:
+   *     From Michael Poettgen <michael@poettgen.de>:
    *
    *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
    *       is used for the charset of vector fonts, like `modern.fon',
@@ -264,7 +264,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTWINFNT_H__ */
+#endif /* FTWINFNT_H_ */
 
 
 /* END */
diff --git a/include/internal/autohint.h b/include/freetype/internal/autohint.h
similarity index 98%
rename from include/internal/autohint.h
rename to include/freetype/internal/autohint.h
index 8d5a977..f4d308f 100644
--- a/include/internal/autohint.h
+++ b/include/freetype/internal/autohint.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level `autohint' module-specific interface (specification).     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,8 +24,8 @@
   /*************************************************************************/
 
 
-#ifndef __AUTOHINT_H__
-#define __AUTOHINT_H__
+#ifndef AUTOHINT_H_
+#define AUTOHINT_H_
 
 
   /*************************************************************************/
@@ -238,7 +238,7 @@
 
 FT_END_HEADER
 
-#endif /* __AUTOHINT_H__ */
+#endif /* AUTOHINT_H_ */
 
 
 /* END */
diff --git a/include/freetype/internal/cffotypes.h b/include/freetype/internal/cffotypes.h
new file mode 100644
index 0000000..57e7591
--- /dev/null
+++ b/include/freetype/internal/cffotypes.h
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffotypes.h                                                            */
+/*                                                                         */
+/*    Basic OpenType/CFF object type definitions (specification).          */
+/*                                                                         */
+/*  Copyright 2017-2018 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 CFFOTYPES_H_
+#define CFFOTYPES_H_
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  typedef TT_Face  CFF_Face;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Size                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType size object.                               */
+  /*                                                                       */
+  typedef struct  CFF_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */
+
+  } CFF_SizeRec, *CFF_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_GlyphSlot                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType glyph slot object.                         */
+  /*                                                                       */
+  typedef struct  CFF_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool  hint;
+    FT_Bool  scaled;
+
+    FT_Fixed  x_scale;
+    FT_Fixed  y_scale;
+
+  } CFF_GlyphSlotRec, *CFF_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Internal                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The interface to the `internal' field of `FT_Size'.                */
+  /*                                                                       */
+  typedef struct  CFF_InternalRec_
+  {
+    PSH_Globals  topfont;
+    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];
+
+  } CFF_InternalRec, *CFF_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Subglyph transformation record.                                       */
+  /*                                                                       */
+  typedef struct  CFF_Transform_
+  {
+    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
+    FT_Fixed    yx, yy;
+    FT_F26Dot6  ox, oy;     /* offsets                            */
+
+  } CFF_Transform;
+
+
+FT_END_HEADER
+
+
+#endif /* CFFOTYPES_H_ */
+
+
+/* END */
diff --git a/src/cff/cfftypes.h b/include/freetype/internal/cfftypes.h
similarity index 62%
rename from src/cff/cfftypes.h
rename to include/freetype/internal/cfftypes.h
index de8a5ee..7c07e1a 100644
--- a/src/cff/cfftypes.h
+++ b/include/freetype/internal/cfftypes.h
@@ -5,7 +5,7 @@
 /*    Basic OpenType/CFF type definitions and interface (specification     */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __CFFTYPES_H__
-#define __CFFTYPES_H__
+#ifndef CFFTYPES_H_
+#define CFFTYPES_H_
 
 
 #include <ft2build.h>
@@ -27,6 +27,7 @@
 #include FT_INTERNAL_SERVICE_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
 
 
 FT_BEGIN_HEADER
@@ -64,6 +65,7 @@
   {
     FT_Stream  stream;
     FT_ULong   start;
+    FT_UInt    hdr_size;
     FT_UInt    count;
     FT_Byte    off_size;
     FT_ULong   data_offset;
@@ -102,6 +104,79 @@
   } CFF_CharsetRec, *CFF_Charset;
 
 
+  /* cf. similar fields in file `ttgxvar.h' from the `truetype' module */
+
+  typedef struct  CFF_VarData_
+  {
+#if 0
+    FT_UInt  itemCount;       /* not used; always zero */
+    FT_UInt  shortDeltaCount; /* not used; always zero */
+#endif
+
+    FT_UInt   regionIdxCount; /* number of region indexes           */
+    FT_UInt*  regionIndices;  /* array of `regionIdxCount' indices; */
+                              /* these index `varRegionList'        */
+  } CFF_VarData;
+
+
+  /* contribution of one axis to a region */
+  typedef struct  CFF_AxisCoords_
+  {
+    FT_Fixed  startCoord;
+    FT_Fixed  peakCoord;      /* zero peak means no effect (factor = 1) */
+    FT_Fixed  endCoord;
+
+  } CFF_AxisCoords;
+
+
+  typedef struct  CFF_VarRegion_
+  {
+    CFF_AxisCoords*  axisList;      /* array of axisCount records */
+
+  } CFF_VarRegion;
+
+
+  typedef struct  CFF_VStoreRec_
+  {
+    FT_UInt         dataCount;
+    CFF_VarData*    varData;        /* array of dataCount records      */
+                                    /* vsindex indexes this array      */
+    FT_UShort       axisCount;
+    FT_UInt         regionCount;    /* total number of regions defined */
+    CFF_VarRegion*  varRegionList;
+
+  } CFF_VStoreRec, *CFF_VStore;
+
+
+  /* forward reference */
+  typedef struct CFF_FontRec_*  CFF_Font;
+
+
+  /* This object manages one cached blend vector.                  */
+  /*                                                               */
+  /* There is a BlendRec for Private DICT parsing in each subfont  */
+  /* and a BlendRec for charstrings in CF2_Font instance data.     */
+  /* A cached BV may be used across DICTs or Charstrings if inputs */
+  /* have not changed.                                             */
+  /*                                                               */
+  /* `usedBV' is reset at the start of each parse or charstring.   */
+  /* vsindex cannot be changed after a BV is used.                 */
+  /*                                                               */
+  /* Note: NDV is long (32/64 bit), while BV is 16.16 (FT_Int32).  */
+  typedef struct  CFF_BlendRec_
+  {
+    FT_Bool    builtBV;        /* blendV has been built           */
+    FT_Bool    usedBV;         /* blendV has been used            */
+    CFF_Font   font;           /* top level font struct           */
+    FT_UInt    lastVsindex;    /* last vsindex used               */
+    FT_UInt    lenNDV;         /* normDV length (aka numAxes)     */
+    FT_Fixed*  lastNDV;        /* last NDV used                   */
+    FT_UInt    lenBV;          /* BlendV length (aka numMasters)  */
+    FT_Int32*  BV;             /* current blendV (per DICT/glyph) */
+
+  } CFF_BlendRec, *CFF_Blend;
+
+
   typedef struct  CFF_FontRecDictRec_
   {
     FT_UInt    version;
@@ -145,9 +220,23 @@
     FT_ULong   cid_fd_select_offset;
     FT_UInt    cid_font_name;
 
+    /* the next fields come from the data of the deprecated          */
+    /* `MultipleMaster' operator; they are needed to parse the (also */
+    /* deprecated) `blend' operator in Type 2 charstrings            */
+    FT_UShort  num_designs;
+    FT_UShort  num_axes;
+
+    /* fields for CFF2 */
+    FT_ULong   vstore_offset;
+    FT_UInt    maxstack;
+
   } CFF_FontRecDictRec, *CFF_FontRecDict;
 
 
+  /* forward reference */
+  typedef struct CFF_SubFontRec_*  CFF_SubFont;
+
+
   typedef struct  CFF_PrivateRec_
   {
     FT_Byte   num_blue_values;
@@ -180,6 +269,10 @@
     FT_Pos    default_width;
     FT_Pos    nominal_width;
 
+    /* fields for CFF2 */
+    FT_UInt      vsindex;
+    CFF_SubFont  subfont;
+
   } CFF_PrivateRec, *CFF_Private;
 
 
@@ -207,10 +300,31 @@
     CFF_FontRecDictRec  font_dict;
     CFF_PrivateRec      private_dict;
 
-    CFF_IndexRec        local_subrs_index;
-    FT_Byte**           local_subrs; /* array of pointers into Local Subrs INDEX data */
+    /* fields for CFF2 */
+    CFF_BlendRec  blend;      /* current blend vector       */
+    FT_UInt       lenNDV;     /* current length NDV or zero */
+    FT_Fixed*     NDV;        /* ptr to current NDV or NULL */
 
-  } CFF_SubFontRec, *CFF_SubFont;
+    /* `blend_stack' is a writable buffer to hold blend results.          */
+    /* This buffer is to the side of the normal cff parser stack;         */
+    /* `cff_parse_blend' and `cff_blend_doBlend' push blend results here. */
+    /* The normal stack then points to these values instead of the DICT   */
+    /* because all other operators in Private DICT clear the stack.       */
+    /* `blend_stack' could be cleared at each operator other than blend.  */
+    /* Blended values are stored as 5-byte fixed point values.            */
+
+    FT_Byte*  blend_stack;    /* base of stack allocation     */
+    FT_Byte*  blend_top;      /* first empty slot             */
+    FT_UInt   blend_used;     /* number of bytes in use       */
+    FT_UInt   blend_alloc;    /* number of bytes allocated    */
+
+    CFF_IndexRec  local_subrs_index;
+    FT_Byte**     local_subrs; /* array of pointers           */
+                               /* into Local Subrs INDEX data */
+
+    FT_UInt32  random;
+
+  } CFF_SubFontRec;
 
 
 #define CFF_MAX_CID_FONTS  256
@@ -218,16 +332,20 @@
 
   typedef struct  CFF_FontRec_
   {
+    FT_Library       library;
     FT_Stream        stream;
-    FT_Memory        memory;
+    FT_Memory        memory;        /* TODO: take this from stream->memory? */
+    FT_ULong         base_offset;   /* offset to start of CFF */
     FT_UInt          num_faces;
     FT_UInt          num_glyphs;
 
     FT_Byte          version_major;
     FT_Byte          version_minor;
     FT_Byte          header_size;
-    FT_Byte          absolute_offsize;
 
+    FT_UInt          top_dict_length;   /* cff2 only */
+
+    FT_Bool          cff2;
 
     CFF_IndexRec     name_index;
     CFF_IndexRec     top_dict_index;
@@ -250,6 +368,7 @@
     FT_UInt          num_strings;
     FT_Byte**        strings;
     FT_Byte*         string_pool;
+    FT_ULong         string_pool_size;
 
     CFF_SubFontRec   top_font;
     FT_UInt          num_subfonts;
@@ -263,6 +382,9 @@
     /* interface to Postscript Names service */
     FT_Service_PsCMaps  psnames;
 
+    /* interface to CFFLoad service */
+    const void*  cffload;
+
     /* since version 2.3.0 */
     PS_FontInfoRec*  font_info;   /* font info dictionary */
 
@@ -273,12 +395,18 @@
     /* since version 2.4.12 */
     FT_Generic       cf2_instance;
 
-  } CFF_FontRec, *CFF_Font;
+    /* since version 2.7.1 */
+    CFF_VStoreRec    vstore;        /* parsed vstore structure */
+
+    /* since version 2.9 */
+    PS_FontExtraRec*  font_extra;
+
+  } CFF_FontRec;
 
 
 FT_END_HEADER
 
-#endif /* __CFFTYPES_H__ */
+#endif /* CFFTYPES_H_ */
 
 
 /* END */
diff --git a/include/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
similarity index 86%
rename from include/internal/ftcalc.h
rename to include/freetype/internal/ftcalc.h
index 75752c3..818a812 100644
--- a/include/internal/ftcalc.h
+++ b/include/freetype/internal/ftcalc.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Arithmetic computations (specification).                             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTCALC_H__
-#define __FTCALC_H__
+#ifndef FTCALC_H_
+#define FTCALC_H_
 
 
 #include <ft2build.h>
@@ -47,7 +47,7 @@
   FT_MulFix_arm( FT_Int32  a,
                  FT_Int32  b )
   {
-    register FT_Int32  t, t2;
+    FT_Int32  t, t2;
 
 
     __asm
@@ -80,7 +80,7 @@
   FT_MulFix_arm( FT_Int32  a,
                  FT_Int32  b )
   {
-    register FT_Int32  t, t2;
+    FT_Int32  t, t2;
 
 
     __asm__ __volatile__ (
@@ -116,7 +116,7 @@
   FT_MulFix_i386( FT_Int32  a,
                   FT_Int32  b )
   {
-    register FT_Int32  result;
+    FT_Int32  result;
 
 
     __asm__ __volatile__ (
@@ -152,7 +152,7 @@
   FT_MulFix_i386( FT_Int32  a,
                   FT_Int32  b )
   {
-    register FT_Int32  result;
+    FT_Int32  result;
 
     __asm
     {
@@ -300,6 +300,18 @@
 
 
   /*
+   *  This function normalizes a vector and returns its original length.
+   *  The normalized vector is a 16.16 fixed-point unit vector with length
+   *  close to 0x10000.  The accuracy of the returned length is limited to
+   *  16 bits also.  The function utilizes quick inverse square root
+   *  approximation without divisions and square roots relying on Newton's
+   *  iterations instead.
+   */
+  FT_BASE( FT_UInt32 )
+  FT_Vector_NormLen( FT_Vector*  vector );
+
+
+  /*
    *  Return -1, 0, or +1, depending on the orientation of a given corner.
    *  We use the Cartesian coordinate system, with positive vertical values
    *  going upwards.  The function returns +1 if the corner turns to the
@@ -387,20 +399,46 @@
 #endif /* 0 */
 
 
-#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
-#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
-#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
-#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
-#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
+#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) * 64  )    /* << 6  */
+#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) * 16384 )  /* << 14 */
+#define INT_TO_FIXED( x )      ( (FT_Long)(x) * 65536 )  /* << 16 */
+#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) * 4 )      /* << 2  */
 #define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
 
 #define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
                                         : ( -( ( 32 - (x) ) & -64 ) ) )
 
+  /*
+   *  The following macros have two purposes.
+   *
+   *  . Tag places where overflow is expected and harmless.
+   *
+   *  . Avoid run-time sanitizer errors.
+   *
+   *  Use with care!
+   */
+#define ADD_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
+#define SUB_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
+#define MUL_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
+#define NEG_LONG( a )                                \
+          (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
+
+#define ADD_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
+#define SUB_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
+#define MUL_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
+#define NEG_INT32( a )                                  \
+          (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
+
 
 FT_END_HEADER
 
-#endif /* __FTCALC_H__ */
+#endif /* FTCALC_H_ */
 
 
 /* END */
diff --git a/include/internal/ftdebug.h b/include/freetype/internal/ftdebug.h
similarity index 98%
rename from include/internal/ftdebug.h
rename to include/freetype/internal/ftdebug.h
index 216c730..292a4ee 100644
--- a/include/internal/ftdebug.h
+++ b/include/freetype/internal/ftdebug.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,8 +21,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTDEBUG_H__
-#define __FTDEBUG_H__
+#ifndef FTDEBUG_H_
+#define FTDEBUG_H_
 
 
 #include <ft2build.h>
@@ -249,7 +249,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTDEBUG_H__ */
+#endif /* FTDEBUG_H_ */
 
 
 /* END */
diff --git a/include/internal/ftdriver.h b/include/freetype/internal/ftdrv.h
similarity index 96%
rename from include/internal/ftdriver.h
rename to include/freetype/internal/ftdrv.h
index 16856d3..58dd35a 100644
--- a/include/internal/ftdriver.h
+++ b/include/freetype/internal/ftdrv.h
@@ -1,10 +1,10 @@
 /***************************************************************************/
 /*                                                                         */
-/*  ftdriver.h                                                             */
+/*  ftdrv.h                                                                */
 /*                                                                         */
-/*    FreeType font driver interface (specification).                      */
+/*    FreeType internal font driver interface (specification).             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTDRIVER_H__
-#define __FTDRIVER_H__
+#ifndef FTDRV_H_
+#define FTDRV_H_
 
 
 #include <ft2build.h>
@@ -67,15 +67,6 @@
                        FT_Int32      load_flags );
 
 
-  typedef FT_UInt
-  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,
-                               FT_Long     charcode );
-
-  typedef FT_Long
-  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,
-                              FT_Long     charcode );
-
-
   typedef FT_Error
   (*FT_Face_GetKerningFunc)( FT_Face     face,
                              FT_UInt     left_glyph,
@@ -213,7 +204,7 @@
   /*    And when it is no longer needed a `destroy' function needs to be   */
   /*    called to release that allocation.                                 */
   /*                                                                       */
-  /*    `fcinit.c' (ft_create_default_module_classes) already contains a   */
+  /*    `ftinit.c' (ft_create_default_module_classes) already contains a   */
   /*    mechanism to call these functions for the default modules          */
   /*    described in `ftmodule.h'.                                         */
   /*                                                                       */
@@ -403,7 +394,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTDRIVER_H__ */
+#endif /* FTDRV_H_ */
 
 
 /* END */
diff --git a/include/internal/ftgloadr.h b/include/freetype/internal/ftgloadr.h
similarity index 85%
rename from include/internal/ftgloadr.h
rename to include/freetype/internal/ftgloadr.h
index 970dd70..a002fdb 100644
--- a/include/internal/ftgloadr.h
+++ b/include/freetype/internal/ftgloadr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph loader (specification).                           */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTGLOADR_H__
-#define __FTGLOADR_H__
+#ifndef FTGLOADR_H_
+#define FTGLOADR_H_
 
 
 #include <ft2build.h>
@@ -36,24 +36,6 @@
   /*    The glyph loader is an internal object used to load several glyphs */
   /*    together (for example, in the case of composites).                 */
   /*                                                                       */
-  /* <Note>                                                                */
-  /*    The glyph loader implementation is not part of the high-level API, */
-  /*    hence the forward structure declaration.                           */
-  /*                                                                       */
-  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;
-
-
-#if 0  /* moved to freetype.h in version 2.2 */
-#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
-#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
-#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
-#define FT_SUBGLYPH_FLAG_SCALE                   8
-#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
-#define FT_SUBGLYPH_FLAG_2X2                  0x80
-#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
-#endif
-
-
   typedef struct  FT_SubGlyphRec_
   {
     FT_Int     index;
@@ -89,7 +71,7 @@
 
     void*            other;            /* for possible future extension? */
 
-  } FT_GlyphLoaderRec;
+  } FT_GlyphLoaderRec, *FT_GlyphLoader;
 
 
   /* create new empty glyph loader */
@@ -166,7 +148,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTGLOADR_H__ */
+#endif /* FTGLOADR_H_ */
 
 
 /* END */
diff --git a/include/freetype/internal/fthash.h b/include/freetype/internal/fthash.h
new file mode 100644
index 0000000..f22f9d5
--- /dev/null
+++ b/include/freetype/internal/fthash.h
@@ -0,0 +1,136 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fthash.h                                                               */
+/*                                                                         */
+/*    Hashing functions (specification).                                   */
+/*                                                                         */
+/***************************************************************************/
+
+/*
+ * Copyright 2000 Computing Research Labs, New Mexico State University
+ * Copyright 2001-2015
+ *   Francesco Zappa Nardelli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50     */
+  /*                                                                       */
+  /*  taken from Mark Leisher's xmbdfed package                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef FTHASH_H_
+#define FTHASH_H_
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  typedef union  FT_Hashkey_
+  {
+    FT_Int       num;
+    const char*  str;
+
+  } FT_Hashkey;
+
+
+  typedef struct  FT_HashnodeRec_
+  {
+    FT_Hashkey  key;
+    size_t      data;
+
+  } FT_HashnodeRec;
+
+  typedef struct FT_HashnodeRec_  *FT_Hashnode;
+
+
+  typedef FT_ULong
+  (*FT_Hash_LookupFunc)( FT_Hashkey*  key );
+
+  typedef FT_Bool
+  (*FT_Hash_CompareFunc)( FT_Hashkey*  a,
+                          FT_Hashkey*  b );
+
+
+  typedef struct  FT_HashRec_
+  {
+    FT_UInt  limit;
+    FT_UInt  size;
+    FT_UInt  used;
+
+    FT_Hash_LookupFunc   lookup;
+    FT_Hash_CompareFunc  compare;
+
+    FT_Hashnode*  table;
+
+  } FT_HashRec;
+
+  typedef struct FT_HashRec_  *FT_Hash;
+
+
+  FT_Error
+  ft_hash_str_init( FT_Hash    hash,
+                    FT_Memory  memory );
+
+  FT_Error
+  ft_hash_num_init( FT_Hash    hash,
+                    FT_Memory  memory );
+
+  void
+  ft_hash_str_free( FT_Hash    hash,
+                    FT_Memory  memory );
+
+#define ft_hash_num_free  ft_hash_str_free
+
+  FT_Error
+  ft_hash_str_insert( const char*  key,
+                      size_t       data,
+                      FT_Hash      hash,
+                      FT_Memory    memory );
+
+  FT_Error
+  ft_hash_num_insert( FT_Int     num,
+                      size_t     data,
+                      FT_Hash    hash,
+                      FT_Memory  memory );
+
+  size_t*
+  ft_hash_str_lookup( const char*  key,
+                      FT_Hash      hash );
+
+  size_t*
+  ft_hash_num_lookup( FT_Int   num,
+                      FT_Hash  hash );
+
+
+FT_END_HEADER
+
+
+#endif /* FTHASH_H_ */
+
+
+/* END */
diff --git a/include/internal/ftmemory.h b/include/freetype/internal/ftmemory.h
similarity index 96%
rename from include/internal/ftmemory.h
rename to include/freetype/internal/ftmemory.h
index c0c553b..054eaec 100644
--- a/include/internal/ftmemory.h
+++ b/include/freetype/internal/ftmemory.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType memory management macros (specification).               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTMEMORY_H__
-#define __FTMEMORY_H__
+#ifndef FTMEMORY_H_
+#define FTMEMORY_H_
 
 
 #include <ft2build.h>
@@ -65,13 +65,15 @@
 
 #ifdef __cplusplus
 
-  extern "C++"
+extern "C++"
+{
   template <typename T> inline T*
   cplusplus_typeof(        T*,
                     void  *v )
   {
     return static_cast <T*> ( v );
   }
+}
 
 #define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )
 
@@ -106,10 +108,12 @@
 
   /*
    *  The allocation functions return a pointer, and the error code
-   *  is written to through the `p_error' parameter.  See below for
-   *  for documentation.
+   *  is written to through the `p_error' parameter.
    */
 
+  /* The `q' variants of the functions below (`q' for `quick') don't fill */
+  /* the allocated or reallocated memory with zero bytes.                 */
+
   FT_BASE( FT_Pointer )
   ft_mem_alloc( FT_Memory  memory,
                 FT_Long    size,
@@ -141,6 +145,9 @@
                const void*  P );
 
 
+  /* The `Q' variants of the macros below (`Q' for `quick') don't fill */
+  /* the allocated or reallocated memory with zero bytes.              */
+
 #define FT_MEM_ALLOC( ptr, size )                               \
           FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory,          \
                                                (FT_Long)(size), \
@@ -203,7 +210,7 @@
                                                   NULL,                 \
                                                   &error ) )
 
-#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \
           FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
                                                   (FT_Long)(itmsz),  \
                                                   (FT_Long)(oldcnt), \
@@ -380,7 +387,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTMEMORY_H__ */
+#endif /* FTMEMORY_H_ */
 
 
 /* END */
diff --git a/include/internal/ftobjs.h b/include/freetype/internal/ftobjs.h
similarity index 91%
rename from include/internal/ftobjs.h
rename to include/freetype/internal/ftobjs.h
index 37317a4..1c3c6ad 100644
--- a/include/internal/ftobjs.h
+++ b/include/freetype/internal/ftobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,8 +23,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTOBJS_H__
-#define __FTOBJS_H__
+#ifndef FTOBJS_H_
+#define FTOBJS_H_
 
 #include <ft2build.h>
 #include FT_RENDER_H
@@ -36,6 +36,7 @@
 #include FT_INTERNAL_AUTOHINT_H
 #include FT_INTERNAL_SERVICE_H
 #include FT_INTERNAL_PIC_H
+#include FT_INTERNAL_CALC_H
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 #include FT_INCREMENTAL_H
@@ -83,15 +84,31 @@
             x > y ? x + ( 3 * y >> 3 )   \
                   : y + ( 3 * x >> 3 ) )
 
-  /* we use the TYPEOF macro to suppress signedness compilation warnings */
-#define FT_PAD_FLOOR( x, n )  ( (x) & ~TYPEOF( x )( (n)-1 ) )
-#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )
-#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )
+  /* we use FT_TYPEOF to suppress signedness compilation warnings */
+#define FT_PAD_FLOOR( x, n )  ( (x) & ~FT_TYPEOF( x )( (n) - 1 ) )
+#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + (n) / 2, n )
+#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + (n) - 1, n )
 
-#define FT_PIX_FLOOR( x )     ( (x) & ~TYPEOF( x )63 )
+#define FT_PIX_FLOOR( x )     ( (x) & ~FT_TYPEOF( x )63 )
 #define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
 #define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
 
+  /* specialized versions (for signed values)                   */
+  /* that don't produce run-time errors due to integer overflow */
+#define FT_PAD_ROUND_LONG( x, n )  FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \
+                                                 n )
+#define FT_PAD_CEIL_LONG( x, n )   FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \
+                                                 n )
+#define FT_PIX_ROUND_LONG( x )     FT_PIX_FLOOR( ADD_LONG( (x), 32 ) )
+#define FT_PIX_CEIL_LONG( x )      FT_PIX_FLOOR( ADD_LONG( (x), 63 ) )
+
+#define FT_PAD_ROUND_INT32( x, n )  FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \
+                                                  n )
+#define FT_PAD_CEIL_INT32( x, n )   FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \
+                                                  n )
+#define FT_PIX_ROUND_INT32( x )     FT_PIX_FLOOR( ADD_INT32( (x), 32 ) )
+#define FT_PIX_CEIL_INT32( x )      FT_PIX_FLOOR( ADD_INT32( (x), 63 ) )
+
 
   /*
    *  character classification functions -- since these are used to parse
@@ -138,8 +155,8 @@
 
   } FT_CMapRec;
 
-  /* typecase any pointer to a charmap handle */
-#define FT_CMAP( x )              ((FT_CMap)( x ))
+  /* typecast any pointer to a charmap handle */
+#define FT_CMAP( x )  ( (FT_CMap)( x ) )
 
   /* obvious macros */
 #define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id
@@ -193,6 +210,7 @@
   typedef struct  FT_CMap_ClassRec_
   {
     FT_ULong               size;
+
     FT_CMap_InitFunc       init;
     FT_CMap_DoneFunc       done;
     FT_CMap_CharIndexFunc  char_index;
@@ -294,6 +312,27 @@
   FT_CMap_Done( FT_CMap  cmap );
 
 
+  /* adds LCD padding to Min and Max boundaries */
+  FT_BASE( void )
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
+                                            FT_Render_Mode  render_mode,
+                                            FT_Byte*        weights );
+
+
+  /* This is the default LCD filter, an in-place, 5-tap FIR filter. */
+  FT_BASE( void )
+  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
+                     FT_Render_Mode       mode,
+                     FT_LcdFiveTapFilter  weights );
+
+#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -341,11 +380,20 @@
   /*      this data when first opened.  This field exists only if          */
   /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
   /*                                                                       */
-  /*    ignore_unpatented_hinter ::                                        */
-  /*      This boolean flag instructs the glyph loader to ignore the       */
-  /*      native font hinter, if one is found.  This is exclusively used   */
-  /*      in the case when the unpatented hinter is compiled within the    */
-  /*      library.                                                         */
+  /*    no_stem_darkening ::                                               */
+  /*      Overrides the module-level default, see @stem-darkening[cff],    */
+  /*      for example.  FALSE and TRUE toggle stem darkening on and off,   */
+  /*      respectively, value~-1 means to use the module/driver default.   */
+  /*                                                                       */
+  /*    random_seed ::                                                     */
+  /*      If positive, override the seed value for the CFF `random'        */
+  /*      operator.  Value~0 means to use the font's value.  Value~-1      */
+  /*      means to use the CFF driver's default.                           */
+  /*                                                                       */
+  /*    lcd_weights      ::                                                */
+  /*    lcd_filter_func  ::                                                */
+  /*      If subpixel rendering is activated, the LCD filtering weights    */
+  /*      and callback function.                                           */
   /*                                                                       */
   /*    refcount ::                                                        */
   /*      A counter initialized to~1 at the time an @FT_Face structure is  */
@@ -355,9 +403,9 @@
   /*                                                                       */
   typedef struct  FT_Face_InternalRec_
   {
-    FT_Matrix           transform_matrix;
-    FT_Vector           transform_delta;
-    FT_Int              transform_flags;
+    FT_Matrix  transform_matrix;
+    FT_Vector  transform_delta;
+    FT_Int     transform_flags;
 
     FT_ServiceCacheRec  services;
 
@@ -365,8 +413,15 @@
     FT_Incremental_InterfaceRec*  incremental_interface;
 #endif
 
-    FT_Bool             ignore_unpatented_hinter;
-    FT_Int              refcount;
+    FT_Char              no_stem_darkening;
+    FT_Int32             random_seed;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
+#endif
+
+    FT_Int  refcount;
 
   } FT_Face_InternalRec;
 
@@ -419,8 +474,6 @@
   } FT_GlyphSlot_InternalRec;
 
 
-#if 0
-
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -428,18 +481,26 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    This structure contains the internal fields of each FT_Size        */
-  /*    object.  Currently, it's empty.                                    */
+  /*    object.                                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    module_data      :: Data specific to a driver module.              */
+  /*                                                                       */
+  /*    autohint_mode    :: The used auto-hinting mode.                    */
+  /*                                                                       */
+  /*    autohint_metrics :: Metrics used by the auto-hinter.               */
   /*                                                                       */
   /*************************************************************************/
 
   typedef struct  FT_Size_InternalRec_
   {
-    /* empty */
+    void*  module_data;
+
+    FT_Render_Mode   autohint_mode;
+    FT_Size_Metrics  autohint_metrics;
 
   } FT_Size_InternalRec;
 
-#endif
-
 
   /*************************************************************************/
   /*************************************************************************/
@@ -479,7 +540,8 @@
 
 
   /* typecast an object to an FT_Module */
-#define FT_MODULE( x )          ((FT_Module)( x ))
+#define FT_MODULE( x )  ( (FT_Module)(x) )
+
 #define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz
 #define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library
 #define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory
@@ -506,6 +568,9 @@
 #define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
                                      FT_MODULE_DRIVER_HAS_HINTER )
 
+#define FT_DRIVER_HINTS_LIGHTLY( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                        FT_MODULE_DRIVER_HINTS_LIGHTLY )
+
 
   /*************************************************************************/
   /*                                                                       */
@@ -534,7 +599,16 @@
 
   FT_BASE( FT_Pointer )
   ft_module_get_service( FT_Module    module,
-                         const char*  service_id );
+                         const char*  service_id,
+                         FT_Bool      global );
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+  FT_BASE( FT_Error )
+  ft_property_string_set( FT_Library        library,
+                          const FT_String*  module_name,
+                          const FT_String*  property_name,
+                          FT_String*        value );
+#endif
 
   /* */
 
@@ -553,9 +627,9 @@
 
   /* a few macros used to perform easy typecasts with minimal brain damage */
 
-#define FT_FACE( x )          ((FT_Face)(x))
-#define FT_SIZE( x )          ((FT_Size)(x))
-#define FT_SLOT( x )          ((FT_GlyphSlot)(x))
+#define FT_FACE( x )          ( (FT_Face)(x) )
+#define FT_SIZE( x )          ( (FT_Size)(x) )
+#define FT_SLOT( x )          ( (FT_GlyphSlot)(x) )
 
 #define FT_FACE_DRIVER( x )   FT_FACE( x )->driver
 #define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
@@ -656,6 +730,12 @@
   ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
 
 
+  /* Preset bitmap metrics of an outline glyphslot prior to rendering. */
+  FT_BASE( void )
+  ft_glyphslot_preset_bitmap( FT_GlyphSlot      slot,
+                              FT_Render_Mode    mode,
+                              const FT_Vector*  origin );
+
   /* Allocate a new bitmap buffer in a glyph slot. */
   FT_BASE( FT_Error )
   ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
@@ -682,10 +762,10 @@
   /*************************************************************************/
 
 
-#define FT_RENDERER( x )      ((FT_Renderer)( x ))
-#define FT_GLYPH( x )         ((FT_Glyph)( x ))
-#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))
-#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+#define FT_RENDERER( x )       ( (FT_Renderer)(x) )
+#define FT_GLYPH( x )          ( (FT_Glyph)(x) )
+#define FT_BITMAP_GLYPH( x )   ( (FT_BitmapGlyph)(x) )
+#define FT_OUTLINE_GLYPH( x )  ( (FT_OutlineGlyph)(x) )
 
 
   typedef struct  FT_RendererRec_
@@ -716,7 +796,7 @@
 
 
   /* typecast a module into a driver easily */
-#define FT_DRIVER( x )        ((FT_Driver)(x))
+#define FT_DRIVER( x )  ( (FT_Driver)(x) )
 
   /* typecast a module as a driver, and get its driver class */
 #define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz
@@ -769,19 +849,7 @@
 
   /* This hook is used by the TrueType debugger.  It must be set to an */
   /* alternate truetype bytecode interpreter function.                 */
-#define FT_DEBUG_HOOK_TRUETYPE            0
-
-
-  /* Set this debug hook to a non-null pointer to force unpatented hinting */
-  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */
-  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */
-  /* during debugging.                                                     */
-#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1
-
-
-  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
-                                            FT_Render_Mode  render_mode,
-                                            FT_Library      library );
+#define FT_DEBUG_HOOK_TRUETYPE  0
 
 
   /*************************************************************************/
@@ -822,20 +890,12 @@
   /*                        handle to the current renderer for the         */
   /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
   /*                                                                       */
-  /*    auto_hinter      :: XXX                                            */
+  /*    auto_hinter      :: The auto-hinter module interface.              */
   /*                                                                       */
-  /*    raster_pool      :: The raster object's render pool.  This can     */
-  /*                        ideally be changed dynamically at run-time.    */
-  /*                                                                       */
-  /*    raster_pool_size :: The size of the render pool in bytes.          */
-  /*                                                                       */
-  /*    debug_hooks      :: XXX                                            */
-  /*                                                                       */
-  /*    lcd_filter       :: If subpixel rendering is activated, the        */
-  /*                        selected LCD filter mode.                      */
-  /*                                                                       */
-  /*    lcd_extra        :: If subpixel rendering is activated, the number */
-  /*                        of extra pixels needed for the LCD filter.     */
+  /*    debug_hooks      :: An array of four function pointers that allow  */
+  /*                        debuggers to hook into a font format's         */
+  /*                        interpreter.  Currently, only the TrueType     */
+  /*                        bytecode debugger uses this.                   */
   /*                                                                       */
   /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */
   /*                        filter weights, if any.                        */
@@ -844,7 +904,7 @@
   /*                        filtering callback function.                   */
   /*                                                                       */
   /*    pic_container    :: Contains global structs and tables, instead    */
-  /*                        of defining them globallly.                    */
+  /*                        of defining them globally.                     */
   /*                                                                       */
   /*    refcount         :: A counter initialized to~1 at the time an      */
   /*                        @FT_Library structure is created.              */
@@ -868,16 +928,10 @@
     FT_Renderer        cur_renderer;     /* current outline renderer */
     FT_Module          auto_hinter;
 
-    FT_Byte*           raster_pool;      /* scan-line conversion */
-                                         /* render pool          */
-    FT_ULong           raster_pool_size; /* size of render pool in bytes */
-
     FT_DebugHook_Func  debug_hooks[4];
 
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    FT_LcdFilter             lcd_filter;
-    FT_Int                   lcd_extra;        /* number of extra pixels */
-    FT_Byte                  lcd_weights[7];   /* filter weights, if any */
+    FT_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
     FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
 #endif
 
@@ -982,8 +1036,8 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Used to initialize an instance of FT_Outline_Funcs struct.         */
-  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
-  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init function will need    */
+  /*    to be called with a pre-allocated structure to be filled.          */
   /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
   /*    allocated in the global scope (or the scope where the macro        */
   /*    is used).                                                          */
@@ -1041,8 +1095,8 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Used to initialize an instance of FT_Raster_Funcs struct.          */
-  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
-  /*    be called with a pre-allocated structure to be filled.             */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init function will need    */
+  /*    to be called with a pre-allocated structure to be filled.          */
   /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
   /*    allocated in the global scope (or the scope where the macro        */
   /*    is used).                                                          */
@@ -1101,8 +1155,8 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Used to initialize an instance of FT_Glyph_Class struct.           */
-  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
-  /*    be called with a pre-allocated stcture to be filled.               */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init function will need    */
+  /*    to be called with a pre-allocated structure to be filled.          */
   /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
   /*    allocated in the global scope (or the scope where the macro        */
   /*    is used).                                                          */
@@ -1175,11 +1229,11 @@
   /* <Description>                                                         */
   /*    Used to initialize an instance of FT_Renderer_Class struct.        */
   /*                                                                       */
-  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion will need  */
-  /*    to be called with a pointer where the allocated structure is       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function will      */
+  /*    need to be called with a pointer where the allocated structure is  */
   /*    returned.  And when it is no longer needed a `destroy' function    */
   /*    needs to be called to release that allocation.                     */
-  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    `ftinit.c' (ft_create_default_module_classes) already contains     */
   /*    a mechanism to call these functions for the default modules        */
   /*    described in `ftmodule.h'.                                         */
   /*                                                                       */
@@ -1379,11 +1433,11 @@
   /* <Description>                                                         */
   /*    Used to initialize an instance of an FT_Module_Class struct.       */
   /*                                                                       */
-  /*    When FT_CONFIG_OPTION_PIC is defined a `create' funtion needs to   */
-  /*    be called with a pointer where the allocated structure is          */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs     */
+  /*    to be called with a pointer where the allocated structure is       */
   /*    returned.  And when it is no longer needed a `destroy' function    */
   /*    needs to be called to release that allocation.                     */
-  /*    `fcinit.c' (ft_create_default_module_classes) already contains     */
+  /*    `ftinit.c' (ft_create_default_module_classes) already contains     */
   /*    a mechanism to call these functions for the default modules        */
   /*    described in `ftmodule.h'.                                         */
   /*                                                                       */
@@ -1565,7 +1619,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTOBJS_H__ */
+#endif /* FTOBJS_H_ */
 
 
 /* END */
diff --git a/include/internal/ftpic.h b/include/freetype/internal/ftpic.h
similarity index 94%
rename from include/internal/ftpic.h
rename to include/freetype/internal/ftpic.h
index 7f9154f..5214f05 100644
--- a/include/internal/ftpic.h
+++ b/include/freetype/internal/ftpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services (declaration).       */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,8 +23,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTPIC_H__
-#define __FTPIC_H__
+#ifndef FTPIC_H_
+#define FTPIC_H_
 
 
 FT_BEGIN_HEADER
@@ -65,7 +65,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTPIC_H__ */
+#endif /* FTPIC_H_ */
 
 
 /* END */
diff --git a/src/autofit/hbshim.h b/include/freetype/internal/ftpsprop.h
similarity index 60%
rename from src/autofit/hbshim.h
rename to include/freetype/internal/ftpsprop.h
index 5636ca6..abbb628 100644
--- a/src/autofit/hbshim.h
+++ b/include/freetype/internal/ftpsprop.h
@@ -1,10 +1,10 @@
 /***************************************************************************/
 /*                                                                         */
-/*  hbshim.h                                                               */
+/*  ftpsprop.h                                                             */
 /*                                                                         */
-/*    HarfBuzz interface for accessing OpenType features (specification).  */
+/*    Get and set properties of PostScript drivers (specification).        */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2017-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,41 +16,33 @@
 /***************************************************************************/
 
 
-#ifndef __HBSHIM_H__
-#define __HBSHIM_H__
+#ifndef FTPSPROP_H_
+#define FTPSPROP_H_
 
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
 
 
-#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
-
-#include <hb.h>
-#include <hb-ot.h>
-#include <hb-ft.h>
-
-#endif
-
-
 FT_BEGIN_HEADER
 
-  FT_Error
-  af_get_coverage( AF_FaceGlobals  globals,
-                   AF_StyleClass   style_class,
-                   FT_Byte*        gstyles );
 
-  FT_Error
-  af_get_char_index( AF_StyleMetrics  metrics,
-                     FT_ULong         charcode,
-                     FT_ULong        *codepoint,
-                     FT_Long         *y_offset );
+  FT_BASE_CALLBACK( FT_Error )
+  ps_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string );
 
- /* */
+  FT_BASE_CALLBACK( FT_Error )
+  ps_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   void*        value );
+
 
 FT_END_HEADER
 
-#endif /* __HBSHIM_H__ */
+
+#endif /* FTPSPROP_H_ */
 
 
 /* END */
diff --git a/include/internal/ftrfork.h b/include/freetype/internal/ftrfork.h
similarity index 98%
rename from include/internal/ftrfork.h
rename to include/freetype/internal/ftrfork.h
index da61ca7..1aca48a 100644
--- a/include/internal/ftrfork.h
+++ b/include/freetype/internal/ftrfork.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Embedded resource forks accessor (specification).                    */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,8 +21,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTRFORK_H__
-#define __FTRFORK_H__
+#ifndef FTRFORK_H_
+#define FTRFORK_H_
 
 
 #include <ft2build.h>
@@ -43,11 +43,12 @@
 
   typedef struct  FT_RFork_Ref_
   {
-    FT_UShort  res_id;
-    FT_Long    offset;
+    FT_Short  res_id;
+    FT_Long   offset;
 
   } FT_RFork_Ref;
 
+
 #ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
   typedef FT_Error
   (*ft_raccess_guess_func)( FT_Library  library,
@@ -227,7 +228,7 @@
   /*    sort_by_res_id ::                                                  */
   /*      A Boolean to sort the fragmented resource by their ids.          */
   /*      The fragmented resources for `POST' resource should be sorted    */
-  /*      to restore Type1 font properly.  For `snft' resources, sorting   */
+  /*      to restore Type1 font properly.  For `sfnt' resources, sorting   */
   /*      may induce a different order of the faces in comparison to that  */
   /*      by QuickDraw API.                                                */
   /*                                                                       */
@@ -260,7 +261,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTRFORK_H__ */
+#endif /* FTRFORK_H_ */
 
 
 /* END */
diff --git a/include/internal/ftserv.h b/include/freetype/internal/ftserv.h
similarity index 67%
rename from include/internal/ftserv.h
rename to include/freetype/internal/ftserv.h
index 8f837e4..e01c167 100644
--- a/include/internal/ftserv.h
+++ b/include/freetype/internal/ftserv.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType services (specification only).                          */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -28,8 +28,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTSERV_H__
-#define __FTSERV_H__
+#ifndef FTSERV_H_
+#define FTSERV_H_
 
 
 FT_BEGIN_HEADER
@@ -109,27 +109,27 @@
    */
 #ifdef __cplusplus
 
-#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
-  FT_BEGIN_STMNT                                                   \
-    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \
-    FT_Pointer   _tmp_;                                            \
-    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \
-                                                                   \
-                                                                   \
-    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
-    *_pptr_ = _tmp_;                                               \
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )                  \
+  FT_BEGIN_STMNT                                                      \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );       \
+    FT_Pointer   _tmp_;                                               \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                        \
+                                                                      \
+                                                                      \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \
+    *_pptr_ = _tmp_;                                                  \
   FT_END_STMNT
 
 #else /* !C++ */
 
-#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
-  FT_BEGIN_STMNT                                                   \
-    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \
-    FT_Pointer  _tmp_;                                             \
-                                                                   \
-                                                                   \
-    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
-    ptr   = _tmp_;                                                 \
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )                  \
+  FT_BEGIN_STMNT                                                      \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );        \
+    FT_Pointer  _tmp_;                                                \
+                                                                      \
+                                                                      \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id, 1 ); \
+    ptr   = _tmp_;                                                    \
   FT_END_STMNT
 
 #endif /* !C++ */
@@ -167,6 +167,7 @@
   /*    FT_DEFINE_SERVICEDESCREC5                                          */
   /*    FT_DEFINE_SERVICEDESCREC6                                          */
   /*    FT_DEFINE_SERVICEDESCREC7                                          */
+  /*    FT_DEFINE_SERVICEDESCREC8                                          */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Used to initialize an array of FT_ServiceDescRec structures.       */
@@ -283,6 +284,78 @@
     { NULL, NULL }                                                          \
   };
 
+#define FT_DEFINE_SERVICEDESCREC8( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7,                  \
+                                   serv_id_8, serv_data_8 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { serv_id_8, serv_data_8 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC9( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7,                  \
+                                   serv_id_8, serv_data_8,                  \
+                                   serv_id_9, serv_data_9 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { serv_id_8, serv_data_8 },                                             \
+    { serv_id_9, serv_data_9 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC10( class_,                                 \
+                                    serv_id_1, serv_data_1,                 \
+                                    serv_id_2, serv_data_2,                 \
+                                    serv_id_3, serv_data_3,                 \
+                                    serv_id_4, serv_data_4,                 \
+                                    serv_id_5, serv_data_5,                 \
+                                    serv_id_6, serv_data_6,                 \
+                                    serv_id_7, serv_data_7,                 \
+                                    serv_id_8, serv_data_8,                 \
+                                    serv_id_9, serv_data_9,                 \
+                                    serv_id_10, serv_data_10 )              \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { serv_id_8, serv_data_8 },                                             \
+    { serv_id_9, serv_data_9 },                                             \
+    { serv_id_10, serv_data_10 },                                           \
+    { NULL, NULL }                                                          \
+  };
+
 #else /* FT_CONFIG_OPTION_PIC */
 
 #define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
@@ -510,7 +583,7 @@
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class)            \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -561,7 +634,7 @@
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class)            \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -593,6 +666,183 @@
     return FT_Err_Ok;                                                       \
   }
 
+#define FT_DEFINE_SERVICEDESCREC8( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7,                  \
+                                   serv_id_8, serv_data_8 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 9 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = serv_id_7;                                         \
+    clazz[6].serv_data = serv_data_7;                                       \
+    clazz[7].serv_id   = serv_id_8;                                         \
+    clazz[7].serv_data = serv_data_8;                                       \
+    clazz[8].serv_id   = NULL;                                              \
+    clazz[8].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC9( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6,                  \
+                                   serv_id_7, serv_data_7,                  \
+                                   serv_id_8, serv_data_8,                  \
+                                   serv_id_9, serv_data_9 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 10 ) )                        \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = serv_id_7;                                         \
+    clazz[6].serv_data = serv_data_7;                                       \
+    clazz[7].serv_id   = serv_id_8;                                         \
+    clazz[7].serv_data = serv_data_8;                                       \
+    clazz[8].serv_id   = serv_id_9;                                         \
+    clazz[8].serv_data = serv_data_9;                                       \
+    clazz[9].serv_id   = NULL;                                              \
+    clazz[9].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC10( class_,                                 \
+                                    serv_id_1, serv_data_1,                 \
+                                    serv_id_2, serv_data_2,                 \
+                                    serv_id_3, serv_data_3,                 \
+                                    serv_id_4, serv_data_4,                 \
+                                    serv_id_5, serv_data_5,                 \
+                                    serv_id_6, serv_data_6,                 \
+                                    serv_id_7, serv_data_7,                 \
+                                    serv_id_8, serv_data_8,                 \
+                                    serv_id_9, serv_data_9,                 \
+                                    serv_id_10, serv_data_10 )              \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 11 ) )                        \
+      return error;                                                         \
+                                                                            \
+    clazz[ 0].serv_id   = serv_id_1;                                        \
+    clazz[ 0].serv_data = serv_data_1;                                      \
+    clazz[ 1].serv_id   = serv_id_2;                                        \
+    clazz[ 1].serv_data = serv_data_2;                                      \
+    clazz[ 2].serv_id   = serv_id_3;                                        \
+    clazz[ 2].serv_data = serv_data_3;                                      \
+    clazz[ 3].serv_id   = serv_id_4;                                        \
+    clazz[ 3].serv_data = serv_data_4;                                      \
+    clazz[ 4].serv_id   = serv_id_5;                                        \
+    clazz[ 4].serv_data = serv_data_5;                                      \
+    clazz[ 5].serv_id   = serv_id_6;                                        \
+    clazz[ 5].serv_data = serv_data_6;                                      \
+    clazz[ 6].serv_id   = serv_id_7;                                        \
+    clazz[ 6].serv_data = serv_data_7;                                      \
+    clazz[ 7].serv_id   = serv_id_8;                                        \
+    clazz[ 7].serv_data = serv_data_8;                                      \
+    clazz[ 8].serv_id   = serv_id_9;                                        \
+    clazz[ 8].serv_data = serv_data_9;                                      \
+    clazz[ 9].serv_id   = serv_id_10;                                       \
+    clazz[ 9].serv_data = serv_data_10;                                     \
+    clazz[10].serv_id   = NULL;                                             \
+    clazz[10].serv_data = NULL;                                             \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
 
@@ -635,6 +885,7 @@
   {
     FT_Pointer  service_POSTSCRIPT_FONT_NAME;
     FT_Pointer  service_MULTI_MASTERS;
+    FT_Pointer  service_METRICS_VARIATIONS;
     FT_Pointer  service_GLYPH_DICT;
     FT_Pointer  service_PFR_METRICS;
     FT_Pointer  service_WINFNT;
@@ -655,7 +906,7 @@
    *   FT_FACE_LOOKUP_SERVICE
    *
    * @description:
-   *   This macro is used to lookup a service from a face's driver module
+   *   This macro is used to look up a service from a face's driver module
    *   using its cache.
    *
    * @input:
@@ -734,30 +985,32 @@
    *  The header files containing the services.
    */
 
-#define FT_SERVICE_BDF_H                <internal/services/svbdf.h>
-#define FT_SERVICE_CID_H                <internal/services/svcid.h>
-#define FT_SERVICE_GLYPH_DICT_H         <internal/services/svgldict.h>
-#define FT_SERVICE_GX_VALIDATE_H        <internal/services/svgxval.h>
-#define FT_SERVICE_KERNING_H            <internal/services/svkern.h>
-#define FT_SERVICE_MULTIPLE_MASTERS_H   <internal/services/svmm.h>
-#define FT_SERVICE_OPENTYPE_VALIDATE_H  <internal/services/svotval.h>
-#define FT_SERVICE_PFR_H                <internal/services/svpfr.h>
-#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <internal/services/svpscmap.h>
-#define FT_SERVICE_POSTSCRIPT_INFO_H    <internal/services/svpsinfo.h>
-#define FT_SERVICE_POSTSCRIPT_NAME_H    <internal/services/svpostnm.h>
-#define FT_SERVICE_PROPERTIES_H         <internal/services/svprop.h>
-#define FT_SERVICE_SFNT_H               <internal/services/svsfnt.h>
-#define FT_SERVICE_TRUETYPE_ENGINE_H    <internal/services/svtteng.h>
-#define FT_SERVICE_TT_CMAP_H            <internal/services/svttcmap.h>
-#define FT_SERVICE_WINFNT_H             <internal/services/svwinfnt.h>
-#define FT_SERVICE_FONT_FORMAT_H        <internal/services/svfntfmt.h>
-#define FT_SERVICE_TRUETYPE_GLYF_H      <internal/services/svttglyf.h>
+#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CFF_TABLE_LOAD_H     <freetype/internal/services/svcfftl.h>
+#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>
+#define FT_SERVICE_FONT_FORMAT_H        <freetype/internal/services/svfntfmt.h>
+#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>
+#define FT_SERVICE_METRICS_VARIATIONS_H <freetype/internal/services/svmetric.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.h>
+#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
+#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>
 
  /* */
 
 FT_END_HEADER
 
-#endif /* __FTSERV_H__ */
+#endif /* FTSERV_H_ */
 
 
 /* END */
diff --git a/include/internal/ftstream.h b/include/freetype/internal/ftstream.h
similarity index 98%
rename from include/internal/ftstream.h
rename to include/freetype/internal/ftstream.h
index 384e5df..f90002f 100644
--- a/include/internal/ftstream.h
+++ b/include/freetype/internal/ftstream.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Stream handling (specification).                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTSTREAM_H__
-#define __FTSTREAM_H__
+#ifndef FTSTREAM_H_
+#define FTSTREAM_H_
 
 
 #include <ft2build.h>
@@ -165,8 +165,8 @@
 #define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
 
 
-#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \
-                                      FT_BYTE_U16( p, 1, 0) )
+#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8 ) | \
+                                      FT_BYTE_U16( p, 1, 0 ) )
 
 #define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
                                         FT_BYTE_U16( p, 1, 0 ) )
@@ -502,7 +502,7 @@
 #define FT_STREAM_READ_AT( position, buffer, count )            \
           FT_SET_ERROR( FT_Stream_ReadAt( stream,               \
                                           (FT_ULong)(position), \
-                                          (FT_Byte*)buffer,     \
+                                          (FT_Byte*)(buffer),   \
                                           (FT_ULong)(count) ) )
 
 #define FT_STREAM_READ_FIELDS( fields, object )                          \
@@ -530,7 +530,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTSTREAM_H__ */
+#endif /* FTSTREAM_H_ */
 
 
 /* END */
diff --git a/include/internal/fttrace.h b/include/freetype/internal/fttrace.h
similarity index 96%
rename from include/internal/fttrace.h
rename to include/freetype/internal/fttrace.h
index 9d28d21..8092e41 100644
--- a/include/internal/fttrace.h
+++ b/include/freetype/internal/fttrace.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Tracing handling (specification only).                               */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -39,6 +39,7 @@
 FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
 FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
 FT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */
+FT_TRACE_DEF( psprops )   /* PS driver properties    (ftpsprop.c) */
 
   /* Cache sub-system */
 FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
@@ -66,20 +67,19 @@
 FT_TRACE_DEF( t1afm )
 FT_TRACE_DEF( t1driver )
 FT_TRACE_DEF( t1gload )
-FT_TRACE_DEF( t1hint )
 FT_TRACE_DEF( t1load )
 FT_TRACE_DEF( t1objs )
 FT_TRACE_DEF( t1parse )
 
   /* PostScript helper module `psaux' */
 FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( cffdecode )
 FT_TRACE_DEF( psobjs )
 FT_TRACE_DEF( psconv )
 
   /* PostScript hinting module `pshinter' */
 FT_TRACE_DEF( pshrec )
-FT_TRACE_DEF( pshalgo1 )
-FT_TRACE_DEF( pshalgo2 )
+FT_TRACE_DEF( pshalgo )
 
   /* Type 2 driver components */
 FT_TRACE_DEF( cffdriver )
@@ -96,7 +96,6 @@
 FT_TRACE_DEF( t42 )
 
   /* CID driver components */
-FT_TRACE_DEF( cidafm )
 FT_TRACE_DEF( ciddriver )
 FT_TRACE_DEF( cidgload )
 FT_TRACE_DEF( cidload )
@@ -148,7 +147,7 @@
 FT_TRACE_DEF( aflatin )
 FT_TRACE_DEF( aflatin2 )
 FT_TRACE_DEF( afwarp )
-FT_TRACE_DEF( afharfbuzz )
+FT_TRACE_DEF( afshaper )
 FT_TRACE_DEF( afglobal )
 
 /* END */
diff --git a/include/internal/ftvalid.h b/include/freetype/internal/ftvalid.h
similarity index 97%
rename from include/internal/ftvalid.h
rename to include/freetype/internal/ftvalid.h
index 9cda6ee..cad47a5 100644
--- a/include/internal/ftvalid.h
+++ b/include/freetype/internal/ftvalid.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validation support (specification).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTVALID_H__
-#define __FTVALID_H__
+#ifndef FTVALID_H_
+#define FTVALID_H_
 
 #include <ft2build.h>
 #include FT_CONFIG_STANDARD_LIBRARY_H   /* for ft_setjmp and ft_longjmp */
@@ -153,7 +153,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTVALID_H__ */
+#endif /* FTVALID_H_ */
 
 
 /* END */
diff --git a/include/freetype/internal/internal.h b/include/freetype/internal/internal.h
new file mode 100644
index 0000000..8f546e4
--- /dev/null
+++ b/include/freetype/internal/internal.h
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/*                                                                         */
+/*  internal.h                                                             */
+/*                                                                         */
+/*    Internal header files (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2018 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is automatically included by `ft2build.h'.                  */
+  /* Do not include it manually!                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_HASH_H                <freetype/internal/fthash.h>
+#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdrv.h>
+#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_PROPS_H    <freetype/internal/ftpsprop.h>
+
+#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
+
+#define FT_INTERNAL_CFF_TYPES_H           <freetype/internal/cfftypes.h>
+#define FT_INTERNAL_CFF_OBJECTS_TYPES_H   <freetype/internal/cffotypes.h>
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+
+  /* We disable the warning `conditional expression is constant' here */
+  /* in order to compile cleanly with the maximum level of warnings.  */
+  /* In particular, the warning complains about stuff like `while(0)' */
+  /* which is very useful in macro definitions.  There is no benefit  */
+  /* in having it enabled.                                            */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+/* END */
diff --git a/include/internal/psaux.h b/include/freetype/internal/psaux.h
similarity index 64%
rename from include/internal/psaux.h
rename to include/freetype/internal/psaux.h
index 1c5f784..f77380d 100644
--- a/include/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -5,7 +5,7 @@
 /*    Auxiliary functions and data structures related to PostScript fonts  */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,19 +17,40 @@
 /***************************************************************************/
 
 
-#ifndef __PSAUX_H__
-#define __PSAUX_H__
+#ifndef PSAUX_H_
+#define PSAUX_H_
 
 
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_HASH_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
+
 
 
 FT_BEGIN_HEADER
 
 
+  /***********************************************************************/
+  /*                                                                     */
+  /* PostScript modules driver class.                                    */
+  /*                                                                     */
+  typedef struct  PS_DriverRec_
+  {
+    FT_DriverRec  root;
+
+    FT_UInt   hinting_engine;
+    FT_Bool   no_stem_darkening;
+    FT_Int    darken_params[8];
+    FT_Int32  random_seed;
+
+  } PS_DriverRec, *PS_Driver;
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -441,6 +462,202 @@
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                         PS BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct PS_Builder_  PS_Builder;
+  typedef const struct PS_Builder_FuncsRec_*  PS_Builder_Funcs;
+
+  typedef struct  PS_Builder_FuncsRec_
+  {
+    void
+    (*init)( PS_Builder*  ps_builder,
+             void*        builder,
+             FT_Bool      is_t1 );
+
+    void
+    (*done)( PS_Builder*  builder );
+
+  } PS_Builder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    PS_Builder                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory       :: The current memory object.                         */
+  /*                                                                       */
+  /*    face         :: The current face object.                           */
+  /*                                                                       */
+  /*    glyph        :: The current glyph slot.                            */
+  /*                                                                       */
+  /*    loader       :: XXX                                                */
+  /*                                                                       */
+  /*    base         :: The base glyph outline.                            */
+  /*                                                                       */
+  /*    current      :: The current glyph outline.                         */
+  /*                                                                       */
+  /*    pos_x        :: The horizontal translation (if composite glyph).   */
+  /*                                                                       */
+  /*    pos_y        :: The vertical translation (if composite glyph).     */
+  /*                                                                       */
+  /*    left_bearing :: The left side bearing point.                       */
+  /*                                                                       */
+  /*    advance      :: The horizontal advance vector.                     */
+  /*                                                                       */
+  /*    bbox         :: Unused.                                            */
+  /*                                                                       */
+  /*    path_begun   :: A flag which indicates that a new path has begun.  */
+  /*                                                                       */
+  /*    load_points  :: If this flag is not set, no points are loaded.     */
+  /*                                                                       */
+  /*    no_recurse   :: Set but not used.                                  */
+  /*                                                                       */
+  /*    metrics_only :: A boolean indicating that we only want to compute  */
+  /*                    the metrics of a given glyph, not load all of its  */
+  /*                    points.                                            */
+  /*                                                                       */
+  /*    is_t1        :: Set if current font type is Type 1.                */
+  /*                                                                       */
+  /*    funcs        :: An array of function pointers for the builder.     */
+  /*                                                                       */
+  struct  PS_Builder_
+  {
+    FT_Memory       memory;
+    FT_Face         face;
+    CFF_GlyphSlot   glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos*  pos_x;
+    FT_Pos*  pos_y;
+
+    FT_Vector*  left_bearing;
+    FT_Vector*  advance;
+
+    FT_BBox*  bbox;          /* bounding box */
+    FT_Bool   path_begun;
+    FT_Bool   load_points;
+    FT_Bool   no_recurse;
+
+    FT_Bool  metrics_only;
+    FT_Bool  is_t1;
+
+    PS_Builder_FuncsRec  funcs;
+
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS DECODER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define PS_MAX_OPERANDS        48
+#define PS_MAX_SUBRS_CALLS     16   /* maximum subroutine nesting;         */
+                                    /* only 10 are allowed but there exist */
+                                    /* fonts like `HiraKakuProN-W3.ttf'    */
+                                    /* (Hiragino Kaku Gothic ProN W3;      */
+                                    /* 8.2d6e1; 2014-12-19) that exceed    */
+                                    /* this limit                          */
+
+  /* execution context charstring zone */
+
+  typedef struct  PS_Decoder_Zone_
+  {
+    FT_Byte*  base;
+    FT_Byte*  limit;
+    FT_Byte*  cursor;
+
+  } PS_Decoder_Zone;
+
+
+  typedef FT_Error
+  (*CFF_Decoder_Get_Glyph_Callback)( TT_Face    face,
+                                     FT_UInt    glyph_index,
+                                     FT_Byte**  pointer,
+                                     FT_ULong*  length );
+
+  typedef void
+  (*CFF_Decoder_Free_Glyph_Callback)( TT_Face    face,
+                                      FT_Byte**  pointer,
+                                      FT_ULong   length );
+
+
+  typedef struct  PS_Decoder_
+  {
+    PS_Builder  builder;
+
+    FT_Fixed   stack[PS_MAX_OPERANDS + 1];
+    FT_Fixed*  top;
+
+    PS_Decoder_Zone   zones[PS_MAX_SUBRS_CALLS + 1];
+    PS_Decoder_Zone*  zone;
+
+    FT_Int     flex_state;
+    FT_Int     num_flex_vectors;
+    FT_Vector  flex_vectors[7];
+
+    CFF_Font     cff;
+    CFF_SubFont  current_subfont; /* for current glyph_index */
+    FT_Generic*  cf2_instance;
+
+    FT_Pos*  glyph_width;
+    FT_Bool  width_only;
+    FT_Int   num_hints;
+
+    FT_UInt  num_locals;
+    FT_UInt  num_globals;
+
+    FT_Int  locals_bias;
+    FT_Int  globals_bias;
+
+    FT_Byte**  locals;
+    FT_Byte**  globals;
+
+    FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
+    FT_UInt    num_glyphs;    /* number of glyphs in font */
+
+    FT_Render_Mode  hint_mode;
+
+    FT_Bool  seac;
+
+    CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
+    CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
+
+    /* Type 1 stuff */
+    FT_Service_PsCMaps  psnames;      /* for seac */
+
+    FT_Int    lenIV;         /* internal for sub routine calls   */
+    FT_UInt*  locals_len;    /* array of subrs length (optional) */
+    FT_Hash   locals_hash;   /* used if `num_subrs' was massaged */
+
+    FT_Matrix  font_matrix;
+    FT_Vector  font_offset;
+
+    PS_Blend  blend;         /* for multiple master support */
+
+    FT_Long*  buildchar;
+    FT_UInt   len_buildchar;
+
+  } PS_Decoder;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                         T1 BUILDER                            *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -652,10 +869,23 @@
     void
     (*done)( T1_Decoder  decoder );
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
     FT_Error
-    (*parse_charstrings)( T1_Decoder  decoder,
-                          FT_Byte*    base,
-                          FT_UInt     len );
+    (*parse_charstrings_old)( T1_Decoder  decoder,
+                              FT_Byte*    base,
+                              FT_UInt     len );
+#else
+    FT_Error
+    (*parse_metrics)( T1_Decoder  decoder,
+                      FT_Byte*    base,
+                      FT_UInt     len );
+#endif
+
+    FT_Error
+    (*parse_charstrings)( PS_Decoder*  decoder,
+                          FT_Byte*     charstring_base,
+                          FT_ULong     charstring_len );
+
 
   } T1_Decoder_FuncsRec;
 
@@ -678,6 +908,7 @@
     FT_Int               num_subrs;
     FT_Byte**            subrs;
     FT_UInt*             subrs_len;    /* array of subrs length (optional) */
+    FT_Hash              subrs_hash;   /* used if `num_subrs' was massaged */
 
     FT_Matrix            font_matrix;
     FT_Vector            font_offset;
@@ -698,12 +929,261 @@
 
     FT_Bool              seac;
 
+    FT_Generic           cf2_instance;
+
   } T1_DecoderRec;
 
 
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                        CFF BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct CFF_Builder_  CFF_Builder;
+
+
+  typedef FT_Error
+  (*CFF_Builder_Check_Points_Func)( CFF_Builder*  builder,
+                                    FT_Int        count );
+
+  typedef void
+  (*CFF_Builder_Add_Point_Func)( CFF_Builder*  builder,
+                                 FT_Pos        x,
+                                 FT_Pos        y,
+                                 FT_Byte       flag );
+  typedef FT_Error
+  (*CFF_Builder_Add_Point1_Func)( CFF_Builder*  builder,
+                                  FT_Pos        x,
+                                  FT_Pos        y );
+  typedef FT_Error
+  (*CFF_Builder_Start_Point_Func)( CFF_Builder*  builder,
+                                   FT_Pos        x,
+                                   FT_Pos        y );
+  typedef void
+  (*CFF_Builder_Close_Contour_Func)( CFF_Builder*  builder );
+
+  typedef FT_Error
+  (*CFF_Builder_Add_Contour_Func)( CFF_Builder*  builder );
+
+  typedef const struct CFF_Builder_FuncsRec_*  CFF_Builder_Funcs;
+
+  typedef struct  CFF_Builder_FuncsRec_
+  {
+    void
+    (*init)( CFF_Builder*   builder,
+             TT_Face        face,
+             CFF_Size       size,
+             CFF_GlyphSlot  glyph,
+             FT_Bool        hinting );
+
+    void
+    (*done)( CFF_Builder*  builder );
+
+    CFF_Builder_Check_Points_Func   check_points;
+    CFF_Builder_Add_Point_Func      add_point;
+    CFF_Builder_Add_Point1_Func     add_point1;
+    CFF_Builder_Add_Contour_Func    add_contour;
+    CFF_Builder_Start_Point_Func    start_point;
+    CFF_Builder_Close_Contour_Func  close_contour;
+
+  } CFF_Builder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    CFF_Builder                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory        :: The current memory object.                        */
+  /*                                                                       */
+  /*    face          :: The current face object.                          */
+  /*                                                                       */
+  /*    glyph         :: The current glyph slot.                           */
+  /*                                                                       */
+  /*    loader        :: The current glyph loader.                         */
+  /*                                                                       */
+  /*    base          :: The base glyph outline.                           */
+  /*                                                                       */
+  /*    current       :: The current glyph outline.                        */
+  /*                                                                       */
+  /*    pos_x         :: The horizontal translation (if composite glyph).  */
+  /*                                                                       */
+  /*    pos_y         :: The vertical translation (if composite glyph).    */
+  /*                                                                       */
+  /*    left_bearing  :: The left side bearing point.                      */
+  /*                                                                       */
+  /*    advance       :: The horizontal advance vector.                    */
+  /*                                                                       */
+  /*    bbox          :: Unused.                                           */
+  /*                                                                       */
+  /*    path_begun    :: A flag which indicates that a new path has begun. */
+  /*                                                                       */
+  /*    load_points   :: If this flag is not set, no points are loaded.    */
+  /*                                                                       */
+  /*    no_recurse    :: Set but not used.                                 */
+  /*                                                                       */
+  /*    metrics_only  :: A boolean indicating that we only want to compute */
+  /*                     the metrics of a given glyph, not load all of its */
+  /*                     points.                                           */
+  /*                                                                       */
+  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  /*    hints_globals :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  /*    funcs         :: A table of method pointers for this object.       */
+  /*                                                                       */
+  struct  CFF_Builder_
+  {
+    FT_Memory       memory;
+    TT_Face         face;
+    CFF_GlyphSlot   glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos  pos_x;
+    FT_Pos  pos_y;
+
+    FT_Vector  left_bearing;
+    FT_Vector  advance;
+
+    FT_BBox  bbox;          /* bounding box */
+
+    FT_Bool  path_begun;
+    FT_Bool  load_points;
+    FT_Bool  no_recurse;
+
+    FT_Bool  metrics_only;
+
+    void*  hints_funcs;     /* hinter-specific */
+    void*  hints_globals;   /* hinter-specific */
+
+    CFF_Builder_FuncsRec  funcs;
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        CFF DECODER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define CFF_MAX_OPERANDS        48
+#define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
+                                    /* only 10 are allowed but there exist */
+                                    /* fonts like `HiraKakuProN-W3.ttf'    */
+                                    /* (Hiragino Kaku Gothic ProN W3;      */
+                                    /* 8.2d6e1; 2014-12-19) that exceed    */
+                                    /* this limit                          */
+#define CFF_MAX_TRANS_ELEMENTS  32
+
+  /* execution context charstring zone */
+
+  typedef struct  CFF_Decoder_Zone_
+  {
+    FT_Byte*  base;
+    FT_Byte*  limit;
+    FT_Byte*  cursor;
+
+  } CFF_Decoder_Zone;
+
+
+  typedef struct  CFF_Decoder_
+  {
+    CFF_Builder  builder;
+    CFF_Font     cff;
+
+    FT_Fixed   stack[CFF_MAX_OPERANDS + 1];
+    FT_Fixed*  top;
+
+    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
+    CFF_Decoder_Zone*  zone;
+
+    FT_Int     flex_state;
+    FT_Int     num_flex_vectors;
+    FT_Vector  flex_vectors[7];
+
+    FT_Pos  glyph_width;
+    FT_Pos  nominal_width;
+
+    FT_Bool   read_width;
+    FT_Bool   width_only;
+    FT_Int    num_hints;
+    FT_Fixed  buildchar[CFF_MAX_TRANS_ELEMENTS];
+
+    FT_UInt  num_locals;
+    FT_UInt  num_globals;
+
+    FT_Int  locals_bias;
+    FT_Int  globals_bias;
+
+    FT_Byte**  locals;
+    FT_Byte**  globals;
+
+    FT_Byte**  glyph_names;   /* for pure CFF fonts only  */
+    FT_UInt    num_glyphs;    /* number of glyphs in font */
+
+    FT_Render_Mode  hint_mode;
+
+    FT_Bool  seac;
+
+    CFF_SubFont  current_subfont; /* for current glyph_index */
+
+    CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
+    CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
+
+  } CFF_Decoder;
+
+
+  typedef const struct CFF_Decoder_FuncsRec_*  CFF_Decoder_Funcs;
+
+  typedef struct  CFF_Decoder_FuncsRec_
+  {
+    void
+    (*init)( CFF_Decoder*                     decoder,
+             TT_Face                          face,
+             CFF_Size                         size,
+             CFF_GlyphSlot                    slot,
+             FT_Bool                          hinting,
+             FT_Render_Mode                   hint_mode,
+             CFF_Decoder_Get_Glyph_Callback   get_callback,
+             CFF_Decoder_Free_Glyph_Callback  free_callback );
+
+    FT_Error
+    (*prepare)( CFF_Decoder*  decoder,
+                CFF_Size      size,
+                FT_UInt       glyph_index );
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    FT_Error
+    (*parse_charstrings_old)( CFF_Decoder*  decoder,
+                              FT_Byte*      charstring_base,
+                              FT_ULong      charstring_len,
+                              FT_Bool       in_dict );
+#endif
+
+    FT_Error
+    (*parse_charstrings)( PS_Decoder*  decoder,
+                          FT_Byte*     charstring_base,
+                          FT_ULong     charstring_len );
+
+  } CFF_Decoder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                            AFM PARSER                         *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -808,14 +1288,29 @@
                    FT_Offset  length,
                    FT_UShort  seed );
 
+    FT_UInt32
+    (*cff_random)( FT_UInt32  r );
+
+    void
+    (*ps_decoder_init)( PS_Decoder*  ps_decoder,
+                        void*        decoder,
+                        FT_Bool      is_t1 );
+
+    void
+    (*t1_make_subfont)( FT_Face      face,
+                        PS_Private   priv,
+                        CFF_SubFont  subfont );
+
     T1_CMap_Classes  t1_cmap_classes;
 
     /* fields after this comment line were added after version 2.1.10 */
     const AFM_Parser_FuncsRec*  afm_parser_funcs;
 
+    const CFF_Decoder_FuncsRec*  cff_decoder_funcs;
+
   } PSAux_ServiceRec, *PSAux_Service;
 
-  /* backwards-compatible type definition */
+  /* backward compatible type definition */
   typedef PSAux_ServiceRec   PSAux_Interface;
 
 
@@ -871,7 +1366,7 @@
 
 FT_END_HEADER
 
-#endif /* __PSAUX_H__ */
+#endif /* PSAUX_H_ */
 
 
 /* END */
diff --git a/include/internal/pshints.h b/include/freetype/internal/pshints.h
similarity index 99%
rename from include/internal/pshints.h
rename to include/freetype/internal/pshints.h
index 12aaaba..d29314e 100644
--- a/include/internal/pshints.h
+++ b/include/freetype/internal/pshints.h
@@ -6,7 +6,7 @@
 /*    recorders (specification only).  These are used to support native    */
 /*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,8 +18,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSHINTS_H__
-#define __PSHINTS_H__
+#ifndef PSHINTS_H_
+#define PSHINTS_H_
 
 
 #include <ft2build.h>
@@ -716,7 +716,7 @@
 
 FT_END_HEADER
 
-#endif /* __PSHINTS_H__ */
+#endif /* PSHINTS_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svbdf.h b/include/freetype/internal/services/svbdf.h
similarity index 95%
rename from include/internal/services/svbdf.h
rename to include/freetype/internal/services/svbdf.h
index 865b536..4a9ec20 100644
--- a/include/internal/services/svbdf.h
+++ b/include/freetype/internal/services/svbdf.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType BDF services (specification).                           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVBDF_H__
-#define __SVBDF_H__
+#ifndef SVBDF_H_
+#define SVBDF_H_
 
 #include FT_BDF_H
 #include FT_INTERNAL_SERVICE_H
@@ -76,7 +76,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVBDF_H__ */
+#endif /* SVBDF_H_ */
 
 
 /* END */
diff --git a/include/freetype/internal/services/svcfftl.h b/include/freetype/internal/services/svcfftl.h
new file mode 100644
index 0000000..db623e6
--- /dev/null
+++ b/include/freetype/internal/services/svcfftl.h
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svcfftl.h                                                              */
+/*                                                                         */
+/*    The FreeType CFF tables loader service (specification).              */
+/*                                                                         */
+/*  Copyright 2017-2018 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 SVCFFTL_H_
+#define SVCFFTL_H_
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_INTERNAL_CFF_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CFF_LOAD  "cff-load"
+
+
+  typedef FT_UShort
+  (*FT_Get_Standard_Encoding_Func)( FT_UInt  charcode );
+
+  typedef FT_Error
+  (*FT_Load_Private_Dict_Func)( CFF_Font     font,
+                                CFF_SubFont  subfont,
+                                FT_UInt      lenNDV,
+                                FT_Fixed*    NDV );
+
+  typedef FT_Byte
+  (*FT_FD_Select_Get_Func)( CFF_FDSelect  fdselect,
+                            FT_UInt       glyph_index );
+
+  typedef FT_Bool
+  (*FT_Blend_Check_Vector_Func)( CFF_Blend  blend,
+                                 FT_UInt    vsindex,
+                                 FT_UInt    lenNDV,
+                                 FT_Fixed*  NDV );
+
+  typedef FT_Error
+  (*FT_Blend_Build_Vector_Func)( CFF_Blend  blend,
+                                 FT_UInt    vsindex,
+                                 FT_UInt    lenNDV,
+                                 FT_Fixed*  NDV );
+
+
+  FT_DEFINE_SERVICE( CFFLoad )
+  {
+    FT_Get_Standard_Encoding_Func  get_standard_encoding;
+    FT_Load_Private_Dict_Func      load_private_dict;
+    FT_FD_Select_Get_Func          fd_select_get;
+    FT_Blend_Check_Vector_Func     blend_check_vector;
+    FT_Blend_Build_Vector_Func     blend_build_vector;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CFFLOADREC( class_,                  \
+                                      get_standard_encoding_,  \
+                                      load_private_dict_,      \
+                                      fd_select_get_,          \
+                                      blend_check_vector_,     \
+                                      blend_build_vector_ )    \
+  static const FT_Service_CFFLoadRec  class_ =                 \
+  {                                                            \
+    get_standard_encoding_,                                    \
+    load_private_dict_,                                        \
+    fd_select_get_,                                            \
+    blend_check_vector_,                                       \
+    blend_build_vector_                                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CFFLOADREC( class_,                  \
+                                      get_standard_encoding_,  \
+                                      load_private_dict_,      \
+                                      fd_select_get_,          \
+                                      blend_check_vector_,     \
+                                      blend_build_vector_ )    \
+  void                                                         \
+  FT_Init_Class_ ## class_( FT_Service_CFFLoadRec*  clazz )    \
+  {                                                            \
+    clazz->get_standard_encoding = get_standard_encoding_;     \
+    clazz->load_private_dict     = load_private_dict_;         \
+    clazz->fd_select_get         = fd_select_get_;             \
+    clazz->blend_check_vector    = blend_check_vector_;        \
+    clazz->blend_build_vector    = blend_build_vector_;        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+
+#endif
+
+
+/* END */
diff --git a/include/internal/services/svcid.h b/include/freetype/internal/services/svcid.h
similarity index 96%
rename from include/internal/services/svcid.h
rename to include/freetype/internal/services/svcid.h
index 4a535a6..cb59ac6 100644
--- a/include/internal/services/svcid.h
+++ b/include/freetype/internal/services/svcid.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType CID font services (specification).                      */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Derek Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVCID_H__
-#define __SVCID_H__
+#ifndef SVCID_H_
+#define SVCID_H_
 
 #include FT_INTERNAL_SERVICE_H
 
@@ -84,7 +84,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVCID_H__ */
+#endif /* SVCID_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svfntfmt.h b/include/freetype/internal/services/svfntfmt.h
similarity index 92%
rename from include/internal/services/svfntfmt.h
rename to include/freetype/internal/services/svfntfmt.h
index f8b3617..3b732be 100644
--- a/include/internal/services/svfntfmt.h
+++ b/include/freetype/internal/services/svfntfmt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType font format service (specification only).               */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVFNTFMT_H__
-#define __SVFNTFMT_H__
+#ifndef SVFNTFMT_H_
+#define SVFNTFMT_H_
 
 #include FT_INTERNAL_SERVICE_H
 
@@ -49,7 +49,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVFNTFMT_H__ */
+#endif /* SVFNTFMT_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svgldict.h b/include/freetype/internal/services/svgldict.h
similarity index 91%
rename from include/internal/services/svgldict.h
rename to include/freetype/internal/services/svgldict.h
index f78bca5..f1a68e3 100644
--- a/include/internal/services/svgldict.h
+++ b/include/freetype/internal/services/svgldict.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph dictionary services (specification).              */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVGLDICT_H__
-#define __SVGLDICT_H__
+#ifndef SVGLDICT_H_
+#define SVGLDICT_H_
 
 #include FT_INTERNAL_SERVICE_H
 
@@ -56,7 +56,7 @@
 
 #define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
                                         get_name_,                     \
-                                        name_index_)                   \
+                                        name_index_ )                  \
   static const FT_Service_GlyphDictRec  class_ =                       \
   {                                                                    \
     get_name_, name_index_                                             \
@@ -66,7 +66,7 @@
 
 #define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
                                         get_name_,                     \
-                                        name_index_)                   \
+                                        name_index_ )                  \
   void                                                                 \
   FT_Init_Class_ ## class_( FT_Library                library,         \
                             FT_Service_GlyphDictRec*  clazz )          \
@@ -85,4 +85,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVGLDICT_H__ */
+#endif /* SVGLDICT_H_ */
+
+
+/* END */
diff --git a/include/internal/services/svgxval.h b/include/freetype/internal/services/svgxval.h
similarity index 94%
rename from include/internal/services/svgxval.h
rename to include/freetype/internal/services/svgxval.h
index 59cc3b7..ed79ebe 100644
--- a/include/internal/services/svgxval.h
+++ b/include/freetype/internal/services/svgxval.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Red Hat K.K.,                                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVGXVAL_H__
-#define __SVGXVAL_H__
+#ifndef SVGXVAL_H_
+#define SVGXVAL_H_
 
 #include FT_GX_VALIDATE_H
 #include FT_INTERNAL_VALIDATE_H
@@ -66,7 +66,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVGXVAL_H__ */
+#endif /* SVGXVAL_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svkern.h b/include/freetype/internal/services/svkern.h
similarity index 92%
rename from include/internal/services/svkern.h
rename to include/freetype/internal/services/svkern.h
index bc26f15..c7e8f6e 100644
--- a/include/internal/services/svkern.h
+++ b/include/freetype/internal/services/svkern.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Kerning service (specification).                        */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVKERN_H__
-#define __SVKERN_H__
+#ifndef SVKERN_H_
+#define SVKERN_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_TRUETYPE_TABLES_H
@@ -45,7 +45,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVKERN_H__ */
+#endif /* SVKERN_H_ */
 
 
 /* END */
diff --git a/include/freetype/internal/services/svmetric.h b/include/freetype/internal/services/svmetric.h
new file mode 100644
index 0000000..abaacdd
--- /dev/null
+++ b/include/freetype/internal/services/svmetric.h
@@ -0,0 +1,153 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svmetric.h                                                             */
+/*                                                                         */
+/*    The FreeType services for metrics variations (specification).        */
+/*                                                                         */
+/*  Copyright 2016-2018 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 SVMETRIC_H_
+#define SVMETRIC_H_
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service to manage the `HVAR, `MVAR', and `VVAR' OpenType tables.
+   *
+   */
+
+#define FT_SERVICE_ID_METRICS_VARIATIONS  "metrics-variations"
+
+
+  /* HVAR */
+
+  typedef FT_Error
+  (*FT_HAdvance_Adjust_Func)( FT_Face  face,
+                              FT_UInt  gindex,
+                              FT_Int  *avalue );
+
+  typedef FT_Error
+  (*FT_LSB_Adjust_Func)( FT_Face  face,
+                         FT_UInt  gindex,
+                         FT_Int  *avalue );
+
+  typedef FT_Error
+  (*FT_RSB_Adjust_Func)( FT_Face  face,
+                         FT_UInt  gindex,
+                         FT_Int  *avalue );
+
+  /* VVAR */
+
+  typedef FT_Error
+  (*FT_VAdvance_Adjust_Func)( FT_Face  face,
+                              FT_UInt  gindex,
+                              FT_Int  *avalue );
+
+  typedef FT_Error
+  (*FT_TSB_Adjust_Func)( FT_Face  face,
+                         FT_UInt  gindex,
+                         FT_Int  *avalue );
+
+  typedef FT_Error
+  (*FT_BSB_Adjust_Func)( FT_Face  face,
+                         FT_UInt  gindex,
+                         FT_Int  *avalue );
+
+  typedef FT_Error
+  (*FT_VOrg_Adjust_Func)( FT_Face  face,
+                          FT_UInt  gindex,
+                          FT_Int  *avalue );
+
+  /* MVAR */
+
+  typedef void
+  (*FT_Metrics_Adjust_Func)( FT_Face  face );
+
+
+  FT_DEFINE_SERVICE( MetricsVariations )
+  {
+    FT_HAdvance_Adjust_Func  hadvance_adjust;
+    FT_LSB_Adjust_Func       lsb_adjust;
+    FT_RSB_Adjust_Func       rsb_adjust;
+
+    FT_VAdvance_Adjust_Func  vadvance_adjust;
+    FT_TSB_Adjust_Func       tsb_adjust;
+    FT_BSB_Adjust_Func       bsb_adjust;
+    FT_VOrg_Adjust_Func      vorg_adjust;
+
+    FT_Metrics_Adjust_Func   metrics_adjust;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_,            \
+                                                hadvance_adjust_,  \
+                                                lsb_adjust_,       \
+                                                rsb_adjust_,       \
+                                                vadvance_adjust_,  \
+                                                tsb_adjust_,       \
+                                                bsb_adjust_,       \
+                                                vorg_adjust_,      \
+                                                metrics_adjust_  ) \
+  static const FT_Service_MetricsVariationsRec  class_ =           \
+  {                                                                \
+    hadvance_adjust_,                                              \
+    lsb_adjust_,                                                   \
+    rsb_adjust_,                                                   \
+    vadvance_adjust_,                                              \
+    tsb_adjust_,                                                   \
+    bsb_adjust_,                                                   \
+    vorg_adjust_,                                                  \
+    metrics_adjust_                                                \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_,               \
+                                                hadvance_adjust_,     \
+                                                lsb_adjust_,          \
+                                                rsb_adjust_,          \
+                                                vadvance_adjust_,     \
+                                                tsb_adjust_,          \
+                                                bsb_adjust_,          \
+                                                vorg_adjust_,         \
+                                                metrics_adjust_  )    \
+  void                                                                \
+  FT_Init_Class_ ## class_( FT_Service_MetricsVariationsRec*  clazz ) \
+  {                                                                   \
+    clazz->hadvance_adjust = hadvance_adjust_;                        \
+    clazz->lsb_adjust      = lsb_adjust_;                             \
+    clazz->rsb_adjust      = rsb_adjust_;                             \
+    clazz->vadvance_adjust = vadvance_adjust_;                        \
+    clazz->tsb_adjust      = tsb_adjust_;                             \
+    clazz->bsb_adjust      = bsb_adjust_;                             \
+    clazz->vorg_adjust     = vorg_adjust_;                            \
+    clazz->metrics_adjust  = metrics_adjust_;                         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* SVMETRIC_H_ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svmm.h b/include/freetype/internal/services/svmm.h
new file mode 100644
index 0000000..bcbb38e
--- /dev/null
+++ b/include/freetype/internal/services/svmm.h
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svmm.h                                                                 */
+/*                                                                         */
+/*    The FreeType Multiple Masters and GX var services (specification).   */
+/*                                                                         */
+/*  Copyright 2003-2018 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 SVMM_H_
+#define SVMM_H_
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to manage multiple-masters data in a given face.
+   *
+   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+   *
+   */
+
+#define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
+
+
+  typedef FT_Error
+  (*FT_Get_MM_Func)( FT_Face           face,
+                     FT_Multi_Master*  master );
+
+  typedef FT_Error
+  (*FT_Get_MM_Var_Func)( FT_Face      face,
+                         FT_MM_Var*  *master );
+
+  typedef FT_Error
+  (*FT_Set_MM_Design_Func)( FT_Face   face,
+                            FT_UInt   num_coords,
+                            FT_Long*  coords );
+
+  /* use return value -1 to indicate that the new coordinates  */
+  /* are equal to the current ones; no changes are thus needed */
+  typedef FT_Error
+  (*FT_Set_Var_Design_Func)( FT_Face    face,
+                             FT_UInt    num_coords,
+                             FT_Fixed*  coords );
+
+  /* use return value -1 to indicate that the new coordinates  */
+  /* are equal to the current ones; no changes are thus needed */
+  typedef FT_Error
+  (*FT_Set_MM_Blend_Func)( FT_Face   face,
+                           FT_UInt   num_coords,
+                           FT_Long*  coords );
+
+  typedef FT_Error
+  (*FT_Get_Var_Design_Func)( FT_Face    face,
+                             FT_UInt    num_coords,
+                             FT_Fixed*  coords );
+
+  typedef FT_Error
+  (*FT_Set_Instance_Func)( FT_Face  face,
+                           FT_UInt  instance_index );
+
+  typedef FT_Error
+  (*FT_Get_MM_Blend_Func)( FT_Face   face,
+                           FT_UInt   num_coords,
+                           FT_Long*  coords );
+
+  typedef FT_Error
+  (*FT_Get_Var_Blend_Func)( FT_Face      face,
+                            FT_UInt     *num_coords,
+                            FT_Fixed*   *coords,
+                            FT_Fixed*   *normalizedcoords,
+                            FT_MM_Var*  *mm_var );
+
+  typedef void
+  (*FT_Done_Blend_Func)( FT_Face );
+
+
+  FT_DEFINE_SERVICE( MultiMasters )
+  {
+    FT_Get_MM_Func          get_mm;
+    FT_Set_MM_Design_Func   set_mm_design;
+    FT_Set_MM_Blend_Func    set_mm_blend;
+    FT_Get_MM_Blend_Func    get_mm_blend;
+    FT_Get_MM_Var_Func      get_mm_var;
+    FT_Set_Var_Design_Func  set_var_design;
+    FT_Get_Var_Design_Func  get_var_design;
+    FT_Set_Instance_Func    set_instance;
+
+    /* for internal use; only needed for code sharing between modules */
+    FT_Get_Var_Blend_Func   get_var_blend;
+    FT_Done_Blend_Func      done_blend;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,          \
+                                           get_mm_,         \
+                                           set_mm_design_,  \
+                                           set_mm_blend_,   \
+                                           get_mm_blend_,   \
+                                           get_mm_var_,     \
+                                           set_var_design_, \
+                                           get_var_design_, \
+                                           set_instance_,   \
+                                           get_var_blend_,  \
+                                           done_blend_ )    \
+  static const FT_Service_MultiMastersRec  class_ =         \
+  {                                                         \
+    get_mm_,                                                \
+    set_mm_design_,                                         \
+    set_mm_blend_,                                          \
+    get_mm_blend_,                                          \
+    get_mm_var_,                                            \
+    set_var_design_,                                        \
+    get_var_design_,                                        \
+    set_instance_,                                          \
+    get_var_blend_,                                         \
+    done_blend_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,               \
+                                           get_mm_,              \
+                                           set_mm_design_,       \
+                                           set_mm_blend_,        \
+                                           get_mm_blend_,        \
+                                           get_mm_var_,          \
+                                           set_var_design_,      \
+                                           get_var_design_,      \
+                                           set_instance_,        \
+                                           get_var_blend_,       \
+                                           done_blend_ )         \
+  void                                                           \
+  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz ) \
+  {                                                              \
+    clazz->get_mm         = get_mm_;                             \
+    clazz->set_mm_design  = set_mm_design_;                      \
+    clazz->set_mm_blend   = set_mm_blend_;                       \
+    clazz->get_mm_blend   = get_mm_blend_;                       \
+    clazz->get_mm_var     = get_mm_var_;                         \
+    clazz->set_var_design = set_var_design_;                     \
+    clazz->get_var_design = get_var_design_;                     \
+    clazz->set_instance   = set_instance_;                       \
+    clazz->get_var_blend  = get_var_blend_;                      \
+    clazz->done_blend     = done_blend_;                         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* SVMM_H_ */
+
+
+/* END */
diff --git a/include/internal/services/svotval.h b/include/freetype/internal/services/svotval.h
similarity index 92%
rename from include/internal/services/svotval.h
rename to include/freetype/internal/services/svotval.h
index a82a642..3129429 100644
--- a/include/internal/services/svotval.h
+++ b/include/freetype/internal/services/svotval.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType OpenType validation service (specification).            */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVOTVAL_H__
-#define __SVOTVAL_H__
+#ifndef SVOTVAL_H_
+#define SVOTVAL_H_
 
 #include FT_OPENTYPE_VALIDATE_H
 #include FT_INTERNAL_VALIDATE_H
@@ -49,7 +49,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVOTVAL_H__ */
+#endif /* SVOTVAL_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svpfr.h b/include/freetype/internal/services/svpfr.h
similarity index 94%
rename from include/internal/services/svpfr.h
rename to include/freetype/internal/services/svpfr.h
index d4eb169..e65d57e 100644
--- a/include/internal/services/svpfr.h
+++ b/include/freetype/internal/services/svpfr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Internal PFR service functions (specification).                      */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVPFR_H__
-#define __SVPFR_H__
+#ifndef SVPFR_H_
+#define SVPFR_H_
 
 #include FT_PFR_H
 #include FT_INTERNAL_SERVICE_H
@@ -60,7 +60,7 @@
 
 FT_END_HEADER
 
-#endif /* __SVPFR_H__ */
+#endif /* SVPFR_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svpostnm.h b/include/freetype/internal/services/svpostnm.h
similarity index 95%
rename from include/internal/services/svpostnm.h
rename to include/freetype/internal/services/svpostnm.h
index a89f79e..4a49d8b 100644
--- a/include/internal/services/svpostnm.h
+++ b/include/freetype/internal/services/svpostnm.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript name services (specification).               */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVPOSTNM_H__
-#define __SVPOSTNM_H__
+#ifndef SVPOSTNM_H_
+#define SVPOSTNM_H_
 
 #include FT_INTERNAL_SERVICE_H
 
@@ -75,7 +75,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVPOSTNM_H__ */
+#endif /* SVPOSTNM_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svprop.h b/include/freetype/internal/services/svprop.h
similarity index 92%
rename from include/internal/services/svprop.h
rename to include/freetype/internal/services/svprop.h
index c9f07ce..adc0bcf 100644
--- a/include/internal/services/svprop.h
+++ b/include/freetype/internal/services/svprop.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType property service (specification).                       */
 /*                                                                         */
-/*  Copyright 2012-2015 by                                                 */
+/*  Copyright 2012-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVPROP_H__
-#define __SVPROP_H__
+#ifndef SVPROP_H_
+#define SVPROP_H_
 
 
 FT_BEGIN_HEADER
@@ -29,7 +29,8 @@
   typedef FT_Error
   (*FT_Properties_SetFunc)( FT_Module    module,
                             const char*  property_name,
-                            const void*  value );
+                            const void*  value,
+                            FT_Bool      value_is_string );
 
   typedef FT_Error
   (*FT_Properties_GetFunc)( FT_Module    module,
@@ -75,7 +76,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVPROP_H__ */
+#endif /* SVPROP_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svpscmap.h b/include/freetype/internal/services/svpscmap.h
similarity index 97%
rename from include/internal/services/svpscmap.h
rename to include/freetype/internal/services/svpscmap.h
index 66da6e1..5589575 100644
--- a/include/internal/services/svpscmap.h
+++ b/include/freetype/internal/services/svpscmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript charmap service (specification).             */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVPSCMAP_H__
-#define __SVPSCMAP_H__
+#ifndef SVPSCMAP_H_
+#define SVPSCMAP_H_
 
 #include FT_INTERNAL_OBJECTS_H
 
@@ -171,7 +171,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVPSCMAP_H__ */
+#endif /* SVPSCMAP_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svpsinfo.h b/include/freetype/internal/services/svpsinfo.h
similarity index 96%
rename from include/internal/services/svpsinfo.h
rename to include/freetype/internal/services/svpsinfo.h
index 752a266..408f406 100644
--- a/include/internal/services/svpsinfo.h
+++ b/include/freetype/internal/services/svpsinfo.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript info service (specification).                */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVPSINFO_H__
-#define __SVPSINFO_H__
+#ifndef SVPSINFO_H_
+#define SVPSINFO_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_INTERNAL_TYPE1_TYPES_H
@@ -105,7 +105,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVPSINFO_H__ */
+#endif /* SVPSINFO_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svsfnt.h b/include/freetype/internal/services/svsfnt.h
similarity index 95%
rename from include/internal/services/svsfnt.h
rename to include/freetype/internal/services/svsfnt.h
index 252ae1c..e8b37bc 100644
--- a/include/internal/services/svsfnt.h
+++ b/include/freetype/internal/services/svsfnt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType SFNT table loading service (specification).             */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVSFNT_H__
-#define __SVSFNT_H__
+#ifndef SVSFNT_H_
+#define SVSFNT_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_TRUETYPE_TABLES_H
@@ -97,7 +97,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVSFNT_H__ */
+#endif /* SVSFNT_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svttcmap.h b/include/freetype/internal/services/svttcmap.h
similarity index 92%
rename from include/internal/services/svttcmap.h
rename to include/freetype/internal/services/svttcmap.h
index 4351a9a..cd0e6fd 100644
--- a/include/internal/services/svttcmap.h
+++ b/include/freetype/internal/services/svttcmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType/sfnt cmap extra information service.           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K.,                                          */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -19,8 +19,8 @@
 /* Development of this service is support of
    Information-technology Promotion Agency, Japan. */
 
-#ifndef __SVTTCMAP_H__
-#define __SVTTCMAP_H__
+#ifndef SVTTCMAP_H_
+#define SVTTCMAP_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_TRUETYPE_TABLES_H
@@ -48,11 +48,12 @@
   /*      `ttnameid.h'.                                                    */
   /*                                                                       */
   /*    format ::                                                          */
-  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */
+  /*      The cmap format.  OpenType 1.6 defines the formats 0 (byte       */
   /*      encoding table), 2~(high-byte mapping through table), 4~(segment */
   /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */
   /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */
-  /*      coverage), and 14 (Unicode Variation Sequences).                 */
+  /*      coverage), 13~(last resort font), and 14 (Unicode Variation      */
+  /*      Sequences).                                                      */
   /*                                                                       */
   typedef struct  TT_CMapInfo_
   {
@@ -99,7 +100,7 @@
 
 FT_END_HEADER
 
-#endif /* __SVTTCMAP_H__ */
+#endif /* SVTTCMAP_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svtteng.h b/include/freetype/internal/services/svtteng.h
similarity index 91%
rename from include/internal/services/svtteng.h
rename to include/freetype/internal/services/svtteng.h
index 272ee8c..92e3c54 100644
--- a/include/internal/services/svtteng.h
+++ b/include/freetype/internal/services/svtteng.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType engine query service (specification).          */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVTTENG_H__
-#define __SVTTENG_H__
+#ifndef SVTTENG_H_
+#define SVTTENG_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_MODULE_H
@@ -47,7 +47,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVTTENG_H__ */
+#endif /* SVTTENG_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svttglyf.h b/include/freetype/internal/services/svttglyf.h
similarity index 94%
rename from include/internal/services/svttglyf.h
rename to include/freetype/internal/services/svttglyf.h
index f5cb76a..16fac1c 100644
--- a/include/internal/services/svttglyf.h
+++ b/include/freetype/internal/services/svttglyf.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType glyph service.                                 */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,8 +15,8 @@
 /*                                                                         */
 /***************************************************************************/
 
-#ifndef __SVTTGLYF_H__
-#define __SVTTGLYF_H__
+#ifndef SVTTGLYF_H_
+#define SVTTGLYF_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_TRUETYPE_TABLES_H
@@ -63,7 +63,7 @@
 
 FT_END_HEADER
 
-#endif /* __SVTTGLYF_H__ */
+#endif /* SVTTGLYF_H_ */
 
 
 /* END */
diff --git a/include/internal/services/svwinfnt.h b/include/freetype/internal/services/svwinfnt.h
similarity index 91%
rename from include/internal/services/svwinfnt.h
rename to include/freetype/internal/services/svwinfnt.h
index 0036929..80d481c 100644
--- a/include/internal/services/svwinfnt.h
+++ b/include/freetype/internal/services/svwinfnt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Windows FNT/FONT service (specification).               */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SVWINFNT_H__
-#define __SVWINFNT_H__
+#ifndef SVWINFNT_H_
+#define SVWINFNT_H_
 
 #include FT_INTERNAL_SERVICE_H
 #include FT_WINFONTS_H
@@ -44,7 +44,7 @@
 FT_END_HEADER
 
 
-#endif /* __SVWINFNT_H__ */
+#endif /* SVWINFNT_H_ */
 
 
 /* END */
diff --git a/include/internal/sfnt.h b/include/freetype/internal/sfnt.h
similarity index 88%
rename from include/internal/sfnt.h
rename to include/freetype/internal/sfnt.h
index 97ce390..fb1e327 100644
--- a/include/internal/sfnt.h
+++ b/include/freetype/internal/sfnt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level `sfnt' driver interface (specification).                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SFNT_H__
-#define __SFNT_H__
+#ifndef SFNT_H_
+#define SFNT_H_
 
 
 #include <ft2build.h>
@@ -44,7 +44,9 @@
   /*    face       :: A handle to the target face object.                  */
   /*                                                                       */
   /*    face_index :: The index of the TrueType font, if we are opening a  */
-  /*                  collection.                                          */
+  /*                  collection, in bits 0-15.  The numbered instance     */
+  /*                  index~+~1 of a GX (sub)font, if applicable, in bits  */
+  /*                  16-30.                                               */
   /*                                                                       */
   /*    num_params :: The number of additional parameters.                 */
   /*                                                                       */
@@ -87,7 +89,9 @@
   /*    face       :: A handle to the target face object.                  */
   /*                                                                       */
   /*    face_index :: The index of the TrueType font, if we are opening a  */
-  /*                  collection.                                          */
+  /*                  collection, in bits 0-15.  The numbered instance     */
+  /*                  index~+~1 of a GX (sub)font, if applicable, in bits  */
+  /*                  16-30.                                               */
   /*                                                                       */
   /*    num_params :: The number of additional parameters.                 */
   /*                                                                       */
@@ -427,6 +431,64 @@
   /*************************************************************************/
   /*                                                                       */
   /* <FuncType>                                                            */
+  /*    TT_Get_Name_Func                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    From the `name' table, return a given ENGLISH name record in       */
+  /*    ASCII.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /*    nameid   :: The name id of the name record to return.              */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    name     :: The address of an allocated string pointer.  NULL if   */
+  /*                no name is present.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_Name_Func)( TT_Face      face,
+                       FT_UShort    nameid,
+                       FT_String**  name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_Name_ID_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Search whether an ENGLISH version for a given name ID is in the    */
+  /*    `name' table.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /*    nameid   :: The name id of the name record to return.              */
+  /*                                                                       */
+  /* <Out>                                                                 */
+  /*    win      :: If non-negative, an index into the `name' table with   */
+  /*                the corresponding (3,1) or (3,0) Windows entry.        */
+  /*                                                                       */
+  /*    apple    :: If non-negative, an index into the `name' table with   */
+  /*                the corresponding (1,0) Apple entry.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1 if there is either a win or apple entry (or both), 0 otheriwse.  */
+  /*                                                                       */
+  typedef FT_Bool
+  (*TT_Get_Name_ID_Func)( TT_Face    face,
+                          FT_UShort  nameid,
+                          FT_Int    *win,
+                          FT_Int    *apple );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
   /*    TT_Load_Table_Func                                                 */
   /*                                                                       */
   /* <Description>                                                         */
@@ -556,6 +618,9 @@
 
     TT_Get_Metrics_Func          get_metrics;
 
+    TT_Get_Name_Func             get_name;
+    TT_Get_Name_ID_Func          get_name_id;
+
   } SFNT_Interface;
 
 
@@ -594,7 +659,9 @@
           free_eblc_,                    \
           set_sbit_strike_,              \
           load_strike_metrics_,          \
-          get_metrics_ )                 \
+          get_metrics_,                  \
+          get_name_,                     \
+          get_name_id_ )                 \
   static const SFNT_Interface  class_ =  \
   {                                      \
     goto_table_,                         \
@@ -626,6 +693,8 @@
     set_sbit_strike_,                    \
     load_strike_metrics_,                \
     get_metrics_,                        \
+    get_name_,                           \
+    get_name_id_                         \
   };
 
 #else /* FT_CONFIG_OPTION_PIC */
@@ -663,7 +732,9 @@
           free_eblc_,                                   \
           set_sbit_strike_,                             \
           load_strike_metrics_,                         \
-          get_metrics_ )                                \
+          get_metrics_,                                 \
+          get_name_,                                    \
+          get_name_id_ )                                \
   void                                                  \
   FT_Init_Class_ ## class_( FT_Library       library,   \
                             SFNT_Interface*  clazz )    \
@@ -699,13 +770,15 @@
     clazz->set_sbit_strike     = set_sbit_strike_;      \
     clazz->load_strike_metrics = load_strike_metrics_;  \
     clazz->get_metrics         = get_metrics_;          \
+    clazz->get_name            = get_name_;             \
+    clazz->get_name_id         = get_name_id_;          \
   }
 
 #endif /* FT_CONFIG_OPTION_PIC */
 
 FT_END_HEADER
 
-#endif /* __SFNT_H__ */
+#endif /* SFNT_H_ */
 
 
 /* END */
diff --git a/include/internal/t1types.h b/include/freetype/internal/t1types.h
similarity index 97%
rename from include/internal/t1types.h
rename to include/freetype/internal/t1types.h
index 029acc4..2118e33 100644
--- a/include/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -5,7 +5,7 @@
 /*    Basic Type1/Type2 type definitions and interface (specification      */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,14 +17,15 @@
 /***************************************************************************/
 
 
-#ifndef __T1TYPES_H__
-#define __T1TYPES_H__
+#ifndef T1TYPES_H_
+#define T1TYPES_H_
 
 
 #include <ft2build.h>
 #include FT_TYPE1_TABLES_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
 #include FT_INTERNAL_SERVICE_H
+#include FT_INTERNAL_HASH_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 
 
@@ -107,6 +108,7 @@
     FT_Int           num_subrs;
     FT_Byte**        subrs;
     FT_UInt*         subrs_len;
+    FT_Hash          subrs_hash;
 
     FT_Int           num_glyphs;
     FT_String**      glyph_names;       /* array of glyph names       */
@@ -249,7 +251,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1TYPES_H__ */
+#endif /* T1TYPES_H_ */
 
 
 /* END */
diff --git a/include/internal/tttypes.h b/include/freetype/internal/tttypes.h
similarity index 86%
rename from include/internal/tttypes.h
rename to include/freetype/internal/tttypes.h
index 31dd0aa..10dd336 100644
--- a/include/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -5,7 +5,7 @@
 /*    Basic SFNT/TrueType type definitions and interface (specification    */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTTYPES_H__
-#define __TTTYPES_H__
+#ifndef TTTYPES_H_
+#define TTTYPES_H_
 
 
 #include <ft2build.h>
@@ -148,7 +148,7 @@
   /* <Fields>                                                              */
   /*    See                                                                */
   /*                                                                       */
-  /*      http://www.w3.org/TR/WOFF/#WOFFHeader                            */
+  /*      https://www.w3.org/TR/WOFF/#WOFFHeader                           */
   /*                                                                       */
   typedef struct  WOFF_HeaderRec_
   {
@@ -185,7 +185,7 @@
   /*                                                                       */
   /*    CompLength :: Compressed table length (in bytes).                  */
   /*                                                                       */
-  /*    OrigLength :: Unompressed table length (in bytes).                 */
+  /*    OrigLength :: Uncompressed table length (in bytes).                */
   /*                                                                       */
   /*    CheckSum   :: The table checksum.  This value can be ignored.      */
   /*                                                                       */
@@ -243,7 +243,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
-  /*    TT_NameEntryRec                                                    */
+  /*    TT_NameRec                                                         */
   /*                                                                       */
   /* <Description>                                                         */
   /*    A structure modeling TrueType name records.  Name records are used */
@@ -267,7 +267,7 @@
   /*    string       :: A pointer to the string's bytes.  Note that these  */
   /*                    are usually UTF-16 encoded characters.             */
   /*                                                                       */
-  typedef struct  TT_NameEntryRec_
+  typedef struct  TT_NameRec_
   {
     FT_UShort  platformID;
     FT_UShort  encodingID;
@@ -279,9 +279,39 @@
     /* this last field is not defined in the spec */
     /* but used by the FreeType engine            */
 
-    FT_Byte*   string;
+    FT_Byte*  string;
 
-  } TT_NameEntryRec, *TT_NameEntry;
+  } TT_NameRec, *TT_Name;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_LangTagRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling language tag records in SFNT `name' tables,   */
+  /*    introduced in OpenType version 1.6.                                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    stringLength :: The length of the string in bytes.                 */
+  /*                                                                       */
+  /*    stringOffset :: The offset to the string in the `name' table.      */
+  /*                                                                       */
+  /*    string       :: A pointer to the string's bytes.  Note that these  */
+  /*                    are UTF-16BE encoded characters.                   */
+  /*                                                                       */
+  typedef struct TT_LangTagRec_
+  {
+    FT_UShort  stringLength;
+    FT_ULong   stringOffset;
+
+    /* this last field is not defined in the spec */
+    /* but used by the FreeType engine            */
+
+    FT_Byte*  string;
+
+  } TT_LangTagRec, *TT_LangTag;
 
 
   /*************************************************************************/
@@ -293,24 +323,30 @@
   /*    A structure modeling the TrueType name table.                      */
   /*                                                                       */
   /* <Fields>                                                              */
-  /*    format         :: The format of the name table.                    */
+  /*    format            :: The format of the name table.                 */
   /*                                                                       */
-  /*    numNameRecords :: The number of names in table.                    */
+  /*    numNameRecords    :: The number of names in table.                 */
   /*                                                                       */
-  /*    storageOffset  :: The offset of the name table in the `name'       */
-  /*                      TrueType table.                                  */
+  /*    storageOffset     :: The offset of the name table in the `name'    */
+  /*                         TrueType table.                               */
   /*                                                                       */
-  /*    names          :: An array of name records.                        */
+  /*    names             :: An array of name records.                     */
   /*                                                                       */
-  /*    stream         :: the file's input stream.                         */
+  /*    numLangTagRecords :: The number of language tags in table.         */
+  /*                                                                       */
+  /*    langTags          :: An array of language tag records.             */
+  /*                                                                       */
+  /*    stream            :: The file's input stream.                      */
   /*                                                                       */
   typedef struct  TT_NameTableRec_
   {
-    FT_UShort         format;
-    FT_UInt           numNameRecords;
-    FT_UInt           storageOffset;
-    TT_NameEntryRec*  names;
-    FT_Stream         stream;
+    FT_UShort       format;
+    FT_UInt         numNameRecords;
+    FT_UInt         storageOffset;
+    TT_NameRec*     names;
+    FT_UInt         numLangTagRecords;
+    TT_LangTagRec*  langTags;
+    FT_Stream       stream;
 
   } TT_NameTableRec, *TT_NameTable;
 
@@ -1060,6 +1096,34 @@
   } TT_SbitTableType;
 
 
+  /* OpenType 1.8 brings new tables for variation font support;  */
+  /* to make the old MM and GX fonts still work we need to check */
+  /* the presence (and validity) of the functionality provided   */
+  /* by those tables.  The following flag macros are for the     */
+  /* field `variation_support'.                                  */
+  /*                                                             */
+  /* Note that `fvar' gets checked immediately at font loading,  */
+  /* while the other features are only loaded if MM support is   */
+  /* actually requested.                                         */
+
+  /* FVAR */
+#define TT_FACE_FLAG_VAR_FVAR  ( 1 << 0 )
+
+  /* HVAR */
+#define TT_FACE_FLAG_VAR_HADVANCE  ( 1 << 1 )
+#define TT_FACE_FLAG_VAR_LSB       ( 1 << 2 )
+#define TT_FACE_FLAG_VAR_RSB       ( 1 << 3 )
+
+  /* VVAR */
+#define TT_FACE_FLAG_VAR_VADVANCE  ( 1 << 4 )
+#define TT_FACE_FLAG_VAR_TSB       ( 1 << 5 )
+#define TT_FACE_FLAG_VAR_BSB       ( 1 << 6 )
+#define TT_FACE_FLAG_VAR_VORG      ( 1 << 7 )
+
+  /* MVAR */
+#define TT_FACE_FLAG_VAR_MVAR  ( 1 << 8 )
+
+
   /*************************************************************************/
   /*                                                                       */
   /*                         TrueType Face Type                            */
@@ -1161,6 +1225,11 @@
   /*                                                                       */
   /*    psnames              :: A pointer to the PostScript names service. */
   /*                                                                       */
+  /*    mm                   :: A pointer to the Multiple Masters service. */
+  /*                                                                       */
+  /*    var                  :: A pointer to the Metrics Variations        */
+  /*                            service.                                   */
+  /*                                                                       */
   /*    hdmx                 :: The face's horizontal device metrics       */
   /*                            (`hdmx' table).  This table is optional in */
   /*                            TrueType/OpenType fonts.                   */
@@ -1182,18 +1251,6 @@
   /*                            file  `ttconfig.h' for comments on the     */
   /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */
   /*                                                                       */
-  /*    num_locations        :: The number of glyph locations in this      */
-  /*                            TrueType file.  This should be             */
-  /*                            identical to the number of glyphs.         */
-  /*                            Ignored for Type 2 fonts.                  */
-  /*                                                                       */
-  /*    glyph_locations      :: An array of longs.  These are offsets to   */
-  /*                            glyph data within the `glyf' table.        */
-  /*                            Ignored for Type 2 font faces.             */
-  /*                                                                       */
-  /*    glyf_len             :: The length of the `glyf' table.  Needed    */
-  /*                            for malformed `loca' tables.               */
-  /*                                                                       */
   /*    font_program_size    :: Size in bytecodes of the face's font       */
   /*                            program.  0 if none defined.  Ignored for  */
   /*                            Type 2 fonts.                              */
@@ -1219,22 +1276,21 @@
   /*                            units.  Comes from the `cvt ' table.       */
   /*                            Ignored for Type 2 fonts.                  */
   /*                                                                       */
-  /*    num_kern_pairs       :: The number of kerning pairs present in the */
-  /*                            font file.  The engine only loads the      */
-  /*                            first horizontal format 0 kern table it    */
-  /*                            finds in the font file.  Ignored for       */
-  /*                            Type 2 fonts.                              */
-  /*                                                                       */
-  /*    kern_table_index     :: The index of the kerning table in the font */
-  /*                            kerning directory.  Ignored for Type 2     */
-  /*                            fonts.                                     */
-  /*                                                                       */
   /*    interpreter          :: A pointer to the TrueType bytecode         */
   /*                            interpreters field is also used to hook    */
   /*                            the debugger in `ttdebug'.                 */
   /*                                                                       */
-  /*    unpatented_hinting   :: If true, use only unpatented methods in    */
-  /*                            the bytecode interpreter.                  */
+  /*    extra                :: Reserved for third-party font drivers.     */
+  /*                                                                       */
+  /*    postscript_name      :: The PS name of the font.  Used by the      */
+  /*                            postscript name service.                   */
+  /*                                                                       */
+  /*    glyf_len             :: The length of the `glyf' table.  Needed    */
+  /*                            for malformed `loca' tables.               */
+  /*                                                                       */
+  /*    glyf_offset          :: The file offset of the `glyf' table.       */
+  /*                                                                       */
+  /*    is_cff2              :: Set if the font format is CFF2.            */
   /*                                                                       */
   /*    doblend              :: A boolean which is set if the font should  */
   /*                            be blended (this is for GX var).           */
@@ -1243,10 +1299,94 @@
   /*                            variation tables (rather like Multiple     */
   /*                            Master data).                              */
   /*                                                                       */
-  /*    extra                :: Reserved for third-party font drivers.     */
+  /*    variation_support    :: Flags that indicate which OpenType         */
+  /*                            functionality related to font variation    */
+  /*                            support is present, valid, and usable.     */
+  /*                            For example, TT_FACE_FLAG_VAR_FVAR is only */
+  /*                            set if we have at least one design axis.   */
   /*                                                                       */
-  /*    postscript_name      :: The PS name of the font.  Used by the      */
-  /*                            postscript name service.                   */
+  /*    var_postscript_prefix ::                                           */
+  /*                            The PostScript name prefix needed for      */
+  /*                            constructing a variation font instance's   */
+  /*                            PS name .                                  */
+  /*                                                                       */
+  /*    var_postscript_prefix_len ::                                       */
+  /*                            The length of the `var_postscript_prefix'  */
+  /*                            string.                                    */
+  /*                                                                       */
+  /*    horz_metrics_size    :: The size of the `hmtx' table.              */
+  /*                                                                       */
+  /*    vert_metrics_size    :: The size of the `vmtx' table.              */
+  /*                                                                       */
+  /*    num_locations        :: The number of glyph locations in this      */
+  /*                            TrueType file.  This should be             */
+  /*                            identical to the number of glyphs.         */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    glyph_locations      :: An array of longs.  These are offsets to   */
+  /*                            glyph data within the `glyf' table.        */
+  /*                            Ignored for Type 2 font faces.             */
+  /*                                                                       */
+  /*    hdmx_table           :: A pointer to the `hdmx' table.             */
+  /*                                                                       */
+  /*    hdmx_table_size      :: The size of the `hdmx' table.              */
+  /*                                                                       */
+  /*    hdmx_record_count    :: The number of hdmx records.                */
+  /*                                                                       */
+  /*    hdmx_record_size     :: The size of a single hdmx record.          */
+  /*                                                                       */
+  /*    hdmx_record_sizes    :: An array holding the ppem sizes available  */
+  /*                            in the `hdmx' table.                       */
+  /*                                                                       */
+  /*    sbit_table           :: A pointer to the font's embedded bitmap    */
+  /*                            location table.                            */
+  /*                                                                       */
+  /*    sbit_table_size      :: The size of `sbit_table'.                  */
+  /*                                                                       */
+  /*    sbit_table_type      :: The sbit table type (CBLC, sbix, etc.).    */
+  /*                                                                       */
+  /*    sbit_num_strikes     :: The number of sbit strikes exposed by      */
+  /*                            FreeType's API, omitting invalid strikes.  */
+  /*                                                                       */
+  /*    sbit_strike_map      :: A mapping between the strike indices       */
+  /*                            exposed by the API and the indices used in */
+  /*                            the font's sbit table.                     */
+  /*                                                                       */
+  /*    kern_table           :: A pointer to the `kern' table.             */
+  /*                                                                       */
+  /*    kern_table_size      :: The size of the `kern' table.              */
+  /*                                                                       */
+  /*    num_kern_tables      :: The number of supported kern subtables     */
+  /*                            (up to 32; FreeType recognizes only        */
+  /*                            horizontal ones with format 0).            */
+  /*                                                                       */
+  /*    kern_avail_bits      :: The availability status of kern subtables; */
+  /*                            if bit n is set, table n is available.     */
+  /*                                                                       */
+  /*    kern_order_bits      :: The sortedness status of kern subtables;   */
+  /*                            if bit n is set, table n is sorted.        */
+  /*                                                                       */
+  /*    bdf                  :: Data related to an SFNT font's `bdf'       */
+  /*                            table; see `tttypes.h'.                    */
+  /*                                                                       */
+  /*    horz_metrics_offset  :: The file offset of the `hmtx' table.       */
+  /*                                                                       */
+  /*    vert_metrics_offset  :: The file offset of the `vmtx' table.       */
+  /*                                                                       */
+  /*    sph_found_func_flags :: Flags identifying special bytecode         */
+  /*                            functions (used by the v38 implementation  */
+  /*                            of the bytecode interpreter).              */
+  /*                                                                       */
+  /*    sph_compatibility_mode ::                                          */
+  /*                            This flag is set if we are in ClearType    */
+  /*                            backward compatibility mode (used by the   */
+  /*                            v38 implementation of the bytecode         */
+  /*                            interpreter).                              */
+  /*                                                                       */
+  /*    ebdt_start           :: The file offset of the sbit data table     */
+  /*                            (CBDT, bdat, etc.).                        */
+  /*                                                                       */
+  /*    ebdt_size            :: The size of the sbit data table.           */
   /*                                                                       */
   typedef struct  TT_FaceRec_
   {
@@ -1291,6 +1431,19 @@
     /* handle glyph names <-> unicode & Mac values                   */
     void*                 psnames;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    /* a typeless pointer to the FT_Service_MultiMasters table used to */
+    /* handle variation fonts                                          */
+    void*                 mm;
+
+    /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
+    /* used to handle the HVAR, VVAR, and MVAR OpenType tables         */
+    void*                 var;
+#endif
+
+    /* a typeless pointer to the PostScript Aux service */
+    void*                 psaux;
+
 
     /***********************************************************************/
     /*                                                                     */
@@ -1314,7 +1467,7 @@
 
     /***********************************************************************/
     /*                                                                     */
-    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */
+    /* TrueType-specific fields (ignored by the CFF driver)                */
     /*                                                                     */
     /***********************************************************************/
 
@@ -1334,10 +1487,6 @@
     /* used to hook the debugger for the `ttdebug' utility.        */
     TT_Interpreter        interpreter;
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    /* Use unpatented hinting only. */
-    FT_Bool               unpatented_hinting;
-#endif
 
     /***********************************************************************/
     /*                                                                     */
@@ -1351,18 +1500,24 @@
     const char*           postscript_name;
 
     FT_ULong              glyf_len;
+    FT_ULong              glyf_offset;    /* since 2.7.1 */
+
+    FT_Bool               is_cff2;        /* since 2.7.1 */
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
     FT_Bool               doblend;
     GX_Blend              blend;
+
+    FT_UInt32             variation_support;     /* since 2.7.1 */
+
+    const char*           var_postscript_prefix;     /* since 2.7.2 */
+    FT_UInt               var_postscript_prefix_len; /* since 2.7.2 */
+
 #endif
 
     /* since version 2.2 */
 
-    FT_Byte*              horz_metrics;
     FT_ULong              horz_metrics_size;
-
-    FT_Byte*              vert_metrics;
     FT_ULong              vert_metrics_size;
 
     FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
@@ -1378,6 +1533,7 @@
     FT_ULong              sbit_table_size;
     TT_SbitTableType      sbit_table_type;
     FT_UInt               sbit_num_strikes;
+    FT_UInt*              sbit_strike_map;
 
     FT_Byte*              kern_table;
     FT_ULong              kern_table_size;
@@ -1393,12 +1549,18 @@
     FT_ULong              horz_metrics_offset;
     FT_ULong              vert_metrics_offset;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /* since 2.4.12 */
     FT_ULong              sph_found_func_flags; /* special functions found */
                                                 /* for this face           */
     FT_Bool               sph_compatibility_mode;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+    /* since 2.7 */
+    FT_ULong              ebdt_start;  /* either `CBDT', `EBDT', or `bdat' */
+    FT_ULong              ebdt_size;
+#endif
 
   } TT_FaceRec;
 
@@ -1457,11 +1619,23 @@
   /* handle to execution context */
   typedef struct TT_ExecContextRec_*  TT_ExecContext;
 
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Size                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType size object.                                */
+  /*                                                                       */
+  typedef struct TT_SizeRec_*  TT_Size;
+
+
   /* glyph loader structure */
   typedef struct  TT_LoaderRec_
   {
-    FT_Face          face;
-    FT_Size          size;
+    TT_Face          face;
+    TT_Size          size;
     FT_GlyphSlot     glyph;
     FT_GlyphLoader   gloader;
 
@@ -1480,8 +1654,6 @@
     FT_Vector        pp1;
     FT_Vector        pp2;
 
-    FT_ULong         glyf_offset;
-
     /* the zone where we load our glyphs */
     TT_GlyphZoneRec  base;
     TT_GlyphZoneRec  zone;
@@ -1503,12 +1675,15 @@
     FT_Byte*         cursor;
     FT_Byte*         limit;
 
+    /* since version 2.6.2 */
+    FT_ListRec       composites;
+
   } TT_LoaderRec;
 
 
 FT_END_HEADER
 
-#endif /* __TTTYPES_H__ */
+#endif /* TTTYPES_H_ */
 
 
 /* END */
diff --git a/include/t1tables.h b/include/freetype/t1tables.h
similarity index 97%
rename from include/t1tables.h
rename to include/freetype/t1tables.h
index a6ea415..3503c26 100644
--- a/include/t1tables.h
+++ b/include/freetype/t1tables.h
@@ -5,7 +5,7 @@
 /*    Basic Type 1/Type 2 tables definitions and interface (specification  */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1TABLES_H__
-#define __T1TABLES_H__
+#ifndef T1TABLES_H_
+#define T1TABLES_H_
 
 
 #include <ft2build.h>
@@ -291,7 +291,7 @@
 
   } PS_DesignMapRec, *PS_DesignMap;
 
-  /* backwards-compatible definition */
+  /* backward compatible definition */
   typedef PS_DesignMapRec  T1_DesignMap;
 
 
@@ -326,7 +326,7 @@
   } PS_BlendRec, *PS_Blend;
 
 
-  /* backwards-compatible definition */
+  /* backward compatible definition */
   typedef PS_BlendRec  T1_Blend;
 
 
@@ -554,6 +554,9 @@
   /*    T1_ENCODING_TYPE_ISOLATIN1 ::                                      */
   /*    T1_ENCODING_TYPE_EXPERT ::                                         */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.8                                                              */
+  /*                                                                       */
   typedef enum  T1_EncodingType_
   {
     T1_ENCODING_TYPE_NONE = 0,
@@ -622,6 +625,9 @@
   /*    PS_DICT_FS_TYPE ::                                                 */
   /*    PS_DICT_ITALIC_ANGLE ::                                            */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.8                                                              */
+  /*                                                                       */
   typedef enum  PS_Dict_Keys_
   {
     /* conventionally in the font dictionary */
@@ -743,6 +749,9 @@
    *    If the font's format is not PostScript-based, this function returns
    *    the `FT_Err_Invalid_Argument' error code.
    *
+   * @since:
+   *    2.4.8
+   *
    */
   FT_EXPORT( FT_Long )
   FT_Get_PS_Font_Value( FT_Face       face,
@@ -755,7 +764,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1TABLES_H__ */
+#endif /* T1TABLES_H_ */
 
 
 /* END */
diff --git a/include/ttnameid.h b/include/freetype/ttnameid.h
similarity index 79%
rename from include/ttnameid.h
rename to include/freetype/ttnameid.h
index c9585f2..8605183 100644
--- a/include/ttnameid.h
+++ b/include/freetype/ttnameid.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType name ID definitions (specification only).                   */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTNAMEID_H__
-#define __TTNAMEID_H__
+#ifndef TTNAMEID_H_
+#define TTNAMEID_H_
 
 
 #include <ft2build.h>
@@ -36,7 +36,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* Possible values for the `platform' identifier code in the name        */
-  /* records of the TTF `name' table.                                      */
+  /* records of an SFNT `name' table.                                      */
   /*                                                                       */
   /*************************************************************************/
 
@@ -119,14 +119,19 @@
    *   TT_APPLE_ID_VARIANT_SELECTOR ::
    *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations
    *     on a real cmap.
+   *
+   *   TT_APPLE_ID_FULL_UNICODE ::
+   *     Used for fallback fonts that provide complete Unicode coverage with
+   *     a type~13 cmap.
    */
 
-#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */
-#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */
-#define TT_APPLE_ID_ISO_10646         2 /* deprecated */
-#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */
+#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0                   */
+#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx      */
+#define TT_APPLE_ID_ISO_10646         2 /* deprecated                    */
+#define TT_APPLE_ID_UNICODE_2_0       3 /* or later                      */
 #define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */
-#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
+#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data       */
+#define TT_APPLE_ID_FULL_UNICODE      6 /* used with type 13 cmaps       */
 
 
   /***********************************************************************
@@ -137,42 +142,6 @@
    * @description:
    *   A list of valid values for the `encoding_id' for
    *   @TT_PLATFORM_MACINTOSH charmaps and name entries.
-   *
-   * @values:
-   *   TT_MAC_ID_ROMAN ::
-   *   TT_MAC_ID_JAPANESE ::
-   *   TT_MAC_ID_TRADITIONAL_CHINESE ::
-   *   TT_MAC_ID_KOREAN ::
-   *   TT_MAC_ID_ARABIC ::
-   *   TT_MAC_ID_HEBREW ::
-   *   TT_MAC_ID_GREEK ::
-   *   TT_MAC_ID_RUSSIAN ::
-   *   TT_MAC_ID_RSYMBOL ::
-   *   TT_MAC_ID_DEVANAGARI ::
-   *   TT_MAC_ID_GURMUKHI ::
-   *   TT_MAC_ID_GUJARATI ::
-   *   TT_MAC_ID_ORIYA ::
-   *   TT_MAC_ID_BENGALI ::
-   *   TT_MAC_ID_TAMIL ::
-   *   TT_MAC_ID_TELUGU ::
-   *   TT_MAC_ID_KANNADA ::
-   *   TT_MAC_ID_MALAYALAM ::
-   *   TT_MAC_ID_SINHALESE ::
-   *   TT_MAC_ID_BURMESE ::
-   *   TT_MAC_ID_KHMER ::
-   *   TT_MAC_ID_THAI ::
-   *   TT_MAC_ID_LAOTIAN ::
-   *   TT_MAC_ID_GEORGIAN ::
-   *   TT_MAC_ID_ARMENIAN ::
-   *   TT_MAC_ID_MALDIVIAN ::
-   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::
-   *   TT_MAC_ID_TIBETAN ::
-   *   TT_MAC_ID_MONGOLIAN ::
-   *   TT_MAC_ID_GEEZ ::
-   *   TT_MAC_ID_SLAVIC ::
-   *   TT_MAC_ID_VIETNAMESE ::
-   *   TT_MAC_ID_SINDHI ::
-   *   TT_MAC_ID_UNINTERP ::
    */
 
 #define TT_MAC_ID_ROMAN                 0
@@ -247,44 +216,47 @@
    *
    * @values:
    *   TT_MS_ID_SYMBOL_CS ::
-   *     Corresponds to Microsoft symbol encoding. See
-   *     @FT_ENCODING_MS_SYMBOL.
+   *     Microsoft symbol encoding.  See @FT_ENCODING_MS_SYMBOL.
    *
    *   TT_MS_ID_UNICODE_CS ::
-   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See
+   *     Microsoft WGL4 charmap, matching Unicode.  See
    *     @FT_ENCODING_UNICODE.
    *
    *   TT_MS_ID_SJIS ::
-   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.
+   *     Shift JIS Japanese encoding.  See @FT_ENCODING_SJIS.
    *
-   *   TT_MS_ID_GB2312 ::
-   *     Corresponds to Simplified Chinese as used in Mainland China.  See
-   *     @FT_ENCODING_GB2312.
+   *   TT_MS_ID_PRC ::
+   *     Chinese encodings as used in the People's Republic of China (PRC).
+   *     This means the encodings GB~2312 and its supersets GBK and
+   *     GB~18030.  See @FT_ENCODING_PRC.
    *
    *   TT_MS_ID_BIG_5 ::
-   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
-   *     See @FT_ENCODING_BIG5.
+   *     Traditional Chinese as used in Taiwan and Hong Kong.  See
+   *     @FT_ENCODING_BIG5.
    *
    *   TT_MS_ID_WANSUNG ::
-   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.
+   *     Korean Extended Wansung encoding.  See @FT_ENCODING_WANSUNG.
    *
    *   TT_MS_ID_JOHAB ::
-   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.
+   *     Korean Johab encoding.  See @FT_ENCODING_JOHAB.
    *
    *   TT_MS_ID_UCS_4 ::
-   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to
-   *     the OpenType specification version 1.4 (mid-2001.)
+   *     UCS-4 or UTF-32 charmaps.  This has been added to the OpenType
+   *     specification version 1.4 (mid-2001).
    */
 
 #define TT_MS_ID_SYMBOL_CS    0
 #define TT_MS_ID_UNICODE_CS   1
 #define TT_MS_ID_SJIS         2
-#define TT_MS_ID_GB2312       3
+#define TT_MS_ID_PRC          3
 #define TT_MS_ID_BIG_5        4
 #define TT_MS_ID_WANSUNG      5
 #define TT_MS_ID_JOHAB        6
 #define TT_MS_ID_UCS_4       10
 
+  /* this value is deprecated */
+#define TT_MS_ID_GB2312  TT_MS_ID_PRC
+
 
   /***********************************************************************
    *
@@ -312,17 +284,22 @@
 #define TT_ADOBE_ID_LATIN_1   3
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Possible values of the language identifier field in the name records  */
-  /* of the TTF `name' table if the `platform' identifier code is          */
-  /* TT_PLATFORM_MACINTOSH.  These values are also used as return values   */
-  /* for function @FT_Get_CMap_Language_ID.                                */
-  /*                                                                       */
-  /* The canonical source for the Apple assigned Language ID's is at       */
-  /*                                                                       */
-  /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html */
-  /*                                                                       */
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MAC_LANGID_XXX
+   *
+   * @description:
+   *   Possible values of the language identifier field in the name records
+   *   of the SFNT `name' table if the `platform' identifier code is
+   *   @TT_PLATFORM_MACINTOSH.  These values are also used as return values
+   *   for function @FT_Get_CMap_Language_ID.
+   *
+   *   The canonical source for Apple's IDs is
+   *
+   *     https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html
+   */
+
 #define TT_MAC_LANGID_ENGLISH                       0
 #define TT_MAC_LANGID_FRENCH                        1
 #define TT_MAC_LANGID_GERMAN                        2
@@ -433,15 +410,6 @@
 #define TT_MAC_LANGID_JAVANESE                    138
 #define TT_MAC_LANGID_SUNDANESE                   139
 
-
-#if 0  /* these seem to be errors that have been dropped */
-
-#define TT_MAC_LANGID_SCOTTISH_GAELIC             140
-#define TT_MAC_LANGID_IRISH_GAELIC                141
-
-#endif
-
-
   /* The following codes are new as of 2000-03-10 */
 #define TT_MAC_LANGID_GALICIAN                    140
 #define TT_MAC_LANGID_AFRIKAANS                   141
@@ -456,18 +424,30 @@
 #define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Possible values of the language identifier field in the name records  */
-  /* of the TTF `name' table if the `platform' identifier code is          */
-  /* TT_PLATFORM_MICROSOFT.                                                */
-  /*                                                                       */
-  /* The canonical source for the MS assigned LCIDs is                     */
-  /*                                                                       */
-  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */
-  /*                                                                       */
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MS_LANGID_XXX
+   *
+   * @description:
+   *   Possible values of the language identifier field in the name records
+   *   of the SFNT `name' table if the `platform' identifier code is
+   *   @TT_PLATFORM_MICROSOFT.  These values are also used as return values
+   *   for function @FT_Get_CMap_Language_ID.
+   *
+   *   The canonical source for Microsoft's IDs is
+   *
+   *     https://www.microsoft.com/globaldev/reference/lcid-all.mspx ,
+   *
+   *   however, we only provide macros for language identifiers present in
+   *   the OpenType specification: Microsoft has abandoned the concept of
+   *   LCIDs (language code identifiers), and format~1 of the `name' table
+   *   provides a better mechanism for languages not covered here.
+   *
+   *   More legacy values not listed in the reference can be found in the
+   *   @FT_TRUETYPE_IDS_H header file.
+   */
 
-#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001
 #define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401
 #define TT_MS_LANGID_ARABIC_IRAQ                       0x0801
 #define TT_MS_LANGID_ARABIC_EGYPT                      0x0C01
@@ -485,39 +465,20 @@
 #define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3C01
 #define TT_MS_LANGID_ARABIC_QATAR                      0x4001
 #define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402
-#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403
-#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004
+#define TT_MS_LANGID_CATALAN_CATALAN                   0x0403
 #define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404
 #define TT_MS_LANGID_CHINESE_PRC                       0x0804
 #define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0C04
 #define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004
-
-#if 1  /* this looks like the correct value */
-#define TT_MS_LANGID_CHINESE_MACAU                     0x1404
-#else  /* but beware, Microsoft may change its mind...
-          the most recent Word reference has the following: */
-#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG
-#endif
-
-#if 0  /* used only with .NET `cultures'; commented out */
-#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04
-#endif
-
+#define TT_MS_LANGID_CHINESE_MACAO                     0x1404
 #define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405
 #define TT_MS_LANGID_DANISH_DENMARK                    0x0406
 #define TT_MS_LANGID_GERMAN_GERMANY                    0x0407
 #define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807
 #define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0C07
 #define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007
-#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEIN              0x1407
 #define TT_MS_LANGID_GREEK_GREECE                      0x0408
-
-  /* don't ask what this one means... It is commented out currently. */
-#if 0
-#define TT_MS_LANGID_GREEK_GREECE2                     0x2008
-#endif
-
-#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009
 #define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409
 #define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809
 #define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0C09
@@ -531,14 +492,12 @@
 #define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2C09
 #define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009
 #define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409
-#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809
-#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3C09
 #define TT_MS_LANGID_ENGLISH_INDIA                     0x4009
 #define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409
 #define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809
 #define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040A
 #define TT_MS_LANGID_SPANISH_MEXICO                    0x080A
-#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0C0A
+#define TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT         0x0C0A
 #define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100A
 #define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140A
 #define TT_MS_LANGID_SPANISH_PANAMA                    0x180A
@@ -557,9 +516,6 @@
 #define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4C0A
 #define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500A
 #define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540A
-  /* The following ID blatantly violate MS specs by using a */
-  /* sublanguage > 0x1F.                                    */
-#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40AU
 #define TT_MS_LANGID_FINNISH_FINLAND                   0x040B
 #define TT_MS_LANGID_FRENCH_FRANCE                     0x040C
 #define TT_MS_LANGID_FRENCH_BELGIUM                    0x080C
@@ -567,27 +523,13 @@
 #define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100C
 #define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140C
 #define TT_MS_LANGID_FRENCH_MONACO                     0x180C
-#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1C0C
-#define TT_MS_LANGID_FRENCH_REUNION                    0x200C
-#define TT_MS_LANGID_FRENCH_CONGO                      0x240C
-  /* which was formerly: */
-#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO
-#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280C
-#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2C0C
-#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300C
-#define TT_MS_LANGID_FRENCH_MALI                       0x340C
-#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380C
-#define TT_MS_LANGID_FRENCH_HAITI                      0x3C0C
-  /* and another violation of the spec (see 0xE40AU) */
-#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40CU
 #define TT_MS_LANGID_HEBREW_ISRAEL                     0x040D
 #define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040E
 #define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040F
 #define TT_MS_LANGID_ITALIAN_ITALY                     0x0410
 #define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810
 #define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411
-#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412
-#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812
+#define TT_MS_LANGID_KOREAN_KOREA                      0x0412
 #define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413
 #define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813
 #define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414
@@ -595,26 +537,17 @@
 #define TT_MS_LANGID_POLISH_POLAND                     0x0415
 #define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416
 #define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816
-#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417
+#define TT_MS_LANGID_ROMANSH_SWITZERLAND               0x0417
 #define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418
-#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818
 #define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419
-#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819
 #define TT_MS_LANGID_CROATIAN_CROATIA                  0x041A
 #define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081A
 #define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0C1A
-
-#if 0  /* this used to be this value, but it looks like we were wrong */
-#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101A
-#else  /* current sources say */
 #define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101A
 #define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141A
-       /* and XPsp2 Platform SDK added (2004-07-26) */
-       /* Names are shortened to be significant within 40 chars. */
 #define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181A
-#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181A
-#endif
-
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x1C1A
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC      0x201A
 #define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041B
 #define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041C
 #define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041D
@@ -622,36 +555,30 @@
 #define TT_MS_LANGID_THAI_THAILAND                     0x041E
 #define TT_MS_LANGID_TURKISH_TURKEY                    0x041F
 #define TT_MS_LANGID_URDU_PAKISTAN                     0x0420
-#define TT_MS_LANGID_URDU_INDIA                        0x0820
 #define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421
 #define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422
 #define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423
-#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424
+#define TT_MS_LANGID_SLOVENIAN_SLOVENIA                0x0424
 #define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425
 #define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426
 #define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427
-#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827
 #define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428
-#define TT_MS_LANGID_FARSI_IRAN                        0x0429
 #define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042A
 #define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042B
 #define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042C
 #define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082C
-#define TT_MS_LANGID_BASQUE_SPAIN                      0x042D
-#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042E
+#define TT_MS_LANGID_BASQUE_BASQUE                     0x042D
+#define TT_MS_LANGID_UPPER_SORBIAN_GERMANY             0x042E
+#define TT_MS_LANGID_LOWER_SORBIAN_GERMANY             0x082E
 #define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042F
-#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430
-#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431
-#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432
-#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433
-#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434
-#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435
+#define TT_MS_LANGID_SETSWANA_SOUTH_AFRICA             0x0432
+#define TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA             0x0434
+#define TT_MS_LANGID_ISIZULU_SOUTH_AFRICA              0x0435
 #define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436
 #define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437
 #define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438
 #define TT_MS_LANGID_HINDI_INDIA                       0x0439
 #define TT_MS_LANGID_MALTESE_MALTA                     0x043A
-  /* Added by XPsp2 Platform SDK (2004-07-26) */
 #define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043B
 #define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083B
 #define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3B
@@ -661,37 +588,21 @@
 #define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3B
 #define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203B
 #define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243B
-  /* ... and we also keep our old identifier... */
-#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043B
-
-#if 0 /* this seems to be a previous inversion */
-#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043C
-#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083C
-#else
-#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083C
-#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043C
-#endif
-
-#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043D
+#define TT_MS_LANGID_IRISH_IRELAND                     0x083C
 #define TT_MS_LANGID_MALAY_MALAYSIA                    0x043E
 #define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083E
-#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043F
-#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
-  /* alias declared in Windows 2000 */
-#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
-          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
-
-#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441
+#define TT_MS_LANGID_KAZAKH_KAZAKHSTAN                 0x043F
+#define TT_MS_LANGID_KYRGYZ_KYRGYZSTAN /* Cyrillic*/   0x0440
+#define TT_MS_LANGID_KISWAHILI_KENYA                   0x0441
 #define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442
 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443
 #define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843
-#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444
+#define TT_MS_LANGID_TATAR_RUSSIA                      0x0444
 #define TT_MS_LANGID_BENGALI_INDIA                     0x0445
 #define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845
 #define TT_MS_LANGID_PUNJABI_INDIA                     0x0446
-#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846
 #define TT_MS_LANGID_GUJARATI_INDIA                    0x0447
-#define TT_MS_LANGID_ORIYA_INDIA                       0x0448
+#define TT_MS_LANGID_ODIA_INDIA                        0x0448
 #define TT_MS_LANGID_TAMIL_INDIA                       0x0449
 #define TT_MS_LANGID_TELUGU_INDIA                      0x044A
 #define TT_MS_LANGID_KANNADA_INDIA                     0x044B
@@ -700,142 +611,241 @@
 #define TT_MS_LANGID_MARATHI_INDIA                     0x044E
 #define TT_MS_LANGID_SANSKRIT_INDIA                    0x044F
 #define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
-#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850
-#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451
-  /* Don't use the next constant!  It has            */
-  /*   (1) the wrong spelling (Dzonghka)             */
-  /*   (2) Microsoft doesn't officially define it -- */
-  /*       at least it is not in the List of Local   */
-  /*       ID Values.                                */
-  /*   (3) Dzongkha is not the same language as      */
-  /*       Tibetan, so merging it is wrong anyway.   */
-  /*                                                 */
-  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */
-#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851
-
-#if 0
-  /* the following used to be defined */
-#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451
-  /* ... but it was changed; */
-#else
-  /* So we will continue to #define it, but with the correct value */
-#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN
-#endif
-
-#define TT_MS_LANGID_WELSH_WALES                       0x0452
+#define TT_MS_LANGID_MONGOLIAN_PRC                     0x0850
+#define TT_MS_LANGID_TIBETAN_PRC                       0x0451
+#define TT_MS_LANGID_WELSH_UNITED_KINGDOM              0x0452
 #define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453
 #define TT_MS_LANGID_LAO_LAOS                          0x0454
-#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455
-#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456
+#define TT_MS_LANGID_GALICIAN_GALICIAN                 0x0456
 #define TT_MS_LANGID_KONKANI_INDIA                     0x0457
-#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458
-#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459
-#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859
-  /* Missing a LCID for Sindhi in Devanagari script */
 #define TT_MS_LANGID_SYRIAC_SYRIA                      0x045A
-#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045B
-#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045C
+#define TT_MS_LANGID_SINHALA_SRI_LANKA                 0x045B
 #define TT_MS_LANGID_INUKTITUT_CANADA                  0x045D
+#define TT_MS_LANGID_INUKTITUT_CANADA_LATIN            0x085D
 #define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045E
-#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045F
-#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085F
-  /* Missing a LCID for Tifinagh script */
-#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460
-  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
-  /* script is yet unclear... might be Arabic, Nagari or Sharada */
-#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860
-  /* ... and aliased (by MS) for compatibility reasons. */
-#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_TAMAZIGHT_ALGERIA                 0x085F
 #define TT_MS_LANGID_NEPALI_NEPAL                      0x0461
-#define TT_MS_LANGID_NEPALI_INDIA                      0x0861
 #define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462
 #define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463
 #define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464
 #define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465
-  /* alias declared in Windows 2000 */
-#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES
-#define TT_MS_LANGID_EDO_NIGERIA                       0x0466
-#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467
 #define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468
-#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469
 #define TT_MS_LANGID_YORUBA_NIGERIA                    0x046A
 #define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046B
 #define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086B
 #define TT_MS_LANGID_QUECHUA_PERU                      0x0C6B
-#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046C
-  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
-#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
-          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
-  /* language codes 0x046D, 0x046E and 0x046F are (still) unknown. */
+#define TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA     0x046C
+#define TT_MS_LANGID_BASHKIR_RUSSIA                    0x046D
+#define TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG          0x046E
+#define TT_MS_LANGID_GREENLANDIC_GREENLAND             0x046F
 #define TT_MS_LANGID_IGBO_NIGERIA                      0x0470
+#define TT_MS_LANGID_YI_PRC                            0x0478
+#define TT_MS_LANGID_MAPUDUNGUN_CHILE                  0x047A
+#define TT_MS_LANGID_MOHAWK_MOHAWK                     0x047C
+#define TT_MS_LANGID_BRETON_FRANCE                     0x047E
+#define TT_MS_LANGID_UIGHUR_PRC                        0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481
+#define TT_MS_LANGID_OCCITAN_FRANCE                    0x0482
+#define TT_MS_LANGID_CORSICAN_FRANCE                   0x0483
+#define TT_MS_LANGID_ALSATIAN_FRANCE                   0x0484
+#define TT_MS_LANGID_YAKUT_RUSSIA                      0x0485
+#define TT_MS_LANGID_KICHE_GUATEMALA                   0x0486
+#define TT_MS_LANGID_KINYARWANDA_RWANDA                0x0487
+#define TT_MS_LANGID_WOLOF_SENEGAL                     0x0488
+#define TT_MS_LANGID_DARI_AFGHANISTAN                  0x048C
+
+  /* */
+
+
+  /* legacy macro definitions not present in OpenType 1.8.1 */
+#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001
+#define TT_MS_LANGID_CATALAN_SPAIN \
+          TT_MS_LANGID_CATALAN_CATALAN
+#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004
+#define TT_MS_LANGID_CHINESE_MACAU \
+          TT_MS_LANGID_CHINESE_MACAO
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI \
+          TT_MS_LANGID_GERMAN_LIECHTENSTEIN
+#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009
+#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3C09
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT \
+          TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40AU
+#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1C0C
+#define TT_MS_LANGID_FRENCH_REUNION                    0x200C
+#define TT_MS_LANGID_FRENCH_CONGO                      0x240C
+  /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE \
+          TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280C
+#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2C0C
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300C
+#define TT_MS_LANGID_FRENCH_MALI                       0x340C
+#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380C
+#define TT_MS_LANGID_FRENCH_HAITI                      0x3C0C
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40CU
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA \
+          TT_MS_LANGID_KOREAN_KOREA
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND \
+          TT_MS_LANGID_ROMANSH_SWITZERLAND
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819
+#define TT_MS_LANGID_URDU_INDIA                        0x0820
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827
+#define TT_MS_LANGID_SLOVENE_SLOVENIA \
+          TT_MS_LANGID_SLOVENIAN_SLOVENIA
+#define TT_MS_LANGID_FARSI_IRAN                        0x0429
+#define TT_MS_LANGID_BASQUE_SPAIN \
+          TT_MS_LANGID_BASQUE_BASQUE
+#define TT_MS_LANGID_SORBIAN_GERMANY \
+          TT_MS_LANGID_UPPER_SORBIAN_GERMANY
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA \
+          TT_MS_LANGID_SETSWANA_SOUTH_AFRICA
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA \
+          TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA \
+          TT_MS_LANGID_ISIZULU_SOUTH_AFRICA
+#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043B
+  /* the next two values are incorrectly inverted */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043C
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083C
+#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043D
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN \
+          TT_MS_LANGID_KAZAKH_KAZAKHSTAN
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+          TT_MS_LANGID_KYRGYZ_KYRGYZSTAN
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN \
+          TT_MS_LANGID_KYRGYZ_KYRGYZSTAN
+#define TT_MS_LANGID_SWAHILI_KENYA \
+          TT_MS_LANGID_KISWAHILI_KENYA
+#define TT_MS_LANGID_TATAR_TATARSTAN \
+          TT_MS_LANGID_TATAR_RUSSIA
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846
+#define TT_MS_LANGID_ORIYA_INDIA \
+          TT_MS_LANGID_ODIA_INDIA
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN \
+          TT_MS_LANGID_MONGOLIAN_PRC
+#define TT_MS_LANGID_TIBETAN_CHINA \
+          TT_MS_LANGID_TIBETAN_PRC
+#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851
+#define TT_MS_LANGID_TIBETAN_BHUTAN \
+          TT_MS_LANGID_DZONGHKA_BHUTAN
+#define TT_MS_LANGID_WELSH_WALES \
+          TT_MS_LANGID_WELSH_UNITED_KINGDOM
+#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN \
+          TT_MS_LANGID_GALICIAN_GALICIAN
+#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA \
+          TT_MS_LANGID_SINHALA_SRI_LANKA
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045C
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045F
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN \
+          TT_MS_LANGID_TAMAZIGHT_ALGERIA
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460
+#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860
+#define TT_MS_LANGID_KASHMIRI_INDIA \
+          TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_INDIA                      0x0861
+#define TT_MS_LANGID_DIVEHI_MALDIVES \
+          TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA                       0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467
+#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA \
+          TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+          TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA
 #define TT_MS_LANGID_KANURI_NIGERIA                    0x0471
 #define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472
 #define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473
 #define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873
-  /* also spelled in the `Passport SDK' list as: */
-#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA \
+          TT_MS_LANGID_TIGRIGNA_ERYTHREA
 #define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474
 #define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475
 #define TT_MS_LANGID_LATIN                             0x0476
 #define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477
-  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
-  /*       not written (but OTOH the peculiar writing system is worth     */
-  /*       studying).                                                     */
-#define TT_MS_LANGID_YI_CHINA                          0x0478
+#define TT_MS_LANGID_YI_CHINA \
+          TT_MS_LANGID_YI_PRC
 #define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479
-  /* language codes from 0x047A to 0x047F are (still) unknown. */
-#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480
-#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481
-
-#if 0  /* not deemed useful for fonts */
-#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04FF
-#endif
+#define TT_MS_LANGID_UIGHUR_CHINA \
+          TT_MS_LANGID_UIGHUR_PRC
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Possible values of the `name' identifier field in the name records of */
-  /* the TTF `name' table.  These values are platform independent.         */
-  /*                                                                       */
-#define TT_NAME_ID_COPYRIGHT            0
-#define TT_NAME_ID_FONT_FAMILY          1
-#define TT_NAME_ID_FONT_SUBFAMILY       2
-#define TT_NAME_ID_UNIQUE_ID            3
-#define TT_NAME_ID_FULL_NAME            4
-#define TT_NAME_ID_VERSION_STRING       5
-#define TT_NAME_ID_PS_NAME              6
-#define TT_NAME_ID_TRADEMARK            7
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_NAME_ID_XXX
+   *
+   * @description:
+   *   Possible values of the `name' identifier field in the name records of
+   *   an SFNT `name' table.  These values are platform independent.
+   */
+
+#define TT_NAME_ID_COPYRIGHT              0
+#define TT_NAME_ID_FONT_FAMILY            1
+#define TT_NAME_ID_FONT_SUBFAMILY         2
+#define TT_NAME_ID_UNIQUE_ID              3
+#define TT_NAME_ID_FULL_NAME              4
+#define TT_NAME_ID_VERSION_STRING         5
+#define TT_NAME_ID_PS_NAME                6
+#define TT_NAME_ID_TRADEMARK              7
 
   /* the following values are from the OpenType spec */
-#define TT_NAME_ID_MANUFACTURER         8
-#define TT_NAME_ID_DESIGNER             9
-#define TT_NAME_ID_DESCRIPTION          10
-#define TT_NAME_ID_VENDOR_URL           11
-#define TT_NAME_ID_DESIGNER_URL         12
-#define TT_NAME_ID_LICENSE              13
-#define TT_NAME_ID_LICENSE_URL          14
+#define TT_NAME_ID_MANUFACTURER           8
+#define TT_NAME_ID_DESIGNER               9
+#define TT_NAME_ID_DESCRIPTION            10
+#define TT_NAME_ID_VENDOR_URL             11
+#define TT_NAME_ID_DESIGNER_URL           12
+#define TT_NAME_ID_LICENSE                13
+#define TT_NAME_ID_LICENSE_URL            14
   /* number 15 is reserved */
-#define TT_NAME_ID_PREFERRED_FAMILY     16
-#define TT_NAME_ID_PREFERRED_SUBFAMILY  17
-#define TT_NAME_ID_MAC_FULL_NAME        18
+#define TT_NAME_ID_TYPOGRAPHIC_FAMILY     16
+#define TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY  17
+#define TT_NAME_ID_MAC_FULL_NAME          18
 
   /* The following code is new as of 2000-01-21 */
-#define TT_NAME_ID_SAMPLE_TEXT          19
+#define TT_NAME_ID_SAMPLE_TEXT            19
 
   /* This is new in OpenType 1.3 */
-#define TT_NAME_ID_CID_FINDFONT_NAME    20
+#define TT_NAME_ID_CID_FINDFONT_NAME      20
 
   /* This is new in OpenType 1.5 */
-#define TT_NAME_ID_WWS_FAMILY           21
-#define TT_NAME_ID_WWS_SUBFAMILY        22
+#define TT_NAME_ID_WWS_FAMILY             21
+#define TT_NAME_ID_WWS_SUBFAMILY          22
+
+  /* This is new in OpenType 1.7 */
+#define TT_NAME_ID_LIGHT_BACKGROUND       23
+#define TT_NAME_ID_DARK_BACKGROUND        24
+
+  /* This is new in OpenType 1.8 */
+#define TT_NAME_ID_VARIATIONS_PREFIX      25
+
+  /* these two values are deprecated */
+#define TT_NAME_ID_PREFERRED_FAMILY     TT_NAME_ID_TYPOGRAPHIC_FAMILY
+#define TT_NAME_ID_PREFERRED_SUBFAMILY  TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */
-  /*                                                                       */
-  /* Updated 08-Nov-2008.                                                  */
-  /*                                                                       */
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_UCR_XXX
+   *
+   * @description:
+   *   Possible bit mask values for the `ulUnicodeRangeX' fields in an SFNT
+   *   `OS/2' table.
+   */
+
+  /* ulUnicodeRange1 */
+  /* --------------- */
 
   /* Bit  0   Basic Latin */
 #define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
@@ -857,7 +867,7 @@
                                                           /* U+A700-U+A71F */
   /* Bit  6   Combining Diacritical Marks            */
   /*          Combining Diacritical Marks Supplement */
-#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS     (1L <<  6) /* U+0300-U+036F */
                                                           /* U+1DC0-U+1DFF */
   /* Bit  7   Greek and Coptic */
 #define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */
@@ -925,12 +935,17 @@
   /*          Supplemental Punctuation */
 #define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
                                                           /* U+2E00-U+2E7F */
+
+  /* ulUnicodeRange2 */
+  /* --------------- */
+
   /* Bit 32   Superscripts And Subscripts */
 #define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */
   /* Bit 33   Currency Symbols */
 #define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */
   /* Bit 34   Combining Diacritical Marks For Symbols */
-#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+                                               (1L <<  2) /* U+20D0-U+20FF */
   /* Bit 35   Letterlike Symbols */
 #define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
   /* Bit 36   Number Forms */
@@ -996,13 +1011,13 @@
   /* Bit 57   High Surrogates              */
   /*          High Private Use Surrogates  */
   /*          Low Surrogates               */
-  /*                                       */
+
   /* According to OpenType specs v.1.3+,   */
   /* setting bit 57 implies that there is  */
   /* at least one codepoint beyond the     */
   /* Basic Multilingual Plane that is      */
   /* supported by this font.  So it really */
-  /* means >= U+10000                      */
+  /* means >= U+10000.                     */
 #define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
                                                           /* U+DB80-U+DBFF */
                                                           /* U+DC00-U+DFFF */
@@ -1034,7 +1049,11 @@
   /* Bit 62   Alphabetic Presentation Forms */
 #define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */
   /* Bit 63   Arabic Presentation Forms-A */
-#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A     (1L << 31) /* U+FB50-U+FDFF */
+
+  /* ulUnicodeRange3 */
+  /* --------------- */
+
   /* Bit 64   Combining Half Marks */
 #define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
   /* Bit 65   Vertical forms          */
@@ -1044,7 +1063,7 @@
   /* Bit 66   Small Form Variants */
 #define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */
   /* Bit 67   Arabic Presentation Forms-B */
-#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B     (1L <<  3) /* U+FE70-U+FEFE */
   /* Bit 68   Halfwidth and Fullwidth Forms */
 #define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
   /* Bit 69   Specials */
@@ -1123,6 +1142,10 @@
 #define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */
   /* Bit 95   New Tai Lue */
 #define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */
+
+  /* ulUnicodeRange4 */
+  /* --------------- */
+
   /* Bit 96   Buginese */
 #define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
   /* Bit 97   Glagolitic */
@@ -1191,47 +1214,23 @@
                                                           /*U+1F000-U+1F02F*/
   /* Bit 123-127 Reserved for process-internal usage */
 
+  /* */
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Some compilers have a very limited length of identifiers.             */
-  /*                                                                       */
-#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
-#define HAVE_LIMIT_ON_IDENTS
-#endif
+  /* for backward compatibility with older FreeType versions */
+#define TT_UCR_ARABIC_PRESENTATION_A         \
+          TT_UCR_ARABIC_PRESENTATION_FORMS_A
+#define TT_UCR_ARABIC_PRESENTATION_B         \
+          TT_UCR_ARABIC_PRESENTATION_FORMS_B
 
-
-#ifndef HAVE_LIMIT_ON_IDENTS
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Here some alias #defines in order to be clearer.                      */
-  /*                                                                       */
-  /* These are not always #defined to stay within the 31~character limit,  */
-  /* which some compilers have.                                            */
-  /*                                                                       */
-  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */
-  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */
-  /* If you get a warning with such a compiler, use the -i40 switch.       */
-  /*                                                                       */
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \
-         TT_UCR_ARABIC_PRESENTATIONS_A
-#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \
-         TT_UCR_ARABIC_PRESENTATIONS_B
-
-#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \
-         TT_UCR_COMBINING_DIACRITICS
-#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
-         TT_UCR_COMBINING_DIACRITICS_SYMB
-
-
-#endif /* !HAVE_LIMIT_ON_IDENTS */
+#define TT_UCR_COMBINING_DIACRITICS          \
+          TT_UCR_COMBINING_DIACRITICAL_MARKS
+#define TT_UCR_COMBINING_DIACRITICS_SYMB          \
+          TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB
 
 
 FT_END_HEADER
 
-#endif /* __TTNAMEID_H__ */
+#endif /* TTNAMEID_H_ */
 
 
 /* END */
diff --git a/include/tttables.h b/include/freetype/tttables.h
similarity index 79%
rename from include/tttables.h
rename to include/freetype/tttables.h
index 1568f40..ce6a617 100644
--- a/include/tttables.h
+++ b/include/freetype/tttables.h
@@ -5,7 +5,7 @@
 /*    Basic SFNT/TrueType tables definitions and interface                 */
 /*    (specification only).                                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTTABLES_H__
-#define __TTTABLES_H__
+#ifndef TTTABLES_H_
+#define TTTABLES_H_
 
 
 #include <ft2build.h>
@@ -45,8 +45,9 @@
   /*    TrueType specific table types and functions.                       */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    This section contains the definition of TrueType-specific tables   */
-  /*    as well as some routines used to access and process them.          */
+  /*    This section contains definitions of some basic tables specific to */
+  /*    TrueType and OpenType as well as some routines used to access and  */
+  /*    process them.                                                      */
   /*                                                                       */
   /* <Order>                                                               */
   /*    TT_Header                                                          */
@@ -76,8 +77,8 @@
   /*    TT_Header                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a TrueType font header table.  All       */
-  /*    fields follow the TrueType specification.                          */
+  /*    A structure to model a TrueType font header table.  All fields     */
+  /*    follow the OpenType specification.                                 */
   /*                                                                       */
   typedef struct  TT_Header_
   {
@@ -114,9 +115,9 @@
   /*    TT_HoriHeader                                                      */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a TrueType horizontal header, the `hhea' */
+  /*    A structure to model a TrueType horizontal header, the `hhea'      */
   /*    table, as well as the corresponding horizontal metrics table,      */
-  /*    i.e., the `hmtx' table.                                            */
+  /*    `hmtx'.                                                            */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    Version                :: The table version.                       */
@@ -131,7 +132,7 @@
   /*                              glyphs found in the font (maybe ASCII).  */
   /*                                                                       */
   /*                              You should use the `sTypoAscender' field */
-  /*                              of the OS/2 table instead if you want    */
+  /*                              of the `OS/2' table instead if you want  */
   /*                              the correct one.                         */
   /*                                                                       */
   /*    Descender              :: The font's descender, i.e., the distance */
@@ -145,7 +146,7 @@
   /*                              glyphs found in the font (maybe ASCII).  */
   /*                                                                       */
   /*                              You should use the `sTypoDescender'      */
-  /*                              field of the OS/2 table instead if you   */
+  /*                              field of the `OS/2' table instead if you */
   /*                              want the correct one.                    */
   /*                                                                       */
   /*    Line_Gap               :: The font's line gap, i.e., the distance  */
@@ -175,6 +176,8 @@
   /*    caret_Slope_Run        :: The run coefficient of the cursor's      */
   /*                              slope.                                   */
   /*                                                                       */
+  /*    caret_Offset           :: The cursor's offset for slanted fonts.   */
+  /*                                                                       */
   /*    Reserved               :: 8~reserved bytes.                        */
   /*                                                                       */
   /*    metric_Data_Format     :: Always~0.                                */
@@ -188,13 +191,10 @@
   /*    short_metrics          :: A pointer into the `hmtx' table.         */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
-  /*               be identical except for the names of their fields,      */
-  /*               which are different.                                    */
-  /*                                                                       */
-  /*               This ensures that a single function in the `ttload'     */
-  /*               module is able to read both the horizontal and vertical */
-  /*               headers.                                                */
+  /*    For an OpenType variation font, the values of the following fields */
+  /*    can change after a call to @FT_Set_Var_Design_Coordinates (and     */
+  /*    friends) if the font contains an `MVAR' table: `caret_Slope_Rise', */
+  /*    `caret_Slope_Run', and `caret_Offset'.                             */
   /*                                                                       */
   typedef struct  TT_HoriHeader_
   {
@@ -217,9 +217,9 @@
     FT_Short   metric_Data_Format;
     FT_UShort  number_Of_HMetrics;
 
-    /* The following fields are not defined by the TrueType specification */
+    /* The following fields are not defined by the OpenType specification */
     /* but they are used to connect the metrics header to the relevant    */
-    /* `HMTX' table.                                                      */
+    /* `hmtx' table.                                                      */
 
     void*      long_metrics;
     void*      short_metrics;
@@ -234,8 +234,8 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    A structure used to model a TrueType vertical header, the `vhea'   */
-  /*    table, as well as the corresponding vertical metrics table, i.e.,  */
-  /*    the `vmtx' table.                                                  */
+  /*    table, as well as the corresponding vertical metrics table,        */
+  /*    `vmtx'.                                                            */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    Version                 :: The table version.                      */
@@ -251,8 +251,8 @@
   /*                               ASCII).                                 */
   /*                                                                       */
   /*                               You should use the `sTypoAscender'      */
-  /*                               field of the OS/2 table instead if you  */
-  /*                               want the correct one.                   */
+  /*                               field of the `OS/2' table instead if    */
+  /*                               you want the correct one.               */
   /*                                                                       */
   /*    Descender               :: The font's descender, i.e., the         */
   /*                               distance from the baseline to the       */
@@ -266,8 +266,8 @@
   /*                               ASCII).                                 */
   /*                                                                       */
   /*                               You should use the `sTypoDescender'     */
-  /*                               field of the OS/2 table instead if you  */
-  /*                               want the correct one.                   */
+  /*                               field of the `OS/2' table instead if    */
+  /*                               you want the correct one.               */
   /*                                                                       */
   /*    Line_Gap                :: The font's line gap, i.e., the distance */
   /*                               to add to the ascender and descender to */
@@ -297,30 +297,26 @@
   /*                               slope.                                  */
   /*                                                                       */
   /*    caret_Offset            :: The cursor's offset for slanted fonts.  */
-  /*                               This value is `reserved' in vmtx        */
-  /*                               version 1.0.                            */
   /*                                                                       */
   /*    Reserved                :: 8~reserved bytes.                       */
   /*                                                                       */
   /*    metric_Data_Format      :: Always~0.                               */
   /*                                                                       */
-  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */
+  /*    number_Of_VMetrics      :: Number of VMetrics entries in the       */
   /*                               `vmtx' table -- this value can be       */
   /*                               smaller than the total number of glyphs */
   /*                               in the font.                            */
   /*                                                                       */
-  /*    long_metrics           :: A pointer into the `vmtx' table.         */
+  /*    long_metrics            :: A pointer into the `vmtx' table.        */
   /*                                                                       */
-  /*    short_metrics          :: A pointer into the `vmtx' table.         */
+  /*    short_metrics           :: A pointer into the `vmtx' table.        */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
-  /*               be identical except for the names of their fields,      */
-  /*               which are different.                                    */
-  /*                                                                       */
-  /*               This ensures that a single function in the `ttload'     */
-  /*               module is able to read both the horizontal and vertical */
-  /*               headers.                                                */
+  /*    For an OpenType variation font, the values of the following fields */
+  /*    can change after a call to @FT_Set_Var_Design_Coordinates (and     */
+  /*    friends) if the font contains an `MVAR' table: `Ascender',         */
+  /*    `Descender', `Line_Gap', `caret_Slope_Rise', `caret_Slope_Run',    */
+  /*    and `caret_Offset'.                                                */
   /*                                                                       */
   typedef struct  TT_VertHeader_
   {
@@ -331,9 +327,9 @@
 
     FT_UShort  advance_Height_Max;      /* advance height maximum */
 
-    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
-    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
-    FT_Short   yMax_Extent;             /* xmax or ymax extents            */
+    FT_Short   min_Top_Side_Bearing;    /* minimum top-sb          */
+    FT_Short   min_Bottom_Side_Bearing; /* minimum bottom-sb       */
+    FT_Short   yMax_Extent;             /* ymax extents            */
     FT_Short   caret_Slope_Rise;
     FT_Short   caret_Slope_Run;
     FT_Short   caret_Offset;
@@ -343,9 +339,9 @@
     FT_Short   metric_Data_Format;
     FT_UShort  number_Of_VMetrics;
 
-    /* The following fields are not defined by the TrueType specification */
-    /* but they're used to connect the metrics header to the relevant     */
-    /* `HMTX' or `VMTX' table.                                            */
+    /* The following fields are not defined by the OpenType specification */
+    /* but they are used to connect the metrics header to the relevant    */
+    /* `vmtx' table.                                                      */
 
     void*      long_metrics;
     void*      short_metrics;
@@ -359,12 +355,28 @@
   /*    TT_OS2                                                             */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a TrueType OS/2 table.  All fields       */
-  /*    comply to the OpenType specification.                              */
+  /*    A structure to model a TrueType `OS/2' table.  All fields comply   */
+  /*    to the OpenType specification.                                     */
   /*                                                                       */
-  /*    Note that we now support old Mac fonts that do not include an OS/2 */
-  /*    table.  In this case, the `version' field is always set to 0xFFFF. */
+  /*    Note that we now support old Mac fonts that do not include an      */
+  /*    `OS/2' table.  In this case, the `version' field is always set to  */
+  /*    0xFFFF.                                                            */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    For an OpenType variation font, the values of the following fields */
+  /*    can change after a call to @FT_Set_Var_Design_Coordinates (and     */
+  /*    friends) if the font contains an `MVAR' table: `sCapHeight',       */
+  /*    `sTypoAscender', `sTypoDescender', `sTypoLineGap', `sxHeight',     */
+  /*    `usWinAscent', `usWinDescent', `yStrikeoutPosition',               */
+  /*    `yStrikeoutSize', `ySubscriptXOffset', `ySubScriptXSize',          */
+  /*    `ySubscriptYOffset', `ySubscriptYSize', `ySuperscriptXOffset',     */
+  /*    `ySuperscriptXSize', `ySuperscriptYOffset', and                    */
+  /*    `ySuperscriptYSize'.                                               */
+  /*                                                                       */
+  /*    Possible values for bits in the `ulUnicodeRangeX' fields are given */
+  /*    by the @TT_UCR_XXX macros.                                         */
+  /*                                                                       */
+
   typedef struct  TT_OS2_
   {
     FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
@@ -429,10 +441,16 @@
   /*    TT_Postscript                                                      */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a TrueType PostScript table.  All fields */
-  /*    comply to the TrueType specification.  This structure does not     */
-  /*    reference the PostScript glyph names, which can be nevertheless    */
-  /*    accessed with the `ttpost' module.                                 */
+  /*    A structure to model a TrueType `post' table.  All fields comply   */
+  /*    to the OpenType specification.  This structure does not reference  */
+  /*    a font's PostScript glyph names; use @FT_Get_Glyph_Name to         */
+  /*    retrieve them.                                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    For an OpenType variation font, the values of the following fields */
+  /*    can change after a call to @FT_Set_Var_Design_Coordinates (and     */
+  /*    friends) if the font contains an `MVAR' table: `underlinePosition' */
+  /*    and `underlineThickness'.                                          */
   /*                                                                       */
   typedef struct  TT_Postscript_
   {
@@ -446,8 +464,8 @@
     FT_ULong  minMemType1;
     FT_ULong  maxMemType1;
 
-    /* Glyph names follow in the file, but we don't   */
-    /* load them by default.  See the ttpost.c file.  */
+    /* Glyph names follow in the `post' table, but we don't */
+    /* load them by default.                                */
 
   } TT_Postscript;
 
@@ -458,8 +476,8 @@
   /*    TT_PCLT                                                            */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure used to model a TrueType PCLT table.  All fields       */
-  /*    comply to the TrueType specification.                              */
+  /*    A structure to model a TrueType `PCLT' table.  All fields comply   */
+  /*    to the OpenType specification.                                     */
   /*                                                                       */
   typedef struct  TT_PCLT_
   {
@@ -488,9 +506,9 @@
   /*    TT_MaxProfile                                                      */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    The maximum profile is a table containing many max values, which   */
-  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
-  /*    allocation occurs during a glyph load.                             */
+  /*    The maximum profile (`maxp') table contains many max values, which */
+  /*    can be used to pre-allocate arrays for speeding up glyph loading   */
+  /*    and hinting.                                                       */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    version               :: The version number.                       */
@@ -500,21 +518,19 @@
   /*                                                                       */
   /*    maxPoints             :: The maximum number of points in a         */
   /*                             non-composite TrueType glyph.  See also   */
-  /*                             the structure element                     */
   /*                             `maxCompositePoints'.                     */
   /*                                                                       */
   /*    maxContours           :: The maximum number of contours in a       */
   /*                             non-composite TrueType glyph.  See also   */
-  /*                             the structure element                     */
   /*                             `maxCompositeContours'.                   */
   /*                                                                       */
   /*    maxCompositePoints    :: The maximum number of points in a         */
-  /*                             composite TrueType glyph.  See also the   */
-  /*                             structure element `maxPoints'.            */
+  /*                             composite TrueType glyph.  See also       */
+  /*                             `maxPoints'.                              */
   /*                                                                       */
   /*    maxCompositeContours  :: The maximum number of contours in a       */
-  /*                             composite TrueType glyph.  See also the   */
-  /*                             structure element `maxContours'.          */
+  /*                             composite TrueType glyph.  See also       */
+  /*                             `maxContours'.                            */
   /*                                                                       */
   /*    maxZones              :: The maximum number of zones used for      */
   /*                             glyph hinting.                            */
@@ -575,8 +591,9 @@
   /*    FT_Sfnt_Tag                                                        */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    An enumeration used to specify the index of an SFNT table.         */
-  /*    Used in the @FT_Get_Sfnt_Table API function.                       */
+  /*    An enumeration to specify indices of SFNT tables loaded and parsed */
+  /*    by FreeType during initialization of an SFNT font.  Used in the    */
+  /*    @FT_Get_Sfnt_Table API function.                                   */
   /*                                                                       */
   /* <Values>                                                              */
   /*    FT_SFNT_HEAD :: To access the font's @TT_Header structure.         */
@@ -587,7 +604,7 @@
   /*                                                                       */
   /*    FT_SFNT_HHEA :: To access the font's @TT_HoriHeader structure.     */
   /*                                                                       */
-  /*    FT_SFNT_VHEA :: To access the font's @TT_VertHeader struture.      */
+  /*    FT_SFNT_VHEA :: To access the font's @TT_VertHeader structure.     */
   /*                                                                       */
   /*    FT_SFNT_POST :: To access the font's @TT_Postscript structure.     */
   /*                                                                       */
@@ -624,7 +641,7 @@
   /*    FT_Get_Sfnt_Table                                                  */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return a pointer to a given SFNT table within a face.              */
+  /*    Return a pointer to a given SFNT table stored within a face.       */
   /*                                                                       */
   /* <Input>                                                               */
   /*    face :: A handle to the source.                                    */
@@ -632,7 +649,7 @@
   /*    tag  :: The index of the SFNT table.                               */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    A type-less pointer to the table.  This will be~0 in case of       */
+  /*    A type-less pointer to the table.  This will be NULL in case of    */
   /*    error, or if the corresponding table was not found *OR* loaded     */
   /*    from the file.                                                     */
   /*                                                                       */
@@ -661,70 +678,70 @@
                      FT_Sfnt_Tag  tag );
 
 
- /**************************************************************************
-  *
-  * @function:
-  *   FT_Load_Sfnt_Table
-  *
-  * @description:
-  *   Load any font table into client memory.
-  *
-  * @input:
-  *   face ::
-  *     A handle to the source face.
-  *
-  *   tag ::
-  *     The four-byte tag of the table to load.  Use the value~0 if you want
-  *     to access the whole font file.  Otherwise, you can use one of the
-  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
-  *     one with @FT_MAKE_TAG.
-  *
-  *   offset ::
-  *     The starting offset in the table (or file if tag == 0).
-  *
-  * @output:
-  *   buffer ::
-  *     The target buffer address.  The client must ensure that the memory
-  *     array is big enough to hold the data.
-  *
-  * @inout:
-  *   length ::
-  *     If the `length' parameter is NULL, then try to load the whole table.
-  *     Return an error code if it fails.
-  *
-  *     Else, if `*length' is~0, exit immediately while returning the
-  *     table's (or file) full size in it.
-  *
-  *     Else the number of bytes to read from the table or file, from the
-  *     starting offset.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   If you need to determine the table's length you should first call this
-  *   function with `*length' set to~0, as in the following example:
-  *
-  *     {
-  *       FT_ULong  length = 0;
-  *
-  *
-  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
-  *       if ( error ) { ... table does not exist ... }
-  *
-  *       buffer = malloc( length );
-  *       if ( buffer == NULL ) { ... not enough memory ... }
-  *
-  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
-  *       if ( error ) { ... could not load table ... }
-  *     }
-  *
-  *   Note that structures like @TT_Header or @TT_OS2 can't be used with
-  *   this function; they are limited to @FT_Get_Sfnt_Table.  Reason is that
-  *   those structures depend on the processor architecture, with varying
-  *   size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian).
-  *
-  */
+  /**************************************************************************
+   *
+   * @function:
+   *   FT_Load_Sfnt_Table
+   *
+   * @description:
+   *   Load any SFNT font table into client memory.
+   *
+   * @input:
+   *   face ::
+   *     A handle to the source face.
+   *
+   *   tag ::
+   *     The four-byte tag of the table to load.  Use value~0 if you want
+   *     to access the whole font file.  Otherwise, you can use one of the
+   *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+   *     one with @FT_MAKE_TAG.
+   *
+   *   offset ::
+   *     The starting offset in the table (or file if tag~==~0).
+   *
+   * @output:
+   *   buffer ::
+   *     The target buffer address.  The client must ensure that the memory
+   *     array is big enough to hold the data.
+   *
+   * @inout:
+   *   length ::
+   *     If the `length' parameter is NULL, try to load the whole table.
+   *     Return an error code if it fails.
+   *
+   *     Else, if `*length' is~0, exit immediately while returning the
+   *     table's (or file) full size in it.
+   *
+   *     Else the number of bytes to read from the table or file, from the
+   *     starting offset.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If you need to determine the table's length you should first call this
+   *   function with `*length' set to~0, as in the following example:
+   *
+   *     {
+   *       FT_ULong  length = 0;
+   *
+   *
+   *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+   *       if ( error ) { ... table does not exist ... }
+   *
+   *       buffer = malloc( length );
+   *       if ( buffer == NULL ) { ... not enough memory ... }
+   *
+   *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+   *       if ( error ) { ... could not load table ... }
+   *     }
+   *
+   *   Note that structures like @TT_Header or @TT_OS2 can't be used with
+   *   this function; they are limited to @FT_Get_Sfnt_Table.  Reason is that
+   *   those structures depend on the processor architecture, with varying
+   *   size (e.g. 32bit vs. 64bit) or order (big endian vs. little endian).
+   *
+   */
   FT_EXPORT( FT_Error )
   FT_Load_Sfnt_Table( FT_Face    face,
                       FT_ULong   tag,
@@ -733,41 +750,41 @@
                       FT_ULong*  length );
 
 
- /**************************************************************************
-  *
-  * @function:
-  *   FT_Sfnt_Table_Info
-  *
-  * @description:
-  *   Return information on an SFNT table.
-  *
-  * @input:
-  *   face ::
-  *     A handle to the source face.
-  *
-  *   table_index ::
-  *     The index of an SFNT table.  The function returns
-  *     FT_Err_Table_Missing for an invalid value.
-  *
-  * @inout:
-  *   tag ::
-  *     The name tag of the SFNT table.  If the value is NULL, `table_index'
-  *     is ignored, and `length' returns the number of SFNT tables in the
-  *     font.
-  *
-  * @output:
-  *   length ::
-  *     The length of the SFNT table (or the number of SFNT tables, depending
-  *     on `tag').
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   While parsing fonts, FreeType handles SFNT tables with length zero as
-  *   missing.
-  *
-  */
+  /**************************************************************************
+   *
+   * @function:
+   *   FT_Sfnt_Table_Info
+   *
+   * @description:
+   *   Return information on an SFNT table.
+   *
+   * @input:
+   *   face ::
+   *     A handle to the source face.
+   *
+   *   table_index ::
+   *     The index of an SFNT table.  The function returns
+   *     FT_Err_Table_Missing for an invalid value.
+   *
+   * @inout:
+   *   tag ::
+   *     The name tag of the SFNT table.  If the value is NULL, `table_index'
+   *     is ignored, and `length' returns the number of SFNT tables in the
+   *     font.
+   *
+   * @output:
+   *   length ::
+   *     The length of the SFNT table (or the number of SFNT tables, depending
+   *     on `tag').
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   While parsing fonts, FreeType handles SFNT tables with length zero as
+   *   missing.
+   *
+   */
   FT_EXPORT( FT_Error )
   FT_Sfnt_Table_Info( FT_Face    face,
                       FT_UInt    table_index,
@@ -781,16 +798,16 @@
   /*    FT_Get_CMap_Language_ID                                            */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */
-  /*    language ID values are in `ttnameid.h'.                            */
+  /*    Return cmap language ID as specified in the OpenType standard.     */
+  /*    Definitions of language ID values are in file @FT_TRUETYPE_IDS_H.  */
   /*                                                                       */
   /* <Input>                                                               */
   /*    charmap ::                                                         */
   /*      The target charmap.                                              */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */
-  /*    TrueType/sfnt face, just return~0 as the default value.            */
+  /*    The language ID of `charmap'.  If `charmap' doesn't belong to an   */
+  /*    SFNT face, just return~0 as the default value.                     */
   /*                                                                       */
   /*    For a format~14 cmap (to access Unicode IVS), the return value is  */
   /*    0xFFFFFFFF.                                                        */
@@ -805,15 +822,15 @@
   /*    FT_Get_CMap_Format                                                 */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    Return TrueType/sfnt specific cmap format.                         */
+  /*    Return the format of an SFNT `cmap' table.                         */
   /*                                                                       */
   /* <Input>                                                               */
   /*    charmap ::                                                         */
   /*      The target charmap.                                              */
   /*                                                                       */
   /* <Return>                                                              */
-  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */
-  /*    TrueType/sfnt face, return -1.                                     */
+  /*    The format of `charmap'.  If `charmap' doesn't belong to an SFNT   */
+  /*    face, return -1.                                                   */
   /*                                                                       */
   FT_EXPORT( FT_Long )
   FT_Get_CMap_Format( FT_CharMap  charmap );
@@ -823,7 +840,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTTABLES_H__ */
+#endif /* TTTABLES_H_ */
 
 
 /* END */
diff --git a/include/tttags.h b/include/freetype/tttags.h
similarity index 89%
rename from include/tttags.h
rename to include/freetype/tttags.h
index 3836c7b..e5cee68 100644
--- a/include/tttags.h
+++ b/include/freetype/tttags.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Tags for TrueType and OpenType tables (specification only).          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTAGS_H__
-#define __TTAGS_H__
+#ifndef TTAGS_H_
+#define TTAGS_H_
 
 
 #include <ft2build.h>
@@ -43,6 +43,7 @@
 #define TTAG_CBDT  FT_MAKE_TAG( 'C', 'B', 'D', 'T' )
 #define TTAG_CBLC  FT_MAKE_TAG( 'C', 'B', 'L', 'C' )
 #define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CFF2  FT_MAKE_TAG( 'C', 'F', 'F', '2' )
 #define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
 #define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
 #define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
@@ -61,6 +62,7 @@
 #define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
 #define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
 #define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_HVAR  FT_MAKE_TAG( 'H', 'V', 'A', 'R' )
 #define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
 #define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
 #define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
@@ -79,6 +81,7 @@
 #define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
 #define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )
 #define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_MVAR  FT_MAKE_TAG( 'M', 'V', 'A', 'R' )
 #define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
 #define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
 #define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )
@@ -100,12 +103,19 @@
 #define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
 #define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
 #define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+#define TTAG_VVAR  FT_MAKE_TAG( 'V', 'V', 'A', 'R' )
 #define TTAG_wOFF  FT_MAKE_TAG( 'w', 'O', 'F', 'F' )
 
+/* used by "Keyboard.dfont" on legacy Mac OS X */
+#define TTAG_0xA5kbd  FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' )
+
+/* used by "LastResort.dfont" on legacy Mac OS X */
+#define TTAG_0xA5lst  FT_MAKE_TAG( 0xA5, 'l', 's', 't' )
+
 
 FT_END_HEADER
 
-#endif /* __TTAGS_H__ */
+#endif /* TTAGS_H_ */
 
 
 /* END */
diff --git a/include/ft2build.h b/include/ft2build.h
index 09c19d4..e7ce99b 100644
--- a/include/ft2build.h
+++ b/include/ft2build.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType 2 build and setup macros.                                   */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,12 +31,12 @@
   /*************************************************************************/
 
 
-#ifndef __FT2BUILD_H__
-#define __FT2BUILD_H__
+#ifndef FT2BUILD_H_
+#define FT2BUILD_H_
 
-#include <config/ftheader.h>
+#include <freetype/config/ftheader.h>
 
-#endif /* __FT2BUILD_H__ */
+#endif /* FT2BUILD_H_ */
 
 
 /* END */
diff --git a/include/ftautoh.h b/include/ftautoh.h
deleted file mode 100644
index cf7b76f..0000000
--- a/include/ftautoh.h
+++ /dev/null
@@ -1,450 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftautoh.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the auto-hinter (specification only).   */
-/*                                                                         */
-/*  Copyright 2012-2015 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:
-   *   auto_hinter
-   *
-   * @title:
-   *   The auto-hinter
-   *
-   * @abstract:
-   *   Controlling the auto-hinting module.
-   *
-   * @description:
-   *   While FreeType's auto-hinter doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  The following lists the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   Note that the auto-hinter's module name is `autofitter' for
-   *   historical reasons.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   glyph-to-script-map
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The auto-hinter provides various script modules to hint glyphs.
-   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
-   *   auto-hinted, the Unicode character map of the font gets examined, and
-   *   the script is then determined based on Unicode character ranges, see
-   *   below.
-   *
-   *   OpenType fonts, however, often provide much more glyphs than
-   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
-   *   to be controlled by so-called `features'.  Handling OpenType features
-   *   can be quite complicated and thus needs a separate library on top of
-   *   FreeType.
-   *
-   *   The mapping between glyph indices and scripts (in the auto-hinter
-   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
-   *   array with `num_glyphs' elements, as found in the font's @FT_Face
-   *   structure.  The `glyph-to-script-map' property returns a pointer to
-   *   this array, which can be modified as needed.  Note that the
-   *   modification should happen before the first glyph gets processed by
-   *   the auto-hinter so that the global analysis of the font shapes
-   *   actually uses the modified mapping.
-   *
-   *   The following example code demonstrates how to access it (omitting
-   *   the error handling).
-   *
-   *   {
-   *     FT_Library                library;
-   *     FT_Face                   face;
-   *     FT_Prop_GlyphToScriptMap  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *
-   *     prop.face = face;
-   *
-   *     FT_Property_Get( library, "autofitter",
-   *                               "glyph-to-script-map", &prop );
-   *
-   *     // adjust `prop.map' as needed right here
-   *
-   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
-   *   }
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_AUTOHINTER_SCRIPT_XXX
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   A list of constants used for the @glyph-to-script-map property to
-   *   specify the script submodule the auto-hinter should use for hinting a
-   *   particular glyph.
-   *
-   * @values:
-   *   FT_AUTOHINTER_SCRIPT_NONE ::
-   *     Don't auto-hint this glyph.
-   *
-   *   FT_AUTOHINTER_SCRIPT_LATIN ::
-   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
-   *     very broad term, including Cyrillic and Greek also since characters
-   *     from those scripts share the same design constraints.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0020 - U+007F  // Basic Latin (no control characters)
-   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
-   *       U+0100 - U+017F  // Latin Extended-A
-   *       U+0180 - U+024F  // Latin Extended-B
-   *       U+0250 - U+02AF  // IPA Extensions
-   *       U+02B0 - U+02FF  // Spacing Modifier Letters
-   *       U+0300 - U+036F  // Combining Diacritical Marks
-   *       U+0370 - U+03FF  // Greek and Coptic
-   *       U+0400 - U+04FF  // Cyrillic
-   *       U+0500 - U+052F  // Cyrillic Supplement
-   *       U+1D00 - U+1D7F  // Phonetic Extensions
-   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
-   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
-   *       U+1E00 - U+1EFF  // Latin Extended Additional
-   *       U+1F00 - U+1FFF  // Greek Extended
-   *       U+2000 - U+206F  // General Punctuation
-   *       U+2070 - U+209F  // Superscripts and Subscripts
-   *       U+20A0 - U+20CF  // Currency Symbols
-   *       U+2150 - U+218F  // Number Forms
-   *       U+2460 - U+24FF  // Enclosed Alphanumerics
-   *       U+2C60 - U+2C7F  // Latin Extended-C
-   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
-   *       U+2E00 - U+2E7F  // Supplemental Punctuation
-   *       U+A640 - U+A69F  // Cyrillic Extended-B
-   *       U+A720 - U+A7FF  // Latin Extended-D
-   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
-   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
-   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_CJK ::
-   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
-   *     Vietnamese, and some other scripts.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+1100 - U+11FF  // Hangul Jamo
-   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
-   *       U+2F00 - U+2FDF  // Kangxi Radicals
-   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
-   *       U+3000 - U+303F  // CJK Symbols and Punctuation
-   *       U+3040 - U+309F  // Hiragana
-   *       U+30A0 - U+30FF  // Katakana
-   *       U+3100 - U+312F  // Bopomofo
-   *       U+3130 - U+318F  // Hangul Compatibility Jamo
-   *       U+3190 - U+319F  // Kanbun
-   *       U+31A0 - U+31BF  // Bopomofo Extended
-   *       U+31C0 - U+31EF  // CJK Strokes
-   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
-   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
-   *       U+3300 - U+33FF  // CJK Compatibility
-   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
-   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
-   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
-   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
-   *       U+AC00 - U+D7AF  // Hangul Syllables
-   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
-   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
-   *       U+FE10 - U+FE1F  // Vertical forms
-   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
-   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
-   *      U+1B000 - U+1B0FF // Kana Supplement
-   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
-   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
-   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
-   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
-   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
-   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_INDIC ::
-   *     Apply the indic auto-hinter, covering all major scripts from the
-   *     Indian sub-continent and some other related scripts like Thai, Lao,
-   *     or Tibetan.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0900 - U+0DFF  // Indic Range
-   *       U+0F00 - U+0FFF  // Tibetan
-   *       U+1900 - U+194F  // Limbu
-   *       U+1B80 - U+1BBF  // Sundanese
-   *       U+1C80 - U+1CDF  // Meetei Mayak
-   *       U+A800 - U+A82F  // Syloti Nagri
-   *      U+11800 - U+118DF // Sharada
-   *     }
-   *
-   *     Note that currently Indic support is rudimentary only, missing blue
-   *     zone support.
-   *
-   */
-#define FT_AUTOHINTER_SCRIPT_NONE   0
-#define FT_AUTOHINTER_SCRIPT_LATIN  1
-#define FT_AUTOHINTER_SCRIPT_CJK    2
-#define FT_AUTOHINTER_SCRIPT_INDIC  3
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_GlyphToScriptMap
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The data exchange structure for the @glyph-to-script-map property.
-   *
-   */
-  typedef struct  FT_Prop_GlyphToScriptMap_
-  {
-    FT_Face   face;
-    FT_Byte*  map;
-
-  } FT_Prop_GlyphToScriptMap;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   fallback-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If no auto-hinter script module can be assigned to a glyph, a
-   *   fallback script gets assigned to it (see also the
-   *   @glyph-to-script-map property).  By default, this is
-   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
-   *   this fallback value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "fallback-script", &fallback_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   fallback script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the fallback script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   default-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
-   *   the HarfBuzz library access OpenType features for getting better
-   *   glyph coverages, this property sets the (auto-fitter) script to be
-   *   used for the default (OpenType) script data of a font's GSUB table.
-   *   Features for the default script are intended for all scripts not
-   *   explicitly handled in GSUB; an example is a `dlig' feature,
-   *   containing the combination of the characters `T', `E', and `L' to
-   *   form a `TEL' ligature.
-   *
-   *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
-   *   `default-script' property, this default value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "default-script", &default_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   default script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the default script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   increase-x-height
-   *
-   * @description:
-   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
-   *   up the font's x~height much more often than normally.  If the value
-   *   is set to~0, which is the default, this feature is switched off.  Use
-   *   this property to improve the legibility of small font sizes if
-   *   necessary.
-   *
-   *   {
-   *     FT_Library               library;
-   *     FT_Face                  face;
-   *     FT_Prop_IncreaseXHeight  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
-   *
-   *     prop.face  = face;
-   *     prop.limit = 14;
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "increase-x-height", &prop );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   Set this value right after calling @FT_Set_Char_Size, but before
-   *   loading any glyph (using the auto-hinter).
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_IncreaseXHeight
-   *
-   * @description:
-   *   The data exchange structure for the @increase-x-height property.
-   *
-   */
-  typedef struct  FT_Prop_IncreaseXHeight_
-  {
-    FT_Face  face;
-    FT_UInt  limit;
-
-  } FT_Prop_IncreaseXHeight;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   warping
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
-   *   activate the warp hinting code in the auto-hinter, this property
-   *   switches warping on and off.
-   *
-   *   Warping only works in `light' auto-hinting mode.  The idea of the
-   *   code is to slightly scale and shift a glyph along the non-hinted
-   *   dimension (which is usually the horizontal axis) so that as much of
-   *   its segments are aligned (more or less) to the grid.  To find out a
-   *   glyph's optimal scaling and shifting value, various parameter
-   *   combinations are tried and scored.
-   *
-   *   By default, warping is off.  The example below shows how to switch on
-   *   warping (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     warping = 1;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "warping", &warping );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   The warping code can also change advance widths.  Have a look at the
-   *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
-   *   for details on improving inter-glyph distances while rendering.
-   *
-   *   Since warping is a global property of the auto-hinter it is best to
-   *   change its value before rendering any face.  Otherwise, you should
-   *   reload all faces that get auto-hinted in `light' hinting mode.
-   *
-   */
-
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTAUTOH_H__ */
-
-
-/* END */
diff --git a/include/ftcffdrv.h b/include/ftcffdrv.h
deleted file mode 100644
index 6c8e416..0000000
--- a/include/ftcffdrv.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcffdrv.h                                                             */
-/*                                                                         */
-/*    FreeType API for controlling the CFF driver (specification only).    */
-/*                                                                         */
-/*  Copyright 2013-2015 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 __FTCFFDRV_H__
-#define __FTCFFDRV_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:
-   *   cff_driver
-   *
-   * @title:
-   *   The CFF driver
-   *
-   * @abstract:
-   *   Controlling the CFF driver module.
-   *
-   * @description:
-   *   While FreeType's CFF driver doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  The list below gives the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   The CFF driver's module name is `cff'.
-   *
-   *   *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine*
-   *
-   *   The rasterizer is positioning horizontal features (e.g., ascender
-   *   height & x-height, or crossbars) on the pixel grid and minimizing the
-   *   amount of antialiasing applied to them, while placing vertical
-   *   features (vertical stems) on the pixel grid without hinting, thus
-   *   representing the stem position and weight accurately.  Sometimes the
-   *   vertical stems may be only partially black.  In this context,
-   *   `antialiasing' means that stems are not positioned exactly on pixel
-   *   borders, causing a fuzzy appearance.
-   *
-   *   There are two principles behind this approach.
-   *
-   *   1) No hinting in the horizontal direction: Unlike `superhinted'
-   *   TrueType, which changes glyph widths to accommodate regular
-   *   inter-glyph spacing, Adobe's approach is `faithful to the design' in
-   *   representing both the glyph width and the inter-glyph spacing
-   *   designed for the font.  This makes the screen display as close as it
-   *   can be to the result one would get with infinite resolution, while
-   *   preserving what is considered the key characteristics of each glyph.
-   *   Note that the distances between unhinted and grid-fitted positions at
-   *   small sizes are comparable to kerning values and thus would be
-   *   noticeable (and distracting) while reading if hinting were applied.
-   *
-   *   One of the reasons to not hint horizontally is antialiasing for LCD
-   *   screens: The pixel geometry of modern displays supplies three
-   *   vertical sub-pixels as the eye moves horizontally across each visible
-   *   pixel.  On devices where we can be certain this characteristic is
-   *   present a rasterizer can take advantage of the sub-pixels to add
-   *   increments of weight.  In Western writing systems this turns out to
-   *   be the more critical direction anyway; the weights and spacing of
-   *   vertical stems (see above) are central to Armenian, Cyrillic, Greek,
-   *   and Latin type designs.  Even when the rasterizer uses greyscale
-   *   antialiasing instead of color (a necessary compromise when one
-   *   doesn't know the screen characteristics), the unhinted vertical
-   *   features preserve the design's weight and spacing much better than
-   *   aliased type would.
-   *
-   *   2) Aligment in the vertical direction: Weights and spacing along the
-   *   y~axis are less critical; what is much more important is the visual
-   *   alignment of related features (like cap-height and x-height).  The
-   *   sense of alignment for these is enhanced by the sharpness of grid-fit
-   *   edges, while the cruder vertical resolution (full pixels instead of
-   *   1/3 pixels) is less of a problem.
-   *
-   *   On the technical side, horizontal alignment zones for ascender,
-   *   x-height, and other important height values (traditionally called
-   *   `blue zones') as defined in the font are positioned independently,
-   *   each being rounded to the nearest pixel edge, taking care of
-   *   overshoot suppression at small sizes, stem darkening, and scaling.
-   *
-   *   Hstems (this is, hint values defined in the font to help align
-   *   horizontal features) that fall within a blue zone are said to be
-   *   `captured' and are aligned to that zone.  Uncaptured stems are moved
-   *   in one of four ways, top edge up or down, bottom edge up or down.
-   *   Unless there are conflicting hstems, the smallest movement is taken
-   *   to minimize distortion.
-   *
-   * @order:
-   *   hinting-engine
-   *   no-stem-darkening
-   *   darkening-parameters
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   hinting-engine
-   *
-   * @description:
-   *   Thanks to Adobe, which contributed a new hinting (and parsing)
-   *   engine, an application can select between `freetype' and `adobe' if
-   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
-   *   macro isn't defined, `hinting-engine' does nothing.
-   *
-   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
-   *   defined, and `adobe' otherwise.
-   *
-   *   The following example code demonstrates how to select Adobe's hinting
-   *   engine (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "hinting-engine", &hinting_engine );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_CFF_HINTING_XXX
-   *
-   * @description:
-   *   A list of constants used for the @hinting-engine property to select
-   *   the hinting engine for CFF fonts.
-   *
-   * @values:
-   *   FT_CFF_HINTING_FREETYPE ::
-   *     Use the old FreeType hinting engine.
-   *
-   *   FT_CFF_HINTING_ADOBE ::
-   *     Use the hinting engine contributed by Adobe.
-   *
-   */
-#define FT_CFF_HINTING_FREETYPE  0
-#define FT_CFF_HINTING_ADOBE     1
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   no-stem-darkening
-   *
-   * @description:
-   *   By default, the Adobe CFF engine darkens stems at smaller sizes,
-   *   regardless of hinting, to enhance contrast.  This feature requires
-   *   a rendering system with proper gamma correction.  Setting this
-   *   property, stem darkening gets switched off.
-   *
-   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     no_stem_darkening = TRUE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "no-stem-darkening", &no_stem_darkening );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   darkening-parameters
-   *
-   * @description:
-   *   By default, the Adobe CFF engine darkens stems as follows (if the
-   *   `no-stem-darkening' property isn't set):
-   *
-   *   {
-   *     stem width <= 0.5px:   darkening amount = 0.4px
-   *     stem width  = 1px:     darkening amount = 0.275px
-   *     stem width  = 1.667px: darkening amount = 0.275px
-   *     stem width >= 2.333px: darkening amount = 0px
-   *   }
-   *
-   *   and piecewise linear in-between.  At configuration time, these four
-   *   control points can be set with the macro
-   *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'.  At runtime, the control
-   *   points can be changed using the `darkening-parameters' property, as
-   *   the following example demonstrates.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
-   *                                      1000, 200,   // x2, y2
-   *                                      1500, 100,   // x3, y3
-   *                                      2000,   0 }; // x4, y4
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "darkening-parameters", darken_params );
-   *   }
-   *
-   *   The x~values give the stem width, and the y~values the darkening
-   *   amount.  The unit is 1000th of pixels.  All coordinate values must be
-   *   positive; the x~values must be monotonically increasing; the
-   *   y~values must be monotonically decreasing and smaller than or
-   *   equal to 500 (corresponding to half a pixel); the slope of each
-   *   linear piece must be shallower than -1 (e.g., -.4).
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __FTCFFDRV_H__ */
-
-
-/* END */
diff --git a/include/fterrors.h b/include/fterrors.h
deleted file mode 100644
index 376bee6..0000000
--- a/include/fterrors.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fterrors.h                                                             */
-/*                                                                         */
-/*    FreeType error code handling (specification).                        */
-/*                                                                         */
-/*  Copyright 1996-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This special header file is used to define the handling of FT2        */
-  /* enumeration constants.  It can also be used to generate error message */
-  /* strings with a small macro trick explained below.                     */
-  /*                                                                       */
-  /* I - Error Formats                                                     */
-  /* -----------------                                                     */
-  /*                                                                       */
-  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */
-  /*   defined in ftoption.h in order to make the higher byte indicate     */
-  /*   the module where the error has happened (this is not compatible     */
-  /*   with standard builds of FreeType 2).  See the file `ftmoderr.h' for */
-  /*   more details.                                                       */
-  /*                                                                       */
-  /*                                                                       */
-  /* II - Error Message strings                                            */
-  /* --------------------------                                            */
-  /*                                                                       */
-  /*   The error definitions below are made through special macros that    */
-  /*   allow client applications to build a table of error message strings */
-  /*   if they need it.  The strings are not included in a normal build of */
-  /*   FreeType 2 to save space (most client applications do not use       */
-  /*   them).                                                              */
-  /*                                                                       */
-  /*   To do so, you have to define the following macros before including  */
-  /*   this file:                                                          */
-  /*                                                                       */
-  /*   FT_ERROR_START_LIST ::                                              */
-  /*     This macro is called before anything else to define the start of  */
-  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */
-  /*     (see below).                                                      */
-  /*                                                                       */
-  /*   FT_ERROR_DEF( e, v, s ) ::                                          */
-  /*     This macro is called to define one single error.                  */
-  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */
-  /*     `v' is the error numerical value.                                 */
-  /*     `s' is the corresponding error string.                            */
-  /*                                                                       */
-  /*   FT_ERROR_END_LIST ::                                                */
-  /*     This macro ends the list.                                         */
-  /*                                                                       */
-  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */
-  /*   this file.                                                          */
-  /*                                                                       */
-  /*   Here is a simple example:                                           */
-  /*                                                                       */
-  /*     {                                                                 */
-  /*       #undef __FTERRORS_H__                                           */
-  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */
-  /*       #define FT_ERROR_START_LIST     {                               */
-  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */
-  /*                                                                       */
-  /*       const struct                                                    */
-  /*       {                                                               */
-  /*         int          err_code;                                        */
-  /*         const char*  err_msg;                                         */
-  /*       } ft_errors[] =                                                 */
-  /*                                                                       */
-  /*       #include FT_ERRORS_H                                            */
-  /*     }                                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef __FTERRORS_H__
-#define __FTERRORS_H__
-
-
-  /* include module base error codes */
-#include FT_MODULE_ERRORS_H
-
-
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****                       SETUP MACROS                      *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
-
-
-#undef  FT_NEED_EXTERN_C
-
-
-  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
-  /* By default, we use `FT_Err_'.                            */
-  /*                                                          */
-#ifndef FT_ERR_PREFIX
-#define FT_ERR_PREFIX  FT_Err_
-#endif
-
-
-  /* FT_ERR_BASE is used as the base for module-specific errors. */
-  /*                                                             */
-#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
-
-#ifndef FT_ERR_BASE
-#define FT_ERR_BASE  FT_Mod_Err_Base
-#endif
-
-#else
-
-#undef FT_ERR_BASE
-#define FT_ERR_BASE  0
-
-#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
-
-
-  /* If FT_ERRORDEF is not defined, we need to define a simple */
-  /* enumeration type.                                         */
-  /*                                                           */
-#ifndef FT_ERRORDEF
-
-#define FT_ERRORDEF( e, v, s )  e = v,
-#define FT_ERROR_START_LIST     enum {
-#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
-
-#ifdef __cplusplus
-#define FT_NEED_EXTERN_C
-  extern "C" {
-#endif
-
-#endif /* !FT_ERRORDEF */
-
-
-  /* this macro is used to define an error */
-#define FT_ERRORDEF_( e, v, s )                                             \
-          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
-
-  /* this is only used for <module>_Err_Ok, which must be 0! */
-#define FT_NOERRORDEF_( e, v, s )                             \
-          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
-
-
-#ifdef FT_ERROR_START_LIST
-  FT_ERROR_START_LIST
-#endif
-
-
-  /* now include the error codes */
-#include FT_ERROR_DEFINITIONS_H
-
-
-#ifdef FT_ERROR_END_LIST
-  FT_ERROR_END_LIST
-#endif
-
-
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****                      SIMPLE CLEANUP                     *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
-
-#ifdef FT_NEED_EXTERN_C
-  }
-#endif
-
-#undef FT_ERROR_START_LIST
-#undef FT_ERROR_END_LIST
-
-#undef FT_ERRORDEF
-#undef FT_ERRORDEF_
-#undef FT_NOERRORDEF_
-
-#undef FT_NEED_EXTERN_C
-#undef FT_ERR_BASE
-
-  /* FT_ERR_PREFIX is needed internally */
-#ifndef FT2_BUILD_LIBRARY
-#undef FT_ERR_PREFIX
-#endif
-
-#endif /* __FTERRORS_H__ */
-
-
-/* END */
diff --git a/include/ftlcdfil.h b/include/ftlcdfil.h
deleted file mode 100644
index 4cd999a..0000000
--- a/include/ftlcdfil.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlcdfil.h                                                             */
-/*                                                                         */
-/*    FreeType API for color filtering of subpixel bitmap glyphs           */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 2006-2015 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 __FT_LCD_FILTER_H__
-#define __FT_LCD_FILTER_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:
-   *   lcd_filtering
-   *
-   * @title:
-   *   LCD Filtering
-   *
-   * @abstract:
-   *   Reduce color fringes of LCD-optimized bitmaps.
-   *
-   * @description:
-   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass
-   *   filter, which is then applied to LCD-optimized bitmaps generated
-   *   through @FT_Render_Glyph.  This is useful to reduce color fringes
-   *   that would occur with unfiltered rendering.
-   *
-   *   Note that no filter is active by default, and that this function is
-   *   *not* implemented in default builds of the library.  You need to
-   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
-   *   in order to activate it.
-   *
-   *   FreeType generates alpha coverage maps, which are linear by nature.
-   *   For instance, the value 0x80 in bitmap representation means that
-   *   (within numerical precision) 0x80/0xFF fraction of that pixel is
-   *   covered by the glyph's outline.  The blending function for placing
-   *   text over a background is
-   *
-   *   {
-   *     dst = alpha * src + (1 - alpha) * dst    ,
-   *   }
-   *
-   *   which is known as OVER.  However, when calculating the output of the
-   *   OVER operator, the source colors should first be transformed to a
-   *   linear color space, then alpha blended in that space, and transformed
-   *   back to the output color space.
-   *
-   *   When linear light blending is used, the default FIR5 filtering
-   *   weights (as given by FT_LCD_FILTER_DEFAULT) are no longer optimal, as
-   *   they have been designed for black on white rendering while lacking
-   *   gamma correction.  To preserve color neutrality, weights for a FIR5
-   *   filter should be chosen according to two free parameters `a' and `c',
-   *   and the FIR weights should be
-   *
-   *   {
-   *     [a - c, a + c, 2 * a, a + c, a - c]    .
-   *   }
-   *
-   *   This formula generates equal weights for all the color primaries
-   *   across the filter kernel, which makes it colorless.  One suggested
-   *   set of weights is
-   *
-   *   {
-   *     [0x10, 0x50, 0x60, 0x50, 0x10]    ,
-   *   }
-   *
-   *   where `a' has value 0x30 and `b' value 0x20.  The weights in filter
-   *   may have a sum larger than 0x100, which increases coloration slightly
-   *   but also improves contrast.
-   */
-
-
-  /****************************************************************************
-   *
-   * @enum:
-   *   FT_LcdFilter
-   *
-   * @description:
-   *   A list of values to identify various types of LCD filters.
-   *
-   * @values:
-   *   FT_LCD_FILTER_NONE ::
-   *     Do not perform filtering.  When used with subpixel rendering, this
-   *     results in sometimes severe color fringes.
-   *
-   *   FT_LCD_FILTER_DEFAULT ::
-   *     The default filter reduces color fringes considerably, at the cost
-   *     of a slight blurriness in the output.
-   *
-   *   FT_LCD_FILTER_LIGHT ::
-   *     The light filter is a variant that produces less blurriness at the
-   *     cost of slightly more color fringes than the default one.  It might
-   *     be better, depending on taste, your monitor, or your personal vision.
-   *
-   *   FT_LCD_FILTER_LEGACY ::
-   *     This filter corresponds to the original libXft color filter.  It
-   *     provides high contrast output but can exhibit really bad color
-   *     fringes if glyphs are not extremely well hinted to the pixel grid.
-   *     In other words, it only works well if the TrueType bytecode
-   *     interpreter is enabled *and* high-quality hinted fonts are used.
-   *
-   *     This filter is only provided for comparison purposes, and might be
-   *     disabled or stay unsupported in the future.
-   *
-   * @since:
-   *   2.3.0
-   */
-  typedef enum  FT_LcdFilter_
-  {
-    FT_LCD_FILTER_NONE    = 0,
-    FT_LCD_FILTER_DEFAULT = 1,
-    FT_LCD_FILTER_LIGHT   = 2,
-    FT_LCD_FILTER_LEGACY  = 16,
-
-    FT_LCD_FILTER_MAX   /* do not remove */
-
-  } FT_LcdFilter;
-
-
-  /**************************************************************************
-   *
-   * @func:
-   *   FT_Library_SetLcdFilter
-   *
-   * @description:
-   *   This function is used to apply color filtering to LCD decimated
-   *   bitmaps, like the ones used when calling @FT_Render_Glyph with
-   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
-   *
-   * @input:
-   *   library ::
-   *     A handle to the target library instance.
-   *
-   *   filter ::
-   *     The filter type.
-   *
-   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
-   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
-   *     well on most LCD screens.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   This feature is always disabled by default.  Clients must make an
-   *   explicit call to this function with a `filter' value other than
-   *   @FT_LCD_FILTER_NONE in order to enable it.
-   *
-   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
-   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
-   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
-   *   defined in your build of the library, which should correspond to all
-   *   default builds of FreeType.
-   *
-   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
-   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
-   *
-   *   It does _not_ affect the output of @FT_Outline_Render and
-   *   @FT_Outline_Get_Bitmap.
-   *
-   *   If this feature is activated, the dimensions of LCD glyph bitmaps are
-   *   either larger or taller than the dimensions of the corresponding
-   *   outline with regards to the pixel grid.  For example, for
-   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
-   *   up to 3~pixels to the right.
-   *
-   *   The bitmap offset values are adjusted correctly, so clients shouldn't
-   *   need to modify their layout and glyph positioning code when enabling
-   *   the filter.
-   *
-   * @since:
-   *   2.3.0
-   */
-  FT_EXPORT( FT_Error )
-  FT_Library_SetLcdFilter( FT_Library    library,
-                           FT_LcdFilter  filter );
-
-
-  /**************************************************************************
-   *
-   * @func:
-   *   FT_Library_SetLcdFilterWeights
-   *
-   * @description:
-   *   Use this function to override the filter weights selected by
-   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple
-   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
-   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
-   *   FT_LCD_FILTER_LEGACY.
-   *
-   * @input:
-   *   library ::
-   *     A handle to the target library instance.
-   *
-   *   weights ::
-   *     A pointer to an array; the function copies the first five bytes and
-   *     uses them to specify the filter weights.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
-   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
-   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
-   *   defined in your build of the library, which should correspond to all
-   *   default builds of FreeType.
-   *
-   *   This function must be called after @FT_Library_SetLcdFilter to have
-   *   any effect.
-   *
-   * @since:
-   *   2.4.0
-   */
-  FT_EXPORT( FT_Error )
-  FT_Library_SetLcdFilterWeights( FT_Library      library,
-                                  unsigned char  *weights );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FT_LCD_FILTER_H__ */
-
-
-/* END */
diff --git a/include/ftmm.h b/include/ftmm.h
deleted file mode 100644
index 6ef4798..0000000
--- a/include/ftmm.h
+++ /dev/null
@@ -1,379 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmm.h                                                                 */
-/*                                                                         */
-/*    FreeType Multiple Master font interface (specification).             */
-/*                                                                         */
-/*  Copyright 1996-2015 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 __FTMM_H__
-#define __FTMM_H__
-
-
-#include <ft2build.h>
-#include FT_TYPE1_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    multiple_masters                                                   */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Multiple Masters                                                   */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    How to manage Multiple Masters fonts.                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The following types and functions are used to manage Multiple      */
-  /*    Master fonts, i.e., the selection of specific design instances by  */
-  /*    setting design axis coordinates.                                   */
-  /*                                                                       */
-  /*    George Williams has extended this interface to make it work with   */
-  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */
-  /*    fonts.  Some of these routines only work with MM fonts, others     */
-  /*    will work with both types.  They are similar enough that a         */
-  /*    consistent interface makes sense.                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_MM_Axis                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to model a given axis in design space for  */
-  /*    Multiple Masters fonts.                                            */
-  /*                                                                       */
-  /*    This structure can't be used for GX var fonts.                     */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    name    :: The axis's name.                                        */
-  /*                                                                       */
-  /*    minimum :: The axis's minimum design coordinate.                   */
-  /*                                                                       */
-  /*    maximum :: The axis's maximum design coordinate.                   */
-  /*                                                                       */
-  typedef struct  FT_MM_Axis_
-  {
-    FT_String*  name;
-    FT_Long     minimum;
-    FT_Long     maximum;
-
-  } FT_MM_Axis;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Multi_Master                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model the axes and space of a Multiple Masters */
-  /*    font.                                                              */
-  /*                                                                       */
-  /*    This structure can't be used for GX var fonts.                     */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */
-  /*                                                                       */
-  /*    num_designs :: Number of designs; should be normally 2^num_axis    */
-  /*                   even though the Type~1 specification strangely      */
-  /*                   allows for intermediate designs to be present.      */
-  /*                   This number cannot exceed~16.                       */
-  /*                                                                       */
-  /*    axis        :: A table of axis descriptors.                        */
-  /*                                                                       */
-  typedef struct  FT_Multi_Master_
-  {
-    FT_UInt     num_axis;
-    FT_UInt     num_designs;
-    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
-
-  } FT_Multi_Master;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Var_Axis                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to model a given axis in design space for  */
-  /*    Multiple Masters and GX var fonts.                                 */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    name    :: The axis's name.                                        */
-  /*               Not always meaningful for GX.                           */
-  /*                                                                       */
-  /*    minimum :: The axis's minimum design coordinate.                   */
-  /*                                                                       */
-  /*    def     :: The axis's default design coordinate.                   */
-  /*               FreeType computes meaningful default values for MM; it  */
-  /*               is then an integer value, not in 16.16 format.          */
-  /*                                                                       */
-  /*    maximum :: The axis's maximum design coordinate.                   */
-  /*                                                                       */
-  /*    tag     :: The axis's tag (the GX equivalent to `name').           */
-  /*               FreeType provides default values for MM if possible.    */
-  /*                                                                       */
-  /*    strid   :: The entry in `name' table (another GX version of        */
-  /*               `name').                                                */
-  /*               Not meaningful for MM.                                  */
-  /*                                                                       */
-  typedef struct  FT_Var_Axis_
-  {
-    FT_String*  name;
-
-    FT_Fixed    minimum;
-    FT_Fixed    def;
-    FT_Fixed    maximum;
-
-    FT_ULong    tag;
-    FT_UInt     strid;
-
-  } FT_Var_Axis;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Var_Named_Style                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to model a named style in a GX var font.   */
-  /*                                                                       */
-  /*    This structure can't be used for MM fonts.                         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    coords :: The design coordinates for this style.                   */
-  /*              This is an array with one entry for each axis.           */
-  /*                                                                       */
-  /*    strid  :: The entry in `name' table identifying this style.        */
-  /*                                                                       */
-  typedef struct  FT_Var_Named_Style_
-  {
-    FT_Fixed*  coords;
-    FT_UInt    strid;
-
-  } FT_Var_Named_Style;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_MM_Var                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model the axes and space of a Multiple Masters */
-  /*    or GX var distortable font.                                        */
-  /*                                                                       */
-  /*    Some fields are specific to one format and not to the other.       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_axis        :: The number of axes.  The maximum value is~4 for */
-  /*                       MM; no limit in GX.                             */
-  /*                                                                       */
-  /*    num_designs     :: The number of designs; should be normally       */
-  /*                       2^num_axis for MM fonts.  Not meaningful for GX */
-  /*                       (where every glyph could have a different       */
-  /*                       number of designs).                             */
-  /*                                                                       */
-  /*    num_namedstyles :: The number of named styles; only meaningful for */
-  /*                       GX that allows certain design coordinates to    */
-  /*                       have a string ID (in the `name' table)          */
-  /*                       associated with them.  The font can tell the    */
-  /*                       user that, for example, Weight=1.5 is `Bold'.   */
-  /*                                                                       */
-  /*    axis            :: An axis descriptor table.                       */
-  /*                       GX fonts contain slightly more data than MM.    */
-  /*                                                                       */
-  /*    namedstyle      :: A named style table.                            */
-  /*                       Only meaningful with GX.                        */
-  /*                                                                       */
-  typedef struct  FT_MM_Var_
-  {
-    FT_UInt              num_axis;
-    FT_UInt              num_designs;
-    FT_UInt              num_namedstyles;
-    FT_Var_Axis*         axis;
-    FT_Var_Named_Style*  namedstyle;
-
-  } FT_MM_Var;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Multi_Master                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the Multiple Master descriptor of a given font.           */
-  /*                                                                       */
-  /*    This function can't be used with GX fonts.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face    :: A handle to the source face.                            */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    amaster :: The Multiple Masters descriptor.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Multi_Master( FT_Face           face,
-                       FT_Multi_Master  *amaster );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_MM_Var                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face    :: A handle to the source face.                            */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    amaster :: The Multiple Masters/GX var descriptor.                 */
-  /*               Allocates a data structure, which the user must free.   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_MM_Var( FT_Face      face,
-                 FT_MM_Var*  *amaster );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_MM_Design_Coordinates                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    For Multiple Masters fonts, choose an interpolated font design     */
-  /*    through design coordinates.                                        */
-  /*                                                                       */
-  /*    This function can't be used with GX fonts.                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: A handle to the source face.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    num_coords :: The number of available design coordinates.  If it   */
-  /*                  is larger than the number of axes, ignore the excess */
-  /*                  values.  If it is smaller than the number of axes,   */
-  /*                  use default values for the remaining axes.           */
-  /*                                                                       */
-  /*    coords     :: An array of design coordinates.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_MM_Design_Coordinates( FT_Face   face,
-                                FT_UInt   num_coords,
-                                FT_Long*  coords );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Var_Design_Coordinates                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */
-  /*    design through design coordinates.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: A handle to the source face.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    num_coords :: The number of available design coordinates.  If it   */
-  /*                  is larger than the number of axes, ignore the excess */
-  /*                  values.  If it is smaller than the number of axes,   */
-  /*                  use default values for the remaining axes.           */
-  /*                                                                       */
-  /*    coords     :: An array of design coordinates.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_Var_Design_Coordinates( FT_Face    face,
-                                 FT_UInt    num_coords,
-                                 FT_Fixed*  coords );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_MM_Blend_Coordinates                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    For Multiple Masters and GX var fonts, choose an interpolated font */
-  /*    design through normalized blend coordinates.                       */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: A handle to the source face.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    num_coords :: The number of available design coordinates.  If it   */
-  /*                  is larger than the number of axes, ignore the excess */
-  /*                  values.  If it is smaller than the number of axes,   */
-  /*                  use default values for the remaining axes.           */
-  /*                                                                       */
-  /*    coords     :: The design coordinates array (each element must be   */
-  /*                  between 0 and 1.0).                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_MM_Blend_Coordinates( FT_Face    face,
-                               FT_UInt    num_coords,
-                               FT_Fixed*  coords );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Var_Blend_Coordinates                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_Var_Blend_Coordinates( FT_Face    face,
-                                FT_UInt    num_coords,
-                                FT_Fixed*  coords );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTMM_H__ */
-
-
-/* END */
diff --git a/include/ftsnames.h b/include/ftsnames.h
deleted file mode 100644
index 0f7fbe1..0000000
--- a/include/ftsnames.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsnames.h                                                             */
-/*                                                                         */
-/*    Simple interface to access SFNT name tables (which are used          */
-/*    to hold font names, copyright info, notices, etc.) (specification).  */
-/*                                                                         */
-/*    This is _not_ used to retrieve glyph names!                          */
-/*                                                                         */
-/*  Copyright 1996-2015 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 __FT_SFNT_NAMES_H__
-#define __FT_SFNT_NAMES_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>                                                             */
-  /*    sfnt_names                                                         */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    SFNT Names                                                         */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Access the names embedded in TrueType and OpenType files.          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType and OpenType specifications allow the inclusion of    */
-  /*    a special `names table' in font files.  This table contains        */
-  /*    textual (and internationalized) information regarding the font,    */
-  /*    like family name, copyright, version, etc.                         */
-  /*                                                                       */
-  /*    The definitions below are used to access them if available.        */
-  /*                                                                       */
-  /*    Note that this has nothing to do with glyph names!                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_SfntName                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model an SFNT `name' table entry.              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    platform_id :: The platform ID for `string'.                       */
-  /*                                                                       */
-  /*    encoding_id :: The encoding ID for `string'.                       */
-  /*                                                                       */
-  /*    language_id :: The language ID for `string'.                       */
-  /*                                                                       */
-  /*    name_id     :: An identifier for `string'.                         */
-  /*                                                                       */
-  /*    string      :: The `name' string.  Note that its format differs    */
-  /*                   depending on the (platform,encoding) pair.  It can  */
-  /*                   be a Pascal String, a UTF-16 one, etc.              */
-  /*                                                                       */
-  /*                   Generally speaking, the string is not               */
-  /*                   zero-terminated.  Please refer to the TrueType      */
-  /*                   specification for details.                          */
-  /*                                                                       */
-  /*    string_len  :: The length of `string' in bytes.                    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Possible values for `platform_id', `encoding_id', `language_id',   */
-  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */
-  /*    please refer to the TrueType or OpenType specification.            */
-  /*                                                                       */
-  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */
-  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */
-  /*                                                                       */
-  typedef struct  FT_SfntName_
-  {
-    FT_UShort  platform_id;
-    FT_UShort  encoding_id;
-    FT_UShort  language_id;
-    FT_UShort  name_id;
-
-    FT_Byte*   string;      /* this string is *not* null-terminated! */
-    FT_UInt    string_len;  /* in bytes */
-
-  } FT_SfntName;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Sfnt_Name_Count                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the number of name strings in the SFNT `name' table.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source face.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The number of strings in the `name' table.                         */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt )
-  FT_Get_Sfnt_Name_Count( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Sfnt_Name                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve a string of the SFNT `name' table for a given index.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face  :: A handle to the source face.                              */
-  /*                                                                       */
-  /*    idx   :: The index of the `name' string.                           */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aname :: The indexed @FT_SfntName structure.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The `string' array returned in the `aname' structure is not        */
-  /*    null-terminated.  The application should deallocate it if it is no */
-  /*    longer in use.                                                     */
-  /*                                                                       */
-  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */
-  /*    `name' table entries, then do a loop until you get the right       */
-  /*    platform, encoding, and name ID.                                   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Sfnt_Name( FT_Face       face,
-                    FT_UInt       idx,
-                    FT_SfntName  *aname );
-
-
-  /***************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
-   *
-   * @description:
-   *   A constant used as the tag of @FT_Parameter structures to make
-   *   FT_Open_Face() ignore preferred family subfamily names in `name'
-   *   table since OpenType version 1.4.  For backwards compatibility with
-   *   legacy systems that have a 4-face-per-family restriction.
-   *
-   */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
-
-
-  /***************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
-   *
-   * @description:
-   *   A constant used as the tag of @FT_Parameter structures to make
-   *   FT_Open_Face() ignore preferred subfamily names in `name' table since
-   *   OpenType version 1.4.  For backwards compatibility with legacy
-   *   systems that have a 4-face-per-family restriction.
-   *
-   */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FT_SFNT_NAMES_H__ */
-
-
-/* END */
diff --git a/include/ftttdrv.h b/include/ftttdrv.h
deleted file mode 100644
index f56040b..0000000
--- a/include/ftttdrv.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftttdrv.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the TrueType driver                     */
-/*    (specification only).                                                */
-/*                                                                         */
-/*  Copyright 2013-2015 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 __FTTTDRV_H__
-#define __FTTTDRV_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:
-   *   tt_driver
-   *
-   * @title:
-   *   The TrueType driver
-   *
-   * @abstract:
-   *   Controlling the TrueType driver module.
-   *
-   * @description:
-   *   While FreeType's TrueType driver doesn't expose API functions by
-   *   itself, it is possible to control its behaviour with @FT_Property_Set
-   *   and @FT_Property_Get.  The following lists the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   The TrueType driver's module name is `truetype'.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   interpreter-version
-   *
-   * @description:
-   *   Currently, two versions are available, representing the bytecode
-   *   interpreter with and without subpixel hinting support,
-   *   respectively.  The default is subpixel support if
-   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel
-   *   support otherwise (since it isn't available then).
-   *
-   *   If subpixel hinting is on, many TrueType bytecode instructions behave
-   *   differently compared to B/W or grayscale rendering (except if `native
-   *   ClearType' is selected by the font).  The main idea is to render at a
-   *   much increased horizontal resolution, then sampling down the created
-   *   output to subpixel precision.  However, many older fonts are not
-   *   suited to this and must be specially taken care of by applying
-   *   (hardcoded) font-specific tweaks.
-   *
-   *   Details on subpixel hinting and some of the necessary tweaks can be
-   *   found in Greg Hitchcock's whitepaper at
-   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
-   *
-   *   The following example code demonstrates how to activate subpixel
-   *   hinting (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Face     face;
-   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_38;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "truetype",
-   *                               "interpreter-version",
-   *                               &interpreter_version );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   TT_INTERPRETER_VERSION_XXX
-   *
-   * @description:
-   *   A list of constants used for the @interpreter-version property to
-   *   select the hinting engine for Truetype fonts.
-   *
-   *   The numeric value in the constant names represents the version
-   *   number as returned by the `GETINFO' bytecode instruction.
-   *
-   * @values:
-   *   TT_INTERPRETER_VERSION_35 ::
-   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
-   *     Windows~98; only grayscale and B/W rasterizing is supported.
-   *
-   *   TT_INTERPRETER_VERSION_38 ::
-   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
-   *     equivalent to the hinting provided by DirectWrite ClearType (as
-   *     can be found, for example, in the Internet Explorer~9 running on
-   *     Windows~7).
-   *
-   * @note:
-   *   This property controls the behaviour of the bytecode interpreter
-   *   and thus how outlines get hinted.  It does *not* control how glyph
-   *   get rasterized!  In particular, it does not control subpixel color
-   *   filtering.
-   *
-   *   If FreeType has not been compiled with configuration option
-   *   FT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 causes an
-   *   `FT_Err_Unimplemented_Feature' error.
-   *
-   *   Depending on the graphics framework, Microsoft uses different
-   *   bytecode and rendering engines.  As a consequence, the version
-   *   numbers returned by a call to the `GETINFO' bytecode instruction are
-   *   more convoluted than desired.
-   *
-   *   Here are two tables that try to shed some light on the possible
-   *   values for the MS rasterizer engine, together with the additional
-   *   features introduced by it.
-   *
-   *   {
-   *     GETINFO framework               version feature
-   *     -------------------------------------------------------------------
-   *         3   GDI (Win 3.1),            v1.0  16-bit, first version
-   *             TrueImage
-   *        33   GDI (Win NT 3.1),         v1.5  32-bit
-   *             HP Laserjet
-   *        34   GDI (Win 95)              v1.6  font smoothing,
-   *                                             new SCANTYPE opcode
-   *        35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
-   *                                               bits in composite glyphs
-   *        36   MGDI (Win CE 2)           v1.6+ classic ClearType
-   *        37   GDI (XP and later),       v1.8  ClearType
-   *             GDI+ old (before Vista)
-   *        38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
-   *             WPF                             Y-direction ClearType,
-   *                                             additional error checking
-   *        39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
-   *                                               in GETINFO opcode,
-   *                                             bug fixes
-   *        40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
-   *             DWrite (Win 8)                    in GETINFO opcode,
-   *                                             Gray ClearType
-   *   }
-   *
-   *   The `version' field gives a rough orientation only, since some
-   *   applications provided certain features much earlier (as an example,
-   *   Microsoft Reader used subpixel and Y-direction ClearType already in
-   *   Windows 2000).  Similarly, updates to a given framework might include
-   *   improved hinting support.
-   *
-   *   {
-   *      version   sampling          rendering        comment
-   *               x        y       x           y
-   *     --------------------------------------------------------------
-   *       v1.0   normal  normal  B/W           B/W    bi-level
-   *       v1.6   high    high    gray          gray   grayscale
-   *       v1.8   high    normal  color-filter  B/W    (GDI) ClearType
-   *       v1.9   high    high    color-filter  gray   Color ClearType
-   *       v2.1   high    normal  gray          B/W    Gray ClearType
-   *       v2.1   high    high    gray          gray   Gray ClearType
-   *   }
-   *
-   *   Color and Gray ClearType are the two available variants of
-   *   `Y-direction ClearType', meaning grayscale rasterization along the
-   *   Y-direction; the name used in the TrueType specification for this
-   *   feature is `symmetric smoothing'.  `Classic ClearType' is the
-   *   original algorithm used before introducing a modified version in
-   *   Win~XP.  Another name for v1.6's grayscale rendering is `font
-   *   smoothing', and `Color ClearType' is sometimes also called `DWrite
-   *   ClearType'.  To differentiate between today's Color ClearType and the
-   *   earlier ClearType variant with B/W rendering along the vertical axis,
-   *   the latter is sometimes called `GDI ClearType'.
-   *
-   *   `Normal' and `high' sampling describe the (virtual) resolution to
-   *   access the rasterized outline after the hinting process.  `Normal'
-   *   means 1 sample per grid line (i.e., B/W).  In the current Microsoft
-   *   implementation, `high' means an extra virtual resolution of 16x16 (or
-   *   16x1) grid lines per pixel for bytecode instructions like `MIRP'.
-   *   After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid
-   *   lines for color filtering if Color ClearType is activated.
-   *
-   *   Note that `Gray ClearType' is essentially the same as v1.6's
-   *   grayscale rendering.  However, the GETINFO instruction handles it
-   *   differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1
-   *   returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing),
-   *   and~19 (Gray ClearType).  Also, this mode respects bits 2 and~3 for
-   *   the version~1 gasp table exclusively (like Color ClearType), while
-   *   v1.6 only respects the values of version~0 (bits 0 and~1).
-   *
-   *   FreeType doesn't provide all capabilities of the most recent
-   *   ClearType incarnation, thus we identify our subpixel support as
-   *   version~38.
-   *
-   */
-#define TT_INTERPRETER_VERSION_35  35
-#define TT_INTERPRETER_VERSION_38  38
-
- /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __FTTTDRV_H__ */
-
-
-/* END */
diff --git a/include/internal/internal.h b/include/internal/internal.h
deleted file mode 100644
index 1c1fd0e..0000000
--- a/include/internal/internal.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  internal.h                                                             */
-/*                                                                         */
-/*    Internal header files (specification only).                          */
-/*                                                                         */
-/*  Copyright 1996-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This file is automatically included by `ft2build.h'.                  */
-  /* Do not include it manually!                                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#define FT_INTERNAL_OBJECTS_H             <internal/ftobjs.h>
-#define FT_INTERNAL_PIC_H                 <internal/ftpic.h>
-#define FT_INTERNAL_STREAM_H              <internal/ftstream.h>
-#define FT_INTERNAL_MEMORY_H              <internal/ftmemory.h>
-#define FT_INTERNAL_DEBUG_H               <internal/ftdebug.h>
-#define FT_INTERNAL_CALC_H                <internal/ftcalc.h>
-#define FT_INTERNAL_DRIVER_H              <internal/ftdriver.h>
-#define FT_INTERNAL_TRACE_H               <internal/fttrace.h>
-#define FT_INTERNAL_GLYPH_LOADER_H        <internal/ftgloadr.h>
-#define FT_INTERNAL_SFNT_H                <internal/sfnt.h>
-#define FT_INTERNAL_SERVICE_H             <internal/ftserv.h>
-#define FT_INTERNAL_RFORK_H               <internal/ftrfork.h>
-#define FT_INTERNAL_VALIDATE_H            <internal/ftvalid.h>
-
-#define FT_INTERNAL_TRUETYPE_TYPES_H      <internal/tttypes.h>
-#define FT_INTERNAL_TYPE1_TYPES_H         <internal/t1types.h>
-
-#define FT_INTERNAL_POSTSCRIPT_AUX_H      <internal/psaux.h>
-#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <internal/pshints.h>
-#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <internal/psglobal.h>
-
-#define FT_INTERNAL_AUTOHINT_H            <internal/autohint.h>
-
-
-#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
-
-  /* We disable the warning `conditional expression is constant' here */
-  /* in order to compile cleanly with the maximum level of warnings.  */
-  /* In particular, the warning complains about stuff like `while(0)' */
-  /* which is very useful in macro definitions.  There is no benefit  */
-  /* in having it enabled.                                            */
-#pragma warning( disable : 4127 )
-
-#endif /* _MSC_VER */
-
-
-/* END */
diff --git a/include/internal/services/svmm.h b/include/internal/services/svmm.h
deleted file mode 100644
index f2cecfb..0000000
--- a/include/internal/services/svmm.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svmm.h                                                                 */
-/*                                                                         */
-/*    The FreeType Multiple Masters and GX var services (specification).   */
-/*                                                                         */
-/*  Copyright 2003-2015 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 __SVMM_H__
-#define __SVMM_H__
-
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   *  A service used to manage multiple-masters data in a given face.
-   *
-   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
-   *
-   */
-
-#define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
-
-
-  typedef FT_Error
-  (*FT_Get_MM_Func)( FT_Face           face,
-                     FT_Multi_Master*  master );
-
-  typedef FT_Error
-  (*FT_Get_MM_Var_Func)( FT_Face      face,
-                         FT_MM_Var*  *master );
-
-  typedef FT_Error
-  (*FT_Set_MM_Design_Func)( FT_Face   face,
-                            FT_UInt   num_coords,
-                            FT_Long*  coords );
-
-  typedef FT_Error
-  (*FT_Set_Var_Design_Func)( FT_Face    face,
-                             FT_UInt    num_coords,
-                             FT_Fixed*  coords );
-
-  typedef FT_Error
-  (*FT_Set_MM_Blend_Func)( FT_Face   face,
-                           FT_UInt   num_coords,
-                           FT_Long*  coords );
-
-
-  FT_DEFINE_SERVICE( MultiMasters )
-  {
-    FT_Get_MM_Func          get_mm;
-    FT_Set_MM_Design_Func   set_mm_design;
-    FT_Set_MM_Blend_Func    set_mm_blend;
-    FT_Get_MM_Var_Func      get_mm_var;
-    FT_Set_Var_Design_Func  set_var_design;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
-                                           get_mm_,                         \
-                                           set_mm_design_,                  \
-                                           set_mm_blend_,                   \
-                                           get_mm_var_,                     \
-                                           set_var_design_ )                \
-  static const FT_Service_MultiMastersRec  class_ =                         \
-  {                                                                         \
-    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
-                                           get_mm_,                         \
-                                           set_mm_design_,                  \
-                                           set_mm_blend_,                   \
-                                           get_mm_var_,                     \
-                                           set_var_design_ )                \
-  void                                                                      \
-  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \
-  {                                                                         \
-    clazz->get_mm         = get_mm_;                                        \
-    clazz->set_mm_design  = set_mm_design_;                                 \
-    clazz->set_mm_blend   = set_mm_blend_;                                  \
-    clazz->get_mm_var     = get_mm_var_;                                    \
-    clazz->set_var_design = set_var_design_;                                \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __SVMM_H__ */
-
-
-/* END */
diff --git a/include/ttunpat.h b/include/ttunpat.h
deleted file mode 100644
index 8ea5568..0000000
--- a/include/ttunpat.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttunpat.h                                                              */
-/*                                                                         */
-/*    Definitions for the unpatented TrueType hinting system               */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  Written by Graham Asher <graham.asher@btinternet.com>                  */
-/*                                                                         */
-/*  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 __TTUNPAT_H__
-#define __TTUNPAT_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
-
-
- /***************************************************************************
-  *
-  * @constant:
-  *   FT_PARAM_TAG_UNPATENTED_HINTING
-  *
-  * @description:
-  *   A constant used as the tag of an @FT_Parameter structure to indicate
-  *   that unpatented methods only should be used by the TrueType bytecode
-  *   interpreter for a typeface opened by @FT_Open_Face.
-  *
-  */
-#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __TTUNPAT_H__ */
-
-
-/* END */
diff --git a/modules.cfg b/modules.cfg
index 9ba66df..4bf3445 100644
--- a/modules.cfg
+++ b/modules.cfg
@@ -1,6 +1,6 @@
 # modules.cfg
 #
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -19,7 +19,7 @@
 # activate a module, remove the comment character.
 #
 # Note that many modules and components are further controlled with macros
-# in the file `include/config/ftoption.h'.
+# in the file `include/freetype/config/ftoption.h'.
 
 
 ####
@@ -37,34 +37,41 @@
 # PostScript Type 1 font driver.
 #
 # This driver needs the `psaux', `pshinter', and `psnames' modules.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += type1
 
 # CFF/OpenType font driver.
 #
-# This driver needs the `sfnt', `pshinter', and `psnames' modules.
+# This driver needs the `sfnt', `psaux', `pshinter', and `psnames' modules.
 FONT_MODULES += cff
 
 # Type 1 CID-keyed font driver.
 #
 # This driver needs the `psaux', `pshinter', and `psnames' modules.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += cid
 
 # PFR/TrueDoc font driver.  See optional extension ftpfr.c below also.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += pfr
 
 # PostScript Type 42 font driver.
 #
 # This driver needs the `truetype' and `psaux' modules.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += type42
 
 # Windows FONT/FNT font driver.  See optional extension ftwinfnt.c below
 # also.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += winfonts
 
-# PCF font driver.
+# PCF font driver.  If debugging and tracing is enabled, needs `ftbitmap.c'.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += pcf
 
 # BDF font driver.  See optional extension ftbdf.c below also.
+# No FT_CONFIG_OPTION_PIC support.
 FONT_MODULES += bdf
 
 # SFNT files support.  If used without `truetype' or `cff', it supports
@@ -85,7 +92,7 @@
 HINTING_MODULES += pshinter
 
 # The TrueType hinting engine doesn't have a module of its own but is
-# controlled in file include/config/ftoption.h
+# controlled in file include/freetype/config/ftoption.h
 # (TT_CONFIG_OPTION_BYTECODE_INTERPRETER and friends).
 
 
@@ -106,34 +113,42 @@
 
 # FreeType's cache sub-system (quite stable but still in beta -- this means
 # that its public API is subject to change if necessary).  See
-# include/ftcache.h.  Needs ftglyph.c.
+# include/freetype/ftcache.h.  Needs `ftglyph.c'.
+# No FT_CONFIG_OPTION_PIC support.
 AUX_MODULES += cache
 
-# TrueType GX/AAT table validation.  Needs ftgxval.c below.
+# TrueType GX/AAT table validation.  Needs `ftgxval.c' below.
+#
+# No FT_CONFIG_OPTION_PIC support.
 # AUX_MODULES += gxvalid
 
 # Support for streams compressed with gzip (files with suffix .gz).
 #
-# See include/ftgzip.h for the API.
+# See include/freetype/ftgzip.h for the API.
+# No FT_CONFIG_OPTION_PIC support.
 AUX_MODULES += gzip
 
 # Support for streams compressed with LZW (files with suffix .Z).
 #
-# See include/ftlzw.h for the API.
+# See include/freetype/ftlzw.h for the API.
+# No FT_CONFIG_OPTION_PIC support.
 AUX_MODULES += lzw
 
 # Support for streams compressed with bzip2 (files with suffix .bz2).
 #
-# See include/ftbzip2.h for the API.
+# See include/freetype/ftbzip2.h for the API.
+# No FT_CONFIG_OPTION_PIC support.
 AUX_MODULES += bzip2
 
-# OpenType table validation.  Needs ftotval.c below.
+# OpenType table validation.  Needs `ftotval.c' below.
 #
+# No FT_CONFIG_OPTION_PIC support.
 # AUX_MODULES += otvalid
 
 # Auxiliary PostScript driver component to share common code.
 #
 # This module depends on `psnames'.
+# No FT_CONFIG_OPTION_PIC support.
 AUX_MODULES += psaux
 
 # Support for PostScript glyph names.
@@ -149,95 +164,86 @@
 
 # Exact bounding box calculation.
 #
-# See include/ftbbox.h for the API.
+# See include/freetype/ftbbox.h for the API.
 BASE_EXTENSIONS += ftbbox.c
 
 # Access BDF-specific strings.  Needs BDF font driver.
 #
-# See include/ftbdf.h for the API.
+# See include/freetype/ftbdf.h for the API.
 BASE_EXTENSIONS += ftbdf.c
 
 # Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into
 # 8bpp format, and for emboldening of bitmap glyphs.
 #
-# See include/ftbitmap.h for the API.
+# See include/freetype/ftbitmap.h for the API.
 BASE_EXTENSIONS += ftbitmap.c
 
 # Access CID font information.
 #
-# See include/ftcid.h for the API.
+# See include/freetype/ftcid.h for the API.
 BASE_EXTENSIONS += ftcid.c
 
-# Support functions for font formats.
+# Access FSType information.  Needs `fttype1.c'.
 #
-# See include/ftfntfmt.h for the API.
-BASE_EXTENSIONS += ftfntfmt.c
-
-# Access FSType information.  Needs fttype1.c.
-#
-# See include/freetype.h for the API.
+# See include/freetype/freetype.h for the API.
 BASE_EXTENSIONS += ftfstype.c
 
 # Support for GASP table queries.
 #
-# See include/ftgasp.h for the API.
+# See include/freetype/ftgasp.h for the API.
 BASE_EXTENSIONS += ftgasp.c
 
-# Convenience functions to handle glyphs.  Needs ftbitmap.c.
+# Convenience functions to handle glyphs.  Needs `ftbitmap.c'.
 #
-# See include/ftglyph.h for the API.
+# See include/freetype/ftglyph.h for the API.
 BASE_EXTENSIONS += ftglyph.c
 
 # Interface for gxvalid module.
 #
-# See include/ftgxval.h for the API.
+# See include/freetype/ftgxval.h for the API.
 BASE_EXTENSIONS += ftgxval.c
 
-# Support for LCD color filtering of subpixel bitmaps.
-#
-# See include/ftlcdfil.h for the API.
-BASE_EXTENSIONS += ftlcdfil.c
-
 # Multiple Master font interface.
 #
-# See include/ftmm.h for the API.
+# See include/freetype/ftmm.h for the API.
 BASE_EXTENSIONS += ftmm.c
 
 # Interface for otvalid module.
 #
-# See include/ftotval.h for the API.
+# See include/freetype/ftotval.h for the API.
 BASE_EXTENSIONS += ftotval.c
 
 # Support for FT_Face_CheckTrueTypePatents.
 #
-# See include/freetype.h for the API.
+# See include/freetype/freetype.h for the API.
 BASE_EXTENSIONS += ftpatent.c
 
 # Interface for accessing PFR-specific data.  Needs PFR font driver.
 #
-# See include/ftpfr.h for the API.
+# See include/freetype/ftpfr.h for the API.
 BASE_EXTENSIONS += ftpfr.c
 
-# Path stroker.  Needs ftglyph.c.
+# Path stroker.  Needs `ftglyph.c'.
 #
-# See include/ftstroke.h for the API.
+# See include/freetype/ftstroke.h for the API.
 BASE_EXTENSIONS += ftstroke.c
 
-# Support for synthetic embolding and slanting of fonts.  Needs ftbitmap.c.
+# Support for synthetic emboldening and slanting of fonts.  Needs
+# `ftbitmap.c'.
 #
-# See include/ftsynth.h for the API.
+# See include/freetype/ftsynth.h for the API.
 BASE_EXTENSIONS += ftsynth.c
 
 # Interface to access data specific to PostScript Type 1 and Type 2 (CFF)
 # fonts.
 #
-# See include/t1tables.h for the API.
+# See include/freetype/t1tables.h for the API.
 BASE_EXTENSIONS += fttype1.c
 
 # Interface for accessing data specific to Windows FNT files.  Needs winfnt
 # driver.
 #
-# See include/ftwinfnt.h for the API.
+# See include/freetype/ftwinfnt.h for the API.
 BASE_EXTENSIONS += ftwinfnt.c
 
 ####
diff --git a/objs/.gitignore b/objs/.gitignore
index 21b67f6..f847620 100644
--- a/objs/.gitignore
+++ b/objs/.gitignore
@@ -1,15 +1,3 @@
-apinames
-freetype.def
-freetype.lib
-ftexport.sym
-ftmodule.h
-ftoption.h
-libfreetype.la
-.libs
-*.lo
-*.o
-*.a
-debug*/
-release*/
-win32/
-win64/
+*
+!README
+!.gitignore
diff --git a/src/Jamfile b/src/Jamfile
index 7a9ee96..562480c 100644
--- a/src/Jamfile
+++ b/src/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -11,12 +11,6 @@
 
 SubDir  FT2_TOP $(FT2_SRC_DIR) ;
 
-# The file <internal/internal.h> is used to define macros that are
-# later used in #include statements.  It needs to be parsed in order to
-# record these definitions.
-#
-HDRMACRO  [ FT2_SubDir $(FT2_INCLUDE_DIR) internal internal.h ] ;
-
 for xx in $(FT2_COMPONENTS)
 {
   SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ;
diff --git a/src/autofit/Jamfile b/src/autofit/Jamfile
index 6600a34..01b866e 100644
--- a/src/autofit/Jamfile
+++ b/src/autofit/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/autofit Jamfile
 #
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -17,11 +17,25 @@
   # define FT2_AUTOFIT2 to enable experimental latin hinter replacement
   if $(FT2_AUTOFIT2)
   {
-    DEFINES += FT_OPTION_AUTOFIT2 ;
+    CCFLAGS += FT_OPTION_AUTOFIT2 ;
   }
   if $(FT2_MULTI)
   {
-    _sources = afangles afglobal afhints aflatin afcjk afindic afloader afmodule afdummy afwarp afpic ;
+    _sources = afangles
+               afblue
+               afcjk
+               afdummy
+               afglobal
+               afhints
+               afindic
+               aflatin
+               afloader
+               afmodule
+               afpic
+               afranges
+               afshaper
+               afwarp
+               ;
 
     if $(FT2_AUTOFIT2)
     {
diff --git a/src/autofit/afangles.c b/src/autofit/afangles.c
index 1b1eb31..c65a3ae 100644
--- a/src/autofit/afangles.c
+++ b/src/autofit/afangles.c
@@ -5,7 +5,7 @@
 /*    Routines used to compute vector angles with limited accuracy         */
 /*    and very high speed.  It also contains sorting routines (body).      */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/autofit/afblue.c b/src/autofit/afblue.c
index e2b2451..e4078fd 100644
--- a/src/autofit/afblue.c
+++ b/src/autofit/afblue.c
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -26,107 +26,411 @@
   af_blue_strings[] =
   {
     /* */
-    '\xD8', '\xA7', '\xD8', '\xA5', '\xD9', '\x84', '\xD9', '\x83', '\xD8', '\xB7', '\xD8', '\xB8',  /* ا إ ل ك ط ظ */
+    '\xF0', '\x9E', '\xA4', '\x8C', ' ', '\xF0', '\x9E', '\xA4', '\x85', ' ', '\xF0', '\x9E', '\xA4', '\x88', ' ', '\xF0', '\x9E', '\xA4', '\x8F', ' ', '\xF0', '\x9E', '\xA4', '\x94', ' ', '\xF0', '\x9E', '\xA4', '\x9A',  /* 𞤌 𞤅 𞤈 𞤏 𞤔 𞤚 */
     '\0',
-    '\xD8', '\xAA', '\xD8', '\xAB', '\xD8', '\xB7', '\xD8', '\xB8', '\xD9', '\x83',  /* ت ث ط ظ ك */
+    '\xF0', '\x9E', '\xA4', '\x82', ' ', '\xF0', '\x9E', '\xA4', '\x96',  /* 𞤂 𞤖 */
     '\0',
-    '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\x9F', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD',  /* БВЕПЗОСЭ */
+    '\xF0', '\x9E', '\xA4', '\xAC', ' ', '\xF0', '\x9E', '\xA4', '\xAE', ' ', '\xF0', '\x9E', '\xA4', '\xBB', ' ', '\xF0', '\x9E', '\xA4', '\xBC', ' ', '\xF0', '\x9E', '\xA4', '\xBE',  /* 𞤬 𞤮 𞤻 𞤼 𞤾 */
     '\0',
-    '\xD0', '\x91', '\xD0', '\x92', '\xD0', '\x95', '\xD0', '\xA8', '\xD0', '\x97', '\xD0', '\x9E', '\xD0', '\xA1', '\xD0', '\xAD',  /* БВЕШЗОСЭ */
+    '\xF0', '\x9E', '\xA4', '\xA4', ' ', '\xF0', '\x9E', '\xA4', '\xA8', ' ', '\xF0', '\x9E', '\xA4', '\xA9', ' ', '\xF0', '\x9E', '\xA4', '\xAD', ' ', '\xF0', '\x9E', '\xA4', '\xB4', ' ', '\xF0', '\x9E', '\xA4', '\xB8', ' ', '\xF0', '\x9E', '\xA4', '\xBA', ' ', '\xF0', '\x9E', '\xA5', '\x80',  /* 𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀 */
     '\0',
-    '\xD1', '\x85', '\xD0', '\xBF', '\xD0', '\xBD', '\xD1', '\x88', '\xD0', '\xB5', '\xD0', '\xB7', '\xD0', '\xBE', '\xD1', '\x81',  /* хпншезос */
+    '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8',  /* ا إ ل ك ط ظ */
     '\0',
-    '\xD1', '\x80', '\xD1', '\x83', '\xD1', '\x84',  /* руф */
+    '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83',  /* ت ث ط ظ ك */
     '\0',
-    '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6',  /* क म अ आ थ ध भ श */
+    '\xD9', '\x80',  /* ـ */
     '\0',
-    '\xE0', '\xA4', '\x88', '\xE0', '\xA4', '\x90', '\xE0', '\xA4', '\x93', '\xE0', '\xA4', '\x94', '\xE0', '\xA4', '\xBF', '\xE0', '\xA5', '\x80', '\xE0', '\xA5', '\x8B', '\xE0', '\xA5', '\x8C',  /* ई ऐ ओ औ ि ी ो ौ */
+    '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x8D', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95',  /* Ա Մ Ւ Ս Բ Գ Դ Օ */
     '\0',
-    '\xE0', '\xA4', '\x95', '\xE0', '\xA4', '\xAE', '\xE0', '\xA4', '\x85', '\xE0', '\xA4', '\x86', '\xE0', '\xA4', '\xA5', '\xE0', '\xA4', '\xA7', '\xE0', '\xA4', '\xAD', '\xE0', '\xA4', '\xB6',  /* क म अ आ थ ध भ श */
+    '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95',  /* Ւ Ո Դ Ճ Շ Ս Տ Օ */
     '\0',
-    '\xE0', '\xA5', '\x81', '\xE0', '\xA5', '\x83',  /* ु ृ */
+    '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x86', ' ', '\xD5', '\xB3',  /* ե է ի մ վ ֆ ճ */
     '\0',
-    '\xCE', '\x93', '\xCE', '\x92', '\xCE', '\x95', '\xCE', '\x96', '\xCE', '\x98', '\xCE', '\x9F', '\xCE', '\xA9',  /* ΓΒΕΖΘΟΩ */
+    '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xB7', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85',  /* ա յ ւ ս գ շ ր օ */
     '\0',
-    '\xCE', '\x92', '\xCE', '\x94', '\xCE', '\x96', '\xCE', '\x9E', '\xCE', '\x98', '\xCE', '\x9F',  /* ΒΔΖΞΘΟ */
+    '\xD5', '\xB0', ' ', '\xD5', '\xB8', ' ', '\xD5', '\xB3', ' ', '\xD5', '\xA1', ' ', '\xD5', '\xA5', ' ', '\xD5', '\xAE', ' ', '\xD5', '\xBD', ' ', '\xD6', '\x85',  /* հ ո ճ ա ե ծ ս օ */
     '\0',
-    '\xCE', '\xB2', '\xCE', '\xB8', '\xCE', '\xB4', '\xCE', '\xB6', '\xCE', '\xBB', '\xCE', '\xBE',  /* βθδζλξ */
+    '\xD5', '\xA2', ' ', '\xD5', '\xA8', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xAC', ' ', '\xD5', '\xB2', ' ', '\xD5', '\xBA', ' ', '\xD6', '\x83', ' ', '\xD6', '\x81',  /* բ ը ի լ ղ պ փ ց */
     '\0',
-    '\xCE', '\xB1', '\xCE', '\xB5', '\xCE', '\xB9', '\xCE', '\xBF', '\xCF', '\x80', '\xCF', '\x83', '\xCF', '\x84', '\xCF', '\x89',  /* αειοπστω */
+    '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', ' ', '\xF0', '\x90', '\xAC', '\x90', ' ', '\xF0', '\x90', '\xAC', '\x9B',  /* 𐬀 𐬁 𐬐 𐬛 */
     '\0',
-    '\xCE', '\xB2', '\xCE', '\xB3', '\xCE', '\xB7', '\xCE', '\xBC', '\xCF', '\x81', '\xCF', '\x86', '\xCF', '\x87', '\xCF', '\x88',  /* βγημρφχψ */
+    '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81',  /* 𐬀 𐬁 */
     '\0',
-    '\xD7', '\x91', '\xD7', '\x93', '\xD7', '\x94', '\xD7', '\x97', '\xD7', '\x9A', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1',  /* בדהחךכםס */
+    '\xEA', '\x9A', '\xA7', ' ', '\xEA', '\x9A', '\xA8', ' ', '\xEA', '\x9B', '\x9B', ' ', '\xEA', '\x9B', '\x89', ' ', '\xEA', '\x9B', '\x81', ' ', '\xEA', '\x9B', '\x88', ' ', '\xEA', '\x9B', '\xAB', ' ', '\xEA', '\x9B', '\xAF',  /* ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ */
     '\0',
-    '\xD7', '\x91', '\xD7', '\x98', '\xD7', '\x9B', '\xD7', '\x9D', '\xD7', '\xA1', '\xD7', '\xA6',  /* בטכםסצ */
+    '\xEA', '\x9A', '\xAD', ' ', '\xEA', '\x9A', '\xB3', ' ', '\xEA', '\x9A', '\xB6', ' ', '\xEA', '\x9B', '\xAC', ' ', '\xEA', '\x9A', '\xA2', ' ', '\xEA', '\x9A', '\xBD', ' ', '\xEA', '\x9B', '\xAF', ' ', '\xEA', '\x9B', '\xB2',  /* ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲ */
     '\0',
-    '\xD7', '\xA7', '\xD7', '\x9A', '\xD7', '\x9F', '\xD7', '\xA3', '\xD7', '\xA5',  /* קךןףץ */
+    '\xE0', '\xA6', '\x85', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xAD', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95',  /* অ ড ত ন ব ভ ল ক */
     '\0',
-    'T', 'H', 'E', 'Z', 'O', 'C', 'Q', 'S',  /* THEZOCQS */
+    '\xE0', '\xA6', '\x87', ' ', '\xE0', '\xA6', '\x9F', ' ', '\xE0', '\xA6', '\xA0', ' ', '\xE0', '\xA6', '\xBF', ' ', '\xE0', '\xA7', '\x80', ' ', '\xE0', '\xA7', '\x88', ' ', '\xE0', '\xA7', '\x97',  /* ই ট ঠ ি ী ৈ ৗ */
     '\0',
-    'H', 'E', 'Z', 'L', 'O', 'C', 'U', 'S',  /* HEZLOCUS */
+    '\xE0', '\xA6', '\x93', ' ', '\xE0', '\xA6', '\x8F', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95',  /* ও এ ড ত ন ব ল ক */
     '\0',
-    'f', 'i', 'j', 'k', 'd', 'b', 'h',  /* fijkdbh */
+    '\xE1', '\x9D', '\x90', ' ', '\xE1', '\x9D', '\x88',  /* ᝐ ᝈ */
     '\0',
-    'x', 'z', 'r', 'o', 'e', 's', 'c',  /* xzroesc */
+    '\xE1', '\x9D', '\x85', ' ', '\xE1', '\x9D', '\x8A', ' ', '\xE1', '\x9D', '\x8E',  /* ᝅ ᝊ ᝎ */
     '\0',
-    'p', 'q', 'g', 'j', 'y',  /* pqgjy */
+    '\xE1', '\x9D', '\x82', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8C',  /* ᝂ ᝃ ᝉ ᝌ */
     '\0',
-    '\xE0', '\xB0', '\x87', '\xE0', '\xB0', '\x8C', '\xE0', '\xB0', '\x99', '\xE0', '\xB0', '\x9E', '\xE0', '\xB0', '\xA3', '\xE0', '\xB0', '\xB1', '\xE0', '\xB1', '\xAF',  /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */
+    '\xE1', '\x9D', '\x80', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x86', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8B', ' ', '\xE1', '\x9D', '\x8F', ' ', '\xE1', '\x9D', '\x91',  /* ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ */
     '\0',
-    '\xE0', '\xB0', '\x85', '\xE0', '\xB0', '\x95', '\xE0', '\xB0', '\x9A', '\xE0', '\xB0', '\xB0', '\xE0', '\xB0', '\xBD', '\xE0', '\xB1', '\xA8', '\xE0', '\xB1', '\xAC',  /* అ క చ ర ఽ ౨ ౬ */
+    '\xE1', '\x97', '\x9C', ' ', '\xE1', '\x96', '\xB4', ' ', '\xE1', '\x90', '\x81', ' ', '\xE1', '\x92', '\xA3', ' ', '\xE1', '\x91', '\xAB', ' ', '\xE1', '\x91', '\x8E', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xB0',  /* ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ */
     '\0',
-    '\xE0', '\xB8', '\x9A', '\xE0', '\xB9', '\x80', '\xE0', '\xB9', '\x81', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\x81', '\xE0', '\xB8', '\xB2',  /* บ เ แ อ ก า */
+    '\xE1', '\x97', '\xB6', ' ', '\xE1', '\x96', '\xB5', ' ', '\xE1', '\x92', '\xA7', ' ', '\xE1', '\x90', '\x83', ' ', '\xE1', '\x91', '\x8C', ' ', '\xE1', '\x92', '\x8D', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xA2',  /* ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ */
     '\0',
-    '\xE0', '\xB8', '\x9A', '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\xA9', '\xE0', '\xB8', '\xAF', '\xE0', '\xB8', '\xAD', '\xE0', '\xB8', '\xA2', '\xE0', '\xB8', '\xAE',  /* บ ป ษ ฯ อ ย ฮ */
+    '\xE1', '\x93', '\x93', ' ', '\xE1', '\x93', '\x95', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x84', ' ', '\xE1', '\x95', '\x84', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3',  /* ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ */
     '\0',
-    '\xE0', '\xB8', '\x9B', '\xE0', '\xB8', '\x9D', '\xE0', '\xB8', '\x9F',  /* ป ฝ ฟ */
+    '\xE1', '\x95', '\x83', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x95', '\x82', ' ', '\xE1', '\x93', '\x97', ' ', '\xE1', '\x93', '\x9A', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3',  /* ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ */
     '\0',
-    '\xE0', '\xB9', '\x82', '\xE0', '\xB9', '\x83', '\xE0', '\xB9', '\x84',  /* โ ใ ไ */
+    '\xE1', '\x90', '\xAA', ' ', '\xE1', '\x99', '\x86', ' ', '\xE1', '\xA3', '\x98', ' ', '\xE1', '\x90', '\xA2', ' ', '\xE1', '\x92', '\xBE', ' ', '\xE1', '\xA3', '\x97', ' ', '\xE1', '\x94', '\x86',  /* ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ */
     '\0',
-    '\xE0', '\xB8', '\x8E', '\xE0', '\xB8', '\x8F', '\xE0', '\xB8', '\xA4', '\xE0', '\xB8', '\xA6',  /* ฎ ฏ ฤ ฦ */
+    '\xE1', '\x99', '\x86', ' ', '\xE1', '\x97', '\xAE', ' ', '\xE1', '\x92', '\xBB', ' ', '\xE1', '\x90', '\x9E', ' ', '\xE1', '\x94', '\x86', ' ', '\xE1', '\x92', '\xA1', ' ', '\xE1', '\x92', '\xA2', ' ', '\xE1', '\x93', '\x91',  /* ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ */
     '\0',
-    '\xE0', '\xB8', '\x8D', '\xE0', '\xB8', '\x90',  /* ญ ฐ */
+    '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xAC', ' ', '\xF0', '\x90', '\x8A', '\xAD', ' ', '\xF0', '\x90', '\x8A', '\xB1', ' ', '\xF0', '\x90', '\x8A', '\xBA', ' ', '\xF0', '\x90', '\x8A', '\xBC', ' ', '\xF0', '\x90', '\x8A', '\xBF',  /* 𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿 */
     '\0',
-    '\xE0', '\xB9', '\x90', '\xE0', '\xB9', '\x91', '\xE0', '\xB9', '\x93',  /* ๐ ๑ ๓ */
+    '\xF0', '\x90', '\x8A', '\xA3', ' ', '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xB7', ' ', '\xF0', '\x90', '\x8B', '\x80', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xB8', ' ', '\xF0', '\x90', '\x8B', '\x89',  /* 𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉 */
+    '\0',
+    '\xF0', '\x91', '\x84', '\x83', ' ', '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x89', ' ', '\xF0', '\x91', '\x84', '\x99', ' ', '\xF0', '\x91', '\x84', '\x97',  /* 𑄃 𑄅 𑄉 𑄙 𑄗 */
+    '\0',
+    '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x9B', ' ', '\xF0', '\x91', '\x84', '\x9D', ' ', '\xF0', '\x91', '\x84', '\x97', ' ', '\xF0', '\x91', '\x84', '\x93',  /* 𑄅 𑄛 𑄝 𑄗 𑄓 */
+    '\0',
+    '\xF0', '\x91', '\x84', '\x96', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x98', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x99', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA4', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA5', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2',  /* 𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢 */
+    '\0',
+    '\xE1', '\x8F', '\x86', ' ', '\xE1', '\x8E', '\xBB', ' ', '\xE1', '\x8E', '\xAC', ' ', '\xE1', '\x8F', '\x83', ' ', '\xE1', '\x8E', '\xA4', ' ', '\xE1', '\x8F', '\xA3', ' ', '\xE1', '\x8E', '\xA6', ' ', '\xE1', '\x8F', '\x95',  /* Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ */
+    '\0',
+    '\xEA', '\xAE', '\x92', ' ', '\xEA', '\xAE', '\xA4', ' ', '\xEA', '\xAE', '\xB6', ' ', '\xEA', '\xAD', '\xB4', ' ', '\xEA', '\xAD', '\xBE', ' ', '\xEA', '\xAE', '\x97', ' ', '\xEA', '\xAE', '\x9D', ' ', '\xEA', '\xAE', '\xBF',  /* ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ */
+    '\0',
+    '\xEA', '\xAE', '\x96', ' ', '\xEA', '\xAD', '\xBC', ' ', '\xEA', '\xAE', '\x93', ' ', '\xEA', '\xAE', '\xA0', ' ', '\xEA', '\xAE', '\xB3', ' ', '\xEA', '\xAD', '\xB6', ' ', '\xEA', '\xAE', '\xA5', ' ', '\xEA', '\xAE', '\xBB',  /* ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ */
+    '\0',
+    '\xE1', '\x8F', '\xB8', ' ', '\xEA', '\xAE', '\x90', ' ', '\xEA', '\xAD', '\xB9', ' ', '\xEA', '\xAD', '\xBB',  /* ᏸ ꮐ ꭹ ꭻ */
+    '\0',
+    '\xE2', '\xB2', '\x8C', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\xA0', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB2', '\xA4', ' ', '\xE2', '\xB3', '\x8A',  /* Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ */
+    '\0',
+    '\xE2', '\xB3', '\x90', ' ', '\xE2', '\xB3', '\x98', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB3', '\x9C', ' ', '\xE2', '\xB2', '\xB0',  /* Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ */
+    '\0',
+    '\xE2', '\xB2', '\x8D', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\xA1', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB2', '\xA5', ' ', '\xE2', '\xB3', '\x8B',  /* ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ */
+    '\0',
+    '\xE2', '\xB3', '\x91', ' ', '\xE2', '\xB3', '\x99', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB3', '\x9D', ' ', '\xE2', '\xB3', '\x92',  /* ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ */
+    '\0',
+    '\xF0', '\x90', '\xA0', '\x8D', ' ', '\xF0', '\x90', '\xA0', '\x99', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB1', ' ', '\xF0', '\x90', '\xA0', '\x85', ' ', '\xF0', '\x90', '\xA0', '\x93', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xA6',  /* 𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦 */
+    '\0',
+    '\xF0', '\x90', '\xA0', '\x83', ' ', '\xF0', '\x90', '\xA0', '\x8A', ' ', '\xF0', '\x90', '\xA0', '\x9B', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB5', ' ', '\xF0', '\x90', '\xA0', '\x90',  /* 𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐 */
+    '\0',
+    '\xF0', '\x90', '\xA0', '\x88', ' ', '\xF0', '\x90', '\xA0', '\x8F', ' ', '\xF0', '\x90', '\xA0', '\x96',  /* 𐠈 𐠏 𐠖 */
+    '\0',
+    '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD',  /* Б В Е П З О С Э */
+    '\0',
+    '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD',  /* Б В Е Ш З О С Э */
+    '\0',
+    '\xD1', '\x85', ' ', '\xD0', '\xBF', ' ', '\xD0', '\xBD', ' ', '\xD1', '\x88', ' ', '\xD0', '\xB5', ' ', '\xD0', '\xB7', ' ', '\xD0', '\xBE', ' ', '\xD1', '\x81',  /* х п н ш е з о с */
+    '\0',
+    '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84',  /* р у ф */
+    '\0',
+    '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x8B', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x91',  /* 𐐂 𐐄 𐐋 𐐗 𐐑 */
+    '\0',
+    '\xF0', '\x90', '\x90', '\x80', ' ', '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x9B',  /* 𐐀 𐐂 𐐄 𐐗 𐐛 */
+    '\0',
+    '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xB3', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x90', '\xB9',  /* 𐐪 𐐬 𐐳 𐐿 𐐹 */
+    '\0',
+    '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83',  /* 𐐨 𐐪 𐐬 𐐿 𐑃 */
+    '\0',
+    '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6',  /* क म अ आ थ ध भ श */
+    '\0',
+    '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C',  /* ई ऐ ओ औ ि ी ो ौ */
+    '\0',
+    '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6',  /* क म अ आ थ ध भ श */
+    '\0',
+    '\xE0', '\xA5', '\x81', ' ', '\xE0', '\xA5', '\x83',  /* ु ृ */
+    '\0',
+    '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\x83', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x8D', '\x90', ' ', '\xE1', '\x88', '\x9B', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x8B', ' ', '\xE1', '\x8B', '\x90',  /* ሀ ሃ ዘ ፐ ማ በ ዋ ዐ */
+    '\0',
+    '\xE1', '\x88', '\x88', ' ', '\xE1', '\x88', '\x90', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\xAA', ' ', '\xE1', '\x8B', '\x90', ' ', '\xE1', '\x8C', '\xA8',  /* ለ ሐ በ ዘ ሀ ሪ ዐ ጨ */
+    '\0',
+    '\xE1', '\x83', '\x92', ' ', '\xE1', '\x83', '\x93', ' ', '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x97', ' ', '\xE1', '\x83', '\x98', ' ', '\xE1', '\x83', '\x9D', ' ', '\xE1', '\x83', '\xA6',  /* გ დ ე ვ თ ი ო ღ */
+    '\0',
+    '\xE1', '\x83', '\x90', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xAB', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\x9E',  /* ა ზ მ ს შ ძ ხ პ */
+    '\0',
+    '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xA9', ' ', '\xE1', '\x83', '\xAC',  /* ს ხ ქ ზ მ შ ჩ წ */
+    '\0',
+    '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x9F', ' ', '\xE1', '\x83', '\xA2', ' ', '\xE1', '\x83', '\xA3', ' ', '\xE1', '\x83', '\xA4', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\xA7',  /* ე ვ ჟ ტ უ ფ ქ ყ */
+    '\0',
+    '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xB9', ' ', '\xE1', '\x82', '\xBC', ' ', '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xB3', ' ', '\xE1', '\x82', '\xBA',  /* Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ */
+    '\0',
+    '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xA8', ' ', '\xE1', '\x82', '\xA6', ' ', '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xAA', ' ', '\xE1', '\x82', '\xAB',  /* Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ */
+    '\0',
+    '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x97', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x87', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x96',  /* ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ */
+    '\0',
+    '\xE2', '\xB4', '\x88', ' ', '\xE2', '\xB4', '\x8C', ' ', '\xE2', '\xB4', '\x96', ' ', '\xE2', '\xB4', '\x8E', ' ', '\xE2', '\xB4', '\x83', ' ', '\xE2', '\xB4', '\x86', ' ', '\xE2', '\xB4', '\x8B', ' ', '\xE2', '\xB4', '\xA2',  /* ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ */
+    '\0',
+    '\xE2', '\xB4', '\x90', ' ', '\xE2', '\xB4', '\x91', ' ', '\xE2', '\xB4', '\x93', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x99', ' ', '\xE2', '\xB4', '\x9B', ' ', '\xE2', '\xB4', '\xA1', ' ', '\xE2', '\xB4', '\xA3',  /* ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ */
+    '\0',
+    '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x98', ' ', '\xE2', '\xB4', '\x9D',  /* ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ */
+    '\0',
+    '\xE1', '\xB2', '\x9C', ' ', '\xE1', '\xB2', '\x9F', ' ', '\xE1', '\xB2', '\xB3', ' ', '\xE1', '\xB2', '\xB8', ' ', '\xE1', '\xB2', '\x92', ' ', '\xE1', '\xB2', '\x94', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xB4',  /* Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ */
+    '\0',
+    '\xE1', '\xB2', '\x98', ' ', '\xE1', '\xB2', '\xB2', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xA9', ' ', '\xE1', '\xB2', '\x9B', ' ', '\xE1', '\xB2', '\xA8', ' ', '\xE1', '\xB2', '\xAF', ' ', '\xE1', '\xB2', '\xBD',  /* Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ */
+    '\0',
+    '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x94', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\xAB', ' ', '\xE2', '\xB0', '\x8B',  /* Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ */
+    '\0',
+    '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x9E', ' ', '\xE2', '\xB0', '\xA1', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\x94',  /* Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ */
+    '\0',
+    '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB1', '\x84', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x9B', ' ', '\xE2', '\xB0', '\xBB',  /* ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ */
+    '\0',
+    '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB1', '\x8E', ' ', '\xE2', '\xB1', '\x91', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x84',  /* ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ */
+    '\0',
+    '\xF0', '\x90', '\x8C', '\xB2', ' ', '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8D', '\x80', ' ', '\xF0', '\x90', '\x8D', '\x84', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', ' ', '\xF0', '\x90', '\x8C', '\xBE',  /* 𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾 */
+    '\0',
+    '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88',  /* 𐌶 𐌴 𐍃 𐍈 */
+    '\0',
+    '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9',  /* Γ Β Ε Ζ Θ Ο Ω */
+    '\0',
+    '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F',  /* Β Δ Ζ Ξ Θ Ο */
+    '\0',
+    '\xCE', '\xB2', ' ', '\xCE', '\xB8', ' ', '\xCE', '\xB4', ' ', '\xCE', '\xB6', ' ', '\xCE', '\xBB', ' ', '\xCE', '\xBE',  /* β θ δ ζ λ ξ */
+    '\0',
+    '\xCE', '\xB1', ' ', '\xCE', '\xB5', ' ', '\xCE', '\xB9', ' ', '\xCE', '\xBF', ' ', '\xCF', '\x80', ' ', '\xCF', '\x83', ' ', '\xCF', '\x84', ' ', '\xCF', '\x89',  /* α ε ι ο π σ τ ω */
+    '\0',
+    '\xCE', '\xB2', ' ', '\xCE', '\xB3', ' ', '\xCE', '\xB7', ' ', '\xCE', '\xBC', ' ', '\xCF', '\x81', ' ', '\xCF', '\x86', ' ', '\xCF', '\x87', ' ', '\xCF', '\x88',  /* β γ η μ ρ φ χ ψ */
+    '\0',
+    '\xE0', '\xAA', '\xA4', ' ', '\xE0', '\xAA', '\xA8', ' ', '\xE0', '\xAA', '\x8B', ' ', '\xE0', '\xAA', '\x8C', ' ', '\xE0', '\xAA', '\x9B', ' ', '\xE0', '\xAA', '\x9F', ' ', '\xE0', '\xAA', '\xB0', ' ', '\xE0', '\xAB', '\xA6',  /* ત ન ઋ ઌ છ ટ ર ૦ */
+    '\0',
+    '\xE0', '\xAA', '\x96', ' ', '\xE0', '\xAA', '\x97', ' ', '\xE0', '\xAA', '\x98', ' ', '\xE0', '\xAA', '\x9E', ' ', '\xE0', '\xAA', '\x87', ' ', '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\xA0', ' ', '\xE0', '\xAA', '\x9C',  /* ખ ગ ઘ ઞ ઇ ઈ ઠ જ */
+    '\0',
+    '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\x8A', ' ', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB2', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB6', '\xE0', '\xAB', '\x8D', '\xE0', '\xAA', '\x9A', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\x9C', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\xB8', '\xE0', '\xAB', '\x80',  /* ઈ ઊ િ ી લી શ્ચિ જિ સી */
+    '\0',
+    '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAB', '\x84', ' ', '\xE0', '\xAA', '\x96', '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x84',  /* ુ ૃ ૄ ખુ છૃ છૄ */
+    '\0',
+    '\xE0', '\xAB', '\xA6', ' ', '\xE0', '\xAB', '\xA7', ' ', '\xE0', '\xAB', '\xA8', ' ', '\xE0', '\xAB', '\xA9', ' ', '\xE0', '\xAB', '\xAD',  /* ૦ ૧ ૨ ૩ ૭ */
+    '\0',
+    '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8',  /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */
+    '\0',
+    '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8',  /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */
+    '\0',
+    '\xE0', '\xA8', '\x87', ' ', '\xE0', '\xA8', '\x88', ' ', '\xE0', '\xA8', '\x89', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA9', '\xB3', ' ', '\xE0', '\xA8', '\xBF', ' ', '\xE0', '\xA9', '\x80',  /* ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ */
+    '\0',
+    '\xE0', '\xA8', '\x85', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA0', ' ', '\xE0', '\xA8', '\xB0', ' ', '\xE0', '\xA8', '\xB8',  /* ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ */
+    '\0',
+    '\xE0', '\xA9', '\xA6', ' ', '\xE0', '\xA9', '\xA7', ' ', '\xE0', '\xA9', '\xA8', ' ', '\xE0', '\xA9', '\xA9', ' ', '\xE0', '\xA9', '\xAD',  /* ੦ ੧ ੨ ੩ ੭ */
+    '\0',
+    '\xD7', '\x91', ' ', '\xD7', '\x93', ' ', '\xD7', '\x94', ' ', '\xD7', '\x97', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1',  /* ב ד ה ח ך כ ם ס */
+    '\0',
+    '\xD7', '\x91', ' ', '\xD7', '\x98', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', ' ', '\xD7', '\xA6',  /* ב ט כ ם ס צ */
+    '\0',
+    '\xD7', '\xA7', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9F', ' ', '\xD7', '\xA3', ' ', '\xD7', '\xA5',  /* ק ך ן ף ץ */
+    '\0',
+    '\xE0', '\xB2', '\x87', ' ', '\xE0', '\xB2', '\x8A', ' ', '\xE0', '\xB2', '\x90', ' ', '\xE0', '\xB2', '\xA3', ' ', '\xE0', '\xB2', '\xB8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA6', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xB0', '\xE0', '\xB2', '\xBE',  /* ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ */
+    '\0',
+    '\xE0', '\xB2', '\x85', ' ', '\xE0', '\xB2', '\x89', ' ', '\xE0', '\xB2', '\x8E', ' ', '\xE0', '\xB2', '\xB2', ' ', '\xE0', '\xB3', '\xA6', ' ', '\xE0', '\xB3', '\xA8', ' ', '\xE0', '\xB3', '\xAC', ' ', '\xE0', '\xB3', '\xAD',  /* ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭ */
+    '\0',
+    '\xEA', '\xA4', '\x85', ' ', '\xEA', '\xA4', '\x8F', ' ', '\xEA', '\xA4', '\x81', ' ', '\xEA', '\xA4', '\x8B', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D',  /* ꤅ ꤏ ꤁ ꤋ ꤀ ꤍ */
+    '\0',
+    '\xEA', '\xA4', '\x88', ' ', '\xEA', '\xA4', '\x98', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', ' ', '\xEA', '\xA4', '\xA2',  /* ꤈ ꤘ ꤀ ꤍ ꤢ */
+    '\0',
+    '\xEA', '\xA4', '\x96', ' ', '\xEA', '\xA4', '\xA1',  /* ꤖ ꤡ */
+    '\0',
+    '\xEA', '\xA4', '\x91', ' ', '\xEA', '\xA4', '\x9C', ' ', '\xEA', '\xA4', '\x9E',  /* ꤑ ꤜ ꤞ */
+    '\0',
+    '\xEA', '\xA4', '\x91', '\xEA', '\xA4', '\xAC', ' ', '\xEA', '\xA4', '\x9C', '\xEA', '\xA4', '\xAD', ' ', '\xEA', '\xA4', '\x94', '\xEA', '\xA4', '\xAC',  /* ꤑ꤬ ꤜ꤭ ꤔ꤬ */
+    '\0',
+    '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x91', ' ', '\xE1', '\x9E', '\x93', ' ', '\xE1', '\x9E', '\xA7', ' ', '\xE1', '\x9E', '\xA9', ' ', '\xE1', '\x9E', '\xB6',  /* ខ ទ ន ឧ ឩ ា */
+    '\0',
+    '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x80', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x82', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x90',  /* ក្ក ក្ខ ក្គ ក្ថ */
+    '\0',
+    '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x83', ' ', '\xE1', '\x9E', '\x85', ' ', '\xE1', '\x9E', '\x8B', ' ', '\xE1', '\x9E', '\x94', ' ', '\xE1', '\x9E', '\x98', ' ', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xB2',  /* ខ ឃ ច ឋ ប ម យ ឲ */
+    '\0',
+    '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', ' ', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\xB2', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xA2', '\xE1', '\x9E', '\xBF',  /* ត្រ រៀ ឲ្យ អឿ */
+    '\0',
+    '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x83', ' ', '\xE1', '\x9E', '\x84', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x85', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9E', '\xBF', ' ', '\xE1', '\x9E', '\x9B', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9E', '\xBF',  /* ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ */
+    '\0',
+    '\xE1', '\xA7', '\xA0', ' ', '\xE1', '\xA7', '\xA1',  /* ᧠ ᧡ */
+    '\0',
+    '\xE1', '\xA7', '\xB6', ' ', '\xE1', '\xA7', '\xB9',  /* ᧶ ᧹ */
+    '\0',
+    '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\x94', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\xA1', ' ', '\xE0', '\xBA', '\xA5', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\x87',  /* າ ດ ອ ມ ລ ວ ຣ ງ */
+    '\0',
+    '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\x9A', ' ', '\xE0', '\xBA', '\x8D', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\xAE', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA2',  /* າ ອ ບ ຍ ຣ ຮ ວ ຢ */
+    '\0',
+    '\xE0', '\xBA', '\x9B', ' ', '\xE0', '\xBA', '\xA2', ' ', '\xE0', '\xBA', '\x9F', ' ', '\xE0', '\xBA', '\x9D',  /* ປ ຢ ຟ ຝ */
+    '\0',
+    '\xE0', '\xBB', '\x82', ' ', '\xE0', '\xBB', '\x84', ' ', '\xE0', '\xBB', '\x83',  /* ໂ ໄ ໃ */
+    '\0',
+    '\xE0', '\xBA', '\x87', ' ', '\xE0', '\xBA', '\x8A', ' ', '\xE0', '\xBA', '\x96', ' ', '\xE0', '\xBA', '\xBD', ' ', '\xE0', '\xBB', '\x86', ' ', '\xE0', '\xBA', '\xAF',  /* ງ ຊ ຖ ຽ ໆ ຯ */
+    '\0',
+    'T', ' ', 'H', ' ', 'E', ' ', 'Z', ' ', 'O', ' ', 'C', ' ', 'Q', ' ', 'S',  /* T H E Z O C Q S */
+    '\0',
+    'H', ' ', 'E', ' ', 'Z', ' ', 'L', ' ', 'O', ' ', 'C', ' ', 'U', ' ', 'S',  /* H E Z L O C U S */
+    '\0',
+    'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h',  /* f i j k d b h */
+    '\0',
+    'u', ' ', 'v', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c',  /* u v x z o e s c */
+    '\0',
+    'n', ' ', 'r', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c',  /* n r x z o e s c */
+    '\0',
+    'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y',  /* p q g j y */
+    '\0',
+    '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x85', ' ', '\xE2', '\x82', '\x87', ' ', '\xE2', '\x82', '\x88',  /* ₀ ₃ ₅ ₇ ₈ */
+    '\0',
+    '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x81', ' ', '\xE2', '\x82', '\x82', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x88',  /* ₀ ₁ ₂ ₃ ₈ */
+    '\0',
+    '\xE1', '\xB5', '\xA2', ' ', '\xE2', '\xB1', '\xBC', ' ', '\xE2', '\x82', '\x95', ' ', '\xE2', '\x82', '\x96', ' ', '\xE2', '\x82', '\x97',  /* ᵢ ⱼ ₕ ₖ ₗ */
+    '\0',
+    '\xE2', '\x82', '\x90', ' ', '\xE2', '\x82', '\x91', ' ', '\xE2', '\x82', '\x92', ' ', '\xE2', '\x82', '\x93', ' ', '\xE2', '\x82', '\x99', ' ', '\xE2', '\x82', '\x9B', ' ', '\xE1', '\xB5', '\xA5', ' ', '\xE1', '\xB5', '\xA4', ' ', '\xE1', '\xB5', '\xA3',  /* ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ */
+    '\0',
+    '\xE1', '\xB5', '\xA6', ' ', '\xE1', '\xB5', '\xA7', ' ', '\xE1', '\xB5', '\xA8', ' ', '\xE1', '\xB5', '\xA9', ' ', '\xE2', '\x82', '\x9A',  /* ᵦ ᵧ ᵨ ᵩ ₚ */
+    '\0',
+    '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB3', ' ', '\xE2', '\x81', '\xB5', ' ', '\xE2', '\x81', '\xB7', ' ', '\xE1', '\xB5', '\x80', ' ', '\xE1', '\xB4', '\xB4', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xBC',  /* ⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ */
+    '\0',
+    '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB9', ' ', '\xC2', '\xB2', ' ', '\xC2', '\xB3', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xB8', ' ', '\xE1', '\xB4', '\xBC', ' ', '\xE1', '\xB5', '\x81',  /* ⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ */
+    '\0',
+    '\xE1', '\xB5', '\x87', ' ', '\xE1', '\xB5', '\x88', ' ', '\xE1', '\xB5', '\x8F', ' ', '\xCA', '\xB0', ' ', '\xCA', '\xB2', ' ', '\xE1', '\xB6', '\xA0', ' ', '\xE2', '\x81', '\xB1',  /* ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ */
+    '\0',
+    '\xE1', '\xB5', '\x89', ' ', '\xE1', '\xB5', '\x92', ' ', '\xCA', '\xB3', ' ', '\xCB', '\xA2', ' ', '\xCB', '\xA3', ' ', '\xE1', '\xB6', '\x9C', ' ', '\xE1', '\xB6', '\xBB',  /* ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ */
+    '\0',
+    '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D',  /* ᵖ ʸ ᵍ */
+    '\0',
+    '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\xA7', ' ', '\xEA', '\x93', '\xB1', ' ', '\xEA', '\x93', '\xB6', ' ', '\xEA', '\x93', '\xA9', ' ', '\xEA', '\x93', '\x9A', ' ', '\xEA', '\x93', '\xB5', ' ', '\xEA', '\x93', '\xB3',  /* ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ */
+    '\0',
+    '\xEA', '\x93', '\x95', ' ', '\xEA', '\x93', '\x9C', ' ', '\xEA', '\x93', '\x9E', ' ', '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\x9B', ' ', '\xEA', '\x93', '\xA2', ' ', '\xEA', '\x93', '\xB3', ' ', '\xEA', '\x93', '\xB4',  /* ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ */
+    '\0',
+    '\xE0', '\xB4', '\x92', ' ', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xB1', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', ' ', '\xE0', '\xB4', '\x9A', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\xAA',  /* ഒ ട ഠ റ ച പ ച്ച പ്പ */
+    '\0',
+    '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2',  /* ട ഠ ധ ശ ഘ ച ഥ ല */
+    '\0',
+    '\xE1', '\x80', '\x81', ' ', '\xE1', '\x80', '\x82', ' ', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\xA5', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B',  /* ခ ဂ င ဒ ဝ ၥ ၊ ။ */
+    '\0',
+    '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x8E', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x95', ' ', '\xE1', '\x80', '\x97', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B',  /* င ဎ ဒ ပ ဗ ဝ ၊ ။ */
+    '\0',
+    '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xBC', ' ', '\xE1', '\x81', '\x8D', ' ', '\xE1', '\x81', '\x8F', ' ', '\xE1', '\x81', '\x86', ' ', '\xE1', '\x80', '\xAB', ' ', '\xE1', '\x80', '\xAD',  /* ဩ ြ ၍ ၏ ၆ ါ ိ */
+    '\0',
+    '\xE1', '\x80', '\x89', ' ', '\xE1', '\x80', '\x8A', ' ', '\xE1', '\x80', '\xA5', ' ', '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xA8', ' ', '\xE1', '\x81', '\x82', ' ', '\xE1', '\x81', '\x85', ' ', '\xE1', '\x81', '\x89',  /* ဉ ည ဥ ဩ ဨ ၂ ၅ ၉ */
+    '\0',
+    '\xDF', '\x90', ' ', '\xDF', '\x89', ' ', '\xDF', '\x92', ' ', '\xDF', '\x9F', ' ', '\xDF', '\x96', ' ', '\xDF', '\x9C', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5',  /* ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ */
+    '\0',
+    '\xDF', '\x80', ' ', '\xDF', '\x98', ' ', '\xDF', '\xA1', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5',  /* ߀ ߘ ߡ ߠ ߥ */
+    '\0',
+    '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B',  /* ߏ ߛ ߋ */
+    '\0',
+    '\xDF', '\x8E', ' ', '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B',  /* ߎ ߏ ߛ ߋ */
+    '\0',
+    '\xE1', '\xB1', '\x9B', ' ', '\xE1', '\xB1', '\x9C', ' ', '\xE1', '\xB1', '\x9D', ' ', '\xE1', '\xB1', '\xA1', ' ', '\xE1', '\xB1', '\xA2', ' ', '\xE1', '\xB1', '\xA5',  /* ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ */
+    '\0',
+    '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\x98', ' ', '\xF0', '\x90', '\xB0', '\xA7',  /* 𐰗 𐰘 𐰧 */
+    '\0',
+    '\xF0', '\x90', '\xB0', '\x89', ' ', '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\xA6', ' ', '\xF0', '\x90', '\xB0', '\xA7',  /* 𐰉 𐰗 𐰦 𐰧 */
+    '\0',
+    '\xF0', '\x90', '\x92', '\xBE', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x92', ' ', '\xF0', '\x90', '\x93', '\x93', ' ', '\xF0', '\x90', '\x92', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xB5', ' ', '\xF0', '\x90', '\x93', '\x86',  /* 𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆 */
+    '\0',
+    '\xF0', '\x90', '\x92', '\xB0', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xBF', ' ', '\xF0', '\x90', '\x93', '\x8E', ' ', '\xF0', '\x90', '\x92', '\xB9',  /* 𐒰 𐓍 𐓂 𐒿 𐓎 𐒹 */
+    '\0',
+    '\xF0', '\x90', '\x92', '\xBC', ' ', '\xF0', '\x90', '\x92', '\xBD', ' ', '\xF0', '\x90', '\x92', '\xBE',  /* 𐒼 𐒽 𐒾 */
+    '\0',
+    '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xB6', ' ', '\xF0', '\x90', '\x93', '\xBA', ' ', '\xF0', '\x90', '\x93', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x9D', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xAE',  /* 𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮 */
+    '\0',
+    '\xF0', '\x90', '\x93', '\x98', ' ', '\xF0', '\x90', '\x93', '\x9A', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xA1', ' ', '\xF0', '\x90', '\x93', '\xA7', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xB6',  /* 𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶 */
+    '\0',
+    '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA6', ' ', '\xF0', '\x90', '\x93', '\xB8', ' ', '\xF0', '\x90', '\x93', '\xB9', ' ', '\xF0', '\x90', '\x93', '\x9B',  /* 𐓤 𐓦 𐓸 𐓹 𐓛 */
+    '\0',
+    '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA5', ' ', '\xF0', '\x90', '\x93', '\xA6',  /* 𐓤 𐓥 𐓦 */
+    '\0',
+    '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x89', ' ', '\xF0', '\x90', '\x92', '\x90', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\x98', ' ', '\xF0', '\x90', '\x92', '\x9B', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA3',  /* 𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣 */
+    '\0',
+    '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9',  /* 𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩 */
+    '\0',
+    '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B',  /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ */
+    '\0',
+    '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E',  /* ꢂ ꢨ ꢺ ꢤ ꢎ */
+    '\0',
+    '\xF0', '\x90', '\x91', '\x95', ' ', '\xF0', '\x90', '\x91', '\x99',  /* 𐑕 𐑙 */
+    '\0',
+    '\xF0', '\x90', '\x91', '\x94', ' ', '\xF0', '\x90', '\x91', '\x96', ' ', '\xF0', '\x90', '\x91', '\x97', ' ', '\xF0', '\x90', '\x91', '\xB9', ' ', '\xF0', '\x90', '\x91', '\xBB',  /* 𐑔 𐑖 𐑗 𐑹 𐑻 */
+    '\0',
+    '\xF0', '\x90', '\x91', '\x9F', ' ', '\xF0', '\x90', '\x91', '\xA3',  /* 𐑟 𐑣 */
+    '\0',
+    '\xF0', '\x90', '\x91', '\xB1', ' ', '\xF0', '\x90', '\x91', '\xB2', ' ', '\xF0', '\x90', '\x91', '\xB3', ' ', '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xB8', ' ', '\xF0', '\x90', '\x91', '\xBA', ' ', '\xF0', '\x90', '\x91', '\xBC',  /* 𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼 */
+    '\0',
+    '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xBB', ' ', '\xF0', '\x90', '\x91', '\xB9',  /* 𐑴 𐑻 𐑹 */
+    '\0',
+    '\xE0', '\xB6', '\x89', ' ', '\xE0', '\xB6', '\x9A', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\xB4', ' ', '\xE0', '\xB6', '\xBA', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB7', '\x86',  /* ඉ ක ඝ ඳ ප ය ල ෆ */
+    '\0',
+    '\xE0', '\xB6', '\x91', ' ', '\xE0', '\xB6', '\x94', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xA2', ' ', '\xE0', '\xB6', '\xA7', ' ', '\xE0', '\xB6', '\xAE', ' ', '\xE0', '\xB6', '\xB0', ' ', '\xE0', '\xB6', '\xBB',  /* එ ඔ ඝ ජ ට ථ ධ ර */
+    '\0',
+    '\xE0', '\xB6', '\xAF', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\x8B', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x96', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xB6', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xAF', '\xE0', '\xB7', '\x94',  /* ද ඳ උ ල තූ තු බු දු */
+    '\0',
+    '\xE1', '\xAE', '\x8B', ' ', '\xE1', '\xAE', '\x9E', ' ', '\xE1', '\xAE', '\xAE', ' ', '\xE1', '\xAE', '\xBD', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x88',  /* ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ */
+    '\0',
+    '\xE1', '\xAE', '\x84', ' ', '\xE1', '\xAE', '\x94', ' ', '\xE1', '\xAE', '\x95', ' ', '\xE1', '\xAE', '\x97', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x86', ' ', '\xE1', '\xAE', '\x88', ' ', '\xE1', '\xAE', '\x89',  /* ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ */
+    '\0',
+    '\xE1', '\xAE', '\xBC', ' ', '\xE1', '\xB3', '\x84',  /* ᮼ ᳄ */
+    '\0',
+    '\xEA', '\xAA', '\x86', ' ', '\xEA', '\xAA', '\x94', ' ', '\xEA', '\xAA', '\x92', ' ', '\xEA', '\xAA', '\x96', ' ', '\xEA', '\xAA', '\xAB',  /* ꪆ ꪔ ꪒ ꪖ ꪫ */
+    '\0',
+    '\xEA', '\xAA', '\x89', ' ', '\xEA', '\xAA', '\xAB', ' ', '\xEA', '\xAA', '\xAE',  /* ꪉ ꪫ ꪮ */
+    '\0',
+    '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x92', ' ', '\xE0', '\xAE', '\x93', ' ', '\xE0', '\xAE', '\xB1', ' ', '\xE0', '\xAE', '\x88', ' ', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9A',  /* உ ஒ ஓ ற ஈ க ங ச */
+    '\0',
+    '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x9A', ' ', '\xE0', '\xAE', '\xB2', ' ', '\xE0', '\xAE', '\xB6', ' ', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9F', ' ', '\xE0', '\xAE', '\xAA',  /* க ச ல ஶ உ ங ட ப */
+    '\0',
+    '\xE0', '\xB0', '\x87', ' ', '\xE0', '\xB0', '\x8C', ' ', '\xE0', '\xB0', '\x99', ' ', '\xE0', '\xB0', '\x9E', ' ', '\xE0', '\xB0', '\xA3', ' ', '\xE0', '\xB0', '\xB1', ' ', '\xE0', '\xB1', '\xAF',  /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */
+    '\0',
+    '\xE0', '\xB0', '\x85', ' ', '\xE0', '\xB0', '\x95', ' ', '\xE0', '\xB0', '\x9A', ' ', '\xE0', '\xB0', '\xB0', ' ', '\xE0', '\xB0', '\xBD', ' ', '\xE0', '\xB1', '\xA8', ' ', '\xE0', '\xB1', '\xAC',  /* అ క చ ర ఽ ౨ ౬ */
+    '\0',
+    '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB9', '\x80', ' ', '\xE0', '\xB9', '\x81', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\x81', ' ', '\xE0', '\xB8', '\xB2',  /* บ เ แ อ ก า */
+    '\0',
+    '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\xA9', ' ', '\xE0', '\xB8', '\xAF', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\xA2', ' ', '\xE0', '\xB8', '\xAE',  /* บ ป ษ ฯ อ ย ฮ */
+    '\0',
+    '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\x9D', ' ', '\xE0', '\xB8', '\x9F',  /* ป ฝ ฟ */
+    '\0',
+    '\xE0', '\xB9', '\x82', ' ', '\xE0', '\xB9', '\x83', ' ', '\xE0', '\xB9', '\x84',  /* โ ใ ไ */
+    '\0',
+    '\xE0', '\xB8', '\x8E', ' ', '\xE0', '\xB8', '\x8F', ' ', '\xE0', '\xB8', '\xA4', ' ', '\xE0', '\xB8', '\xA6',  /* ฎ ฏ ฤ ฦ */
+    '\0',
+    '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90',  /* ญ ฐ */
+    '\0',
+    '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93',  /* ๐ ๑ ๓ */
+    '\0',
+    '\xE2', '\xB5', '\x94', ' ', '\xE2', '\xB5', '\x99', ' ', '\xE2', '\xB5', '\x9B', ' ', '\xE2', '\xB5', '\x9E', ' ', '\xE2', '\xB4', '\xB5', ' ', '\xE2', '\xB4', '\xBC', ' ', '\xE2', '\xB4', '\xB9', ' ', '\xE2', '\xB5', '\x8E',  /* ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ */
+    '\0',
+    '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x98', '\x9C', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x96', '\x9D', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2',  /* ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ */
+    '\0',
+    '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x97', '\x9E', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x94', '\x86',  /* ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ */
 #ifdef AF_CONFIG_OPTION_CJK
     '\0',
-    '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0',  /* 他们你來們到和地 */
-    '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1', '\xE5', '\xB8', '\xAD', '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x83',  /* 对對就席我时時會 */
-    '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\x83', '\xBD', '\xE8', '\x88', '\xB0', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99',  /* 来為能舰說说这這 */
-    '\xE9', '\xBD', '\x8A', '|',  /* 齊 | */
-    '\xE5', '\x86', '\x9B', '\xE5', '\x90', '\x8C', '\xE5', '\xB7', '\xB2', '\xE6', '\x84', '\xBF', '\xE6', '\x97', '\xA2', '\xE6', '\x98', '\x9F', '\xE6', '\x98', '\xAF', '\xE6', '\x99', '\xAF',  /* 军同已愿既星是景 */
-    '\xE6', '\xB0', '\x91', '\xE7', '\x85', '\xA7', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\xA8', '\xE7', '\xBD', '\xAE', '\xE8', '\xA6', '\x81',  /* 民照现現理用置要 */
-    '\xE8', '\xBB', '\x8D', '\xE9', '\x82', '\xA3', '\xE9', '\x85', '\x8D', '\xE9', '\x87', '\x8C', '\xE9', '\x96', '\x8B', '\xE9', '\x9B', '\xB7', '\xE9', '\x9C', '\xB2', '\xE9', '\x9D', '\xA2',  /* 軍那配里開雷露面 */
-    '\xE9', '\xA1', '\xBE',  /* 顾 */
+    '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0',  /* 他 们 你 來 們 到 和 地 */
+    ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB8', '\xAD', ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x83',  /*  对 對 就 席 我 时 時 會 */
+    ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\x88', '\xB0', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99',  /*  来 為 能 舰 說 说 这 這 */
+    ' ', '\xE9', '\xBD', '\x8A', ' ', '|',  /*  齊 | */
+    ' ', '\xE5', '\x86', '\x9B', ' ', '\xE5', '\x90', '\x8C', ' ', '\xE5', '\xB7', '\xB2', ' ', '\xE6', '\x84', '\xBF', ' ', '\xE6', '\x97', '\xA2', ' ', '\xE6', '\x98', '\x9F', ' ', '\xE6', '\x98', '\xAF', ' ', '\xE6', '\x99', '\xAF',  /*  军 同 已 愿 既 星 是 景 */
+    ' ', '\xE6', '\xB0', '\x91', ' ', '\xE7', '\x85', '\xA7', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\xA8', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\xA6', '\x81',  /*  民 照 现 現 理 用 置 要 */
+    ' ', '\xE8', '\xBB', '\x8D', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x85', '\x8D', ' ', '\xE9', '\x87', '\x8C', ' ', '\xE9', '\x96', '\x8B', ' ', '\xE9', '\x9B', '\xB7', ' ', '\xE9', '\x9C', '\xB2', ' ', '\xE9', '\x9D', '\xA2',  /*  軍 那 配 里 開 雷 露 面 */
+    ' ', '\xE9', '\xA1', '\xBE',  /*  顾 */
     '\0',
-    '\xE4', '\xB8', '\xAA', '\xE4', '\xB8', '\xBA', '\xE4', '\xBA', '\xBA', '\xE4', '\xBB', '\x96', '\xE4', '\xBB', '\xA5', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86',  /* 个为人他以们你來 */
-    '\xE5', '\x80', '\x8B', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\xA4', '\xA7', '\xE5', '\xAF', '\xB9', '\xE5', '\xB0', '\x8D', '\xE5', '\xB0', '\xB1',  /* 個們到和大对對就 */
-    '\xE6', '\x88', '\x91', '\xE6', '\x97', '\xB6', '\xE6', '\x99', '\x82', '\xE6', '\x9C', '\x89', '\xE6', '\x9D', '\xA5', '\xE7', '\x82', '\xBA', '\xE8', '\xA6', '\x81', '\xE8', '\xAA', '\xAA',  /* 我时時有来為要說 */
-    '\xE8', '\xAF', '\xB4', '|',  /* 说 | */
-    '\xE4', '\xB8', '\xBB', '\xE4', '\xBA', '\x9B', '\xE5', '\x9B', '\xA0', '\xE5', '\xAE', '\x83', '\xE6', '\x83', '\xB3', '\xE6', '\x84', '\x8F', '\xE7', '\x90', '\x86', '\xE7', '\x94', '\x9F',  /* 主些因它想意理生 */
-    '\xE7', '\x95', '\xB6', '\xE7', '\x9C', '\x8B', '\xE7', '\x9D', '\x80', '\xE7', '\xBD', '\xAE', '\xE8', '\x80', '\x85', '\xE8', '\x87', '\xAA', '\xE8', '\x91', '\x97', '\xE8', '\xA3', '\xA1',  /* 當看着置者自著裡 */
-    '\xE8', '\xBF', '\x87', '\xE8', '\xBF', '\x98', '\xE8', '\xBF', '\x9B', '\xE9', '\x80', '\xB2', '\xE9', '\x81', '\x8E', '\xE9', '\x81', '\x93', '\xE9', '\x82', '\x84', '\xE9', '\x87', '\x8C',  /* 过还进進過道還里 */
-    '\xE9', '\x9D', '\xA2',  /* 面 */
+    '\xE4', '\xB8', '\xAA', ' ', '\xE4', '\xB8', '\xBA', ' ', '\xE4', '\xBA', '\xBA', ' ', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xA5', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86',  /* 个 为 人 他 以 们 你 來 */
+    ' ', '\xE5', '\x80', '\x8B', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\xA4', '\xA7', ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1',  /*  個 們 到 和 大 对 對 就 */
+    ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x89', ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\xA6', '\x81', ' ', '\xE8', '\xAA', '\xAA',  /*  我 时 時 有 来 為 要 說 */
+    ' ', '\xE8', '\xAF', '\xB4', ' ', '|',  /*  说 | */
+    ' ', '\xE4', '\xB8', '\xBB', ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE5', '\x9B', '\xA0', ' ', '\xE5', '\xAE', '\x83', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x84', '\x8F', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\x9F',  /*  主 些 因 它 想 意 理 生 */
+    ' ', '\xE7', '\x95', '\xB6', ' ', '\xE7', '\x9C', '\x8B', ' ', '\xE7', '\x9D', '\x80', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\x80', '\x85', ' ', '\xE8', '\x87', '\xAA', ' ', '\xE8', '\x91', '\x97', ' ', '\xE8', '\xA3', '\xA1',  /*  當 看 着 置 者 自 著 裡 */
+    ' ', '\xE8', '\xBF', '\x87', ' ', '\xE8', '\xBF', '\x98', ' ', '\xE8', '\xBF', '\x9B', ' ', '\xE9', '\x80', '\xB2', ' ', '\xE9', '\x81', '\x8E', ' ', '\xE9', '\x81', '\x93', ' ', '\xE9', '\x82', '\x84', ' ', '\xE9', '\x87', '\x8C',  /*  过 还 进 進 過 道 還 里 */
+    ' ', '\xE9', '\x9D', '\xA2',  /*  面 */
 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
     '\0',
-    '\xE4', '\xBA', '\x9B', '\xE4', '\xBB', '\xAC', '\xE4', '\xBD', '\xA0', '\xE4', '\xBE', '\x86', '\xE5', '\x80', '\x91', '\xE5', '\x88', '\xB0', '\xE5', '\x92', '\x8C', '\xE5', '\x9C', '\xB0',  /* 些们你來們到和地 */
-    '\xE5', '\xA5', '\xB9', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE5', '\xB0', '\xB1', '\xE5', '\xB9', '\xB4', '\xE5', '\xBE', '\x97', '\xE6', '\x83', '\x85', '\xE6', '\x9C', '\x80',  /* 她将將就年得情最 */
-    '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE7', '\x90', '\x86', '\xE8', '\x83', '\xBD', '\xE8', '\xAA', '\xAA', '\xE8', '\xAF', '\xB4', '\xE8', '\xBF', '\x99', '\xE9', '\x80', '\x99',  /* 样樣理能說说这這 */
-    '\xE9', '\x80', '\x9A', '|',  /* 通 | */
-    '\xE5', '\x8D', '\xB3', '\xE5', '\x90', '\x97', '\xE5', '\x90', '\xA7', '\xE5', '\x90', '\xAC', '\xE5', '\x91', '\xA2', '\xE5', '\x93', '\x81', '\xE5', '\x93', '\x8D', '\xE5', '\x97', '\x8E',  /* 即吗吧听呢品响嗎 */
-    '\xE5', '\xB8', '\x88', '\xE5', '\xB8', '\xAB', '\xE6', '\x94', '\xB6', '\xE6', '\x96', '\xAD', '\xE6', '\x96', '\xB7', '\xE6', '\x98', '\x8E', '\xE7', '\x9C', '\xBC', '\xE9', '\x96', '\x93',  /* 师師收断斷明眼間 */
-    '\xE9', '\x97', '\xB4', '\xE9', '\x99', '\x85', '\xE9', '\x99', '\x88', '\xE9', '\x99', '\x90', '\xE9', '\x99', '\xA4', '\xE9', '\x99', '\xB3', '\xE9', '\x9A', '\x8F', '\xE9', '\x9A', '\x9B',  /* 间际陈限除陳随際 */
-    '\xE9', '\x9A', '\xA8',  /* 隨 */
+    ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0',  /*  些 们 你 來 們 到 和 地 */
+    ' ', '\xE5', '\xA5', '\xB9', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB9', '\xB4', ' ', '\xE5', '\xBE', '\x97', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x9C', '\x80',  /*  她 将 將 就 年 得 情 最 */
+    ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE7', '\x90', '\x86', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99',  /*  样 樣 理 能 說 说 这 這 */
+    ' ', '\xE9', '\x80', '\x9A', ' ', '|',  /*  通 | */
+    ' ', '\xE5', '\x8D', '\xB3', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x90', '\xA7', ' ', '\xE5', '\x90', '\xAC', ' ', '\xE5', '\x91', '\xA2', ' ', '\xE5', '\x93', '\x81', ' ', '\xE5', '\x93', '\x8D', ' ', '\xE5', '\x97', '\x8E',  /*  即 吗 吧 听 呢 品 响 嗎 */
+    ' ', '\xE5', '\xB8', '\x88', ' ', '\xE5', '\xB8', '\xAB', ' ', '\xE6', '\x94', '\xB6', ' ', '\xE6', '\x96', '\xAD', ' ', '\xE6', '\x96', '\xB7', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE7', '\x9C', '\xBC', ' ', '\xE9', '\x96', '\x93',  /*  师 師 收 断 斷 明 眼 間 */
+    ' ', '\xE9', '\x97', '\xB4', ' ', '\xE9', '\x99', '\x85', ' ', '\xE9', '\x99', '\x88', ' ', '\xE9', '\x99', '\x90', ' ', '\xE9', '\x99', '\xA4', ' ', '\xE9', '\x99', '\xB3', ' ', '\xE9', '\x9A', '\x8F', ' ', '\xE9', '\x9A', '\x9B',  /*  间 际 陈 限 除 陳 随 際 */
+    ' ', '\xE9', '\x9A', '\xA8',  /*  隨 */
     '\0',
-    '\xE4', '\xBA', '\x8B', '\xE5', '\x89', '\x8D', '\xE5', '\xAD', '\xB8', '\xE5', '\xB0', '\x86', '\xE5', '\xB0', '\x87', '\xE6', '\x83', '\x85', '\xE6', '\x83', '\xB3', '\xE6', '\x88', '\x96',  /* 事前學将將情想或 */
-    '\xE6', '\x94', '\xBF', '\xE6', '\x96', '\xAF', '\xE6', '\x96', '\xB0', '\xE6', '\xA0', '\xB7', '\xE6', '\xA8', '\xA3', '\xE6', '\xB0', '\x91', '\xE6', '\xB2', '\x92', '\xE6', '\xB2', '\xA1',  /* 政斯新样樣民沒没 */
-    '\xE7', '\x84', '\xB6', '\xE7', '\x89', '\xB9', '\xE7', '\x8E', '\xB0', '\xE7', '\x8F', '\xBE', '\xE7', '\x90', '\x83', '\xE7', '\xAC', '\xAC', '\xE7', '\xB6', '\x93', '\xE8', '\xB0', '\x81',  /* 然特现現球第經谁 */
-    '\xE8', '\xB5', '\xB7', '|',  /* 起 | */
-    '\xE4', '\xBE', '\x8B', '\xE5', '\x88', '\xA5', '\xE5', '\x88', '\xAB', '\xE5', '\x88', '\xB6', '\xE5', '\x8A', '\xA8', '\xE5', '\x8B', '\x95', '\xE5', '\x90', '\x97', '\xE5', '\x97', '\x8E',  /* 例別别制动動吗嗎 */
-    '\xE5', '\xA2', '\x9E', '\xE6', '\x8C', '\x87', '\xE6', '\x98', '\x8E', '\xE6', '\x9C', '\x9D', '\xE6', '\x9C', '\x9F', '\xE6', '\x9E', '\x84', '\xE7', '\x89', '\xA9', '\xE7', '\xA1', '\xAE',  /* 增指明朝期构物确 */
-    '\xE7', '\xA7', '\x8D', '\xE8', '\xAA', '\xBF', '\xE8', '\xB0', '\x83', '\xE8', '\xB2', '\xBB', '\xE8', '\xB4', '\xB9', '\xE9', '\x82', '\xA3', '\xE9', '\x83', '\xBD', '\xE9', '\x96', '\x93',  /* 种調调費费那都間 */
-    '\xE9', '\x97', '\xB4',  /* 间 */
+    '\xE4', '\xBA', '\x8B', ' ', '\xE5', '\x89', '\x8D', ' ', '\xE5', '\xAD', '\xB8', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x88', '\x96',  /* 事 前 學 将 將 情 想 或 */
+    ' ', '\xE6', '\x94', '\xBF', ' ', '\xE6', '\x96', '\xAF', ' ', '\xE6', '\x96', '\xB0', ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE6', '\xB0', '\x91', ' ', '\xE6', '\xB2', '\x92', ' ', '\xE6', '\xB2', '\xA1',  /*  政 斯 新 样 樣 民 沒 没 */
+    ' ', '\xE7', '\x84', '\xB6', ' ', '\xE7', '\x89', '\xB9', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x83', ' ', '\xE7', '\xAC', '\xAC', ' ', '\xE7', '\xB6', '\x93', ' ', '\xE8', '\xB0', '\x81',  /*  然 特 现 現 球 第 經 谁 */
+    ' ', '\xE8', '\xB5', '\xB7', ' ', '|',  /*  起 | */
+    ' ', '\xE4', '\xBE', '\x8B', ' ', '\xE5', '\x88', '\xA5', ' ', '\xE5', '\x88', '\xAB', ' ', '\xE5', '\x88', '\xB6', ' ', '\xE5', '\x8A', '\xA8', ' ', '\xE5', '\x8B', '\x95', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x97', '\x8E',  /*  例 別 别 制 动 動 吗 嗎 */
+    ' ', '\xE5', '\xA2', '\x9E', ' ', '\xE6', '\x8C', '\x87', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE6', '\x9C', '\x9D', ' ', '\xE6', '\x9C', '\x9F', ' ', '\xE6', '\x9E', '\x84', ' ', '\xE7', '\x89', '\xA9', ' ', '\xE7', '\xA1', '\xAE',  /*  增 指 明 朝 期 构 物 确 */
+    ' ', '\xE7', '\xA7', '\x8D', ' ', '\xE8', '\xAA', '\xBF', ' ', '\xE8', '\xB0', '\x83', ' ', '\xE8', '\xB2', '\xBB', ' ', '\xE8', '\xB4', '\xB9', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x83', '\xBD', ' ', '\xE9', '\x96', '\x93',  /*  种 調 调 費 费 那 都 間 */
+    ' ', '\xE9', '\x97', '\xB4',  /*  间 */
 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
 #endif /* AF_CONFIG_OPTION_CJK                */
     '\0',
@@ -139,9 +443,77 @@
   af_blue_stringsets[] =
   {
     /* */
-    { AF_BLUE_STRING_ARABIC_TOP,   AF_BLUE_PROPERTY_LATIN_TOP },
-    { AF_BLUE_STRING_ARABIC_JOIN,  0                          },
+    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 },
+    { AF_BLUE_STRING_MAX,                  0                                 },
+    { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     },
+    { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              },
+    { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL },
+    { AF_BLUE_STRING_MAX,           0                              },
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                      0                                 },
+    { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,            0                          },
+    { AF_BLUE_STRING_BAMUM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_BAMUM_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,          0                          },
+    { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
+                                   AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
+                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_BENGALI_BASE, 0                                 },
+    { AF_BLUE_STRING_MAX,          0                                 },
+    { AF_BLUE_STRING_BUHID_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_BUHID_LARGE,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_BUHID_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP      |
+                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_BUHID_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_MAX,          0                                 },
+    { AF_BLUE_STRING_CHAKMA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          },
+    { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          },
+    { AF_BLUE_STRING_MAX,              0                          },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,             AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,          0                                 },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,     0                                 },
+    { AF_BLUE_STRING_MAX,                                0                                 },
+    { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,           0                          },
+    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 },
+    { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 },
+    { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                      0                                 },
+    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 },
+    { AF_BLUE_STRING_MAX,                   0                                 },
+    { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          },
+    { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          },
+    { AF_BLUE_STRING_MAX,            0                          },
     { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 },
     { AF_BLUE_STRING_CYRILLIC_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
@@ -157,6 +529,40 @@
     { AF_BLUE_STRING_DEVANAGARI_BASE,   0                                 },
     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 },
     { AF_BLUE_STRING_MAX,               0                                 },
+    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 },
+    { AF_BLUE_STRING_MAX,                    0                                 },
+    { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,             0                          },
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM,     0                                 },
+    { AF_BLUE_STRING_MAX,                          0                                 },
+    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                         0                                 },
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 },
+    { AF_BLUE_STRING_MAX,                       0                                 },
+    { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,           0                          },
     { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 },
     { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        },
@@ -165,22 +571,145 @@
     { AF_BLUE_STRING_GREEK_SMALL,           0                                 },
     { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,                   0                                 },
+    { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_MAX,                0                                 },
+    { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_MAX,                0                                 },
     { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
                                        AF_BLUE_PROPERTY_LATIN_LONG   },
     { AF_BLUE_STRING_HEBREW_BOTTOM,    0                             },
     { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             },
     { AF_BLUE_STRING_MAX,              0                             },
+    { AF_BLUE_STRING_KAYAH_LI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_KAYAH_LI_BOTTOM,          0                                 },
+    { AF_BLUE_STRING_KAYAH_LI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 },
+    { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                      0                                 },
+    { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    },
+    { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 },
+    { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 },
+    { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                   0                                 },
+    { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_MAX,                         0                                 },
+    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,            0                          },
+    { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_LAO_BOTTOM,         0                                 },
+    { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LAO_DESCENDER,      0                                 },
+    { AF_BLUE_STRING_MAX,                0                                 },
     { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
     { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 },
     { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
-    { AF_BLUE_STRING_LATIN_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+    { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
-    { AF_BLUE_STRING_LATIN_SMALL,           0                                 },
+    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 },
     { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,                   0                                 },
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 },
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                        0                                 },
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 },
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,                        0                                 },
+    { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_LISU_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,         0                          },
+    { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,              0                          },
+    { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 },
+    { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 },
+    { AF_BLUE_STRING_MAX,               0                                 },
+    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_NKO_BOTTOM,       0                                 },
+    { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_MAX,              0                                 },
+    { AF_BLUE_STRING_MAX, 0 },
+    { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_OL_CHIKI, 0                          },
+    { AF_BLUE_STRING_MAX,      0                          },
+    { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,               0                          },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                },
+    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                },
+    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
+                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT  },
+    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                },
+    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       },
+    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                },
+    { AF_BLUE_STRING_MAX,                     0                                },
+    { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,            0                          },
+    { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,               0                          },
+    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        },
+    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 },
+    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 },
+    { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
+    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 },
+    { AF_BLUE_STRING_MAX,                  0                                 },
+    { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          },
+    { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          },
+    { AF_BLUE_STRING_MAX,               0                          },
+    { AF_BLUE_STRING_SUNDANESE_TOP,       AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_SUNDANESE_BOTTOM,    0                          },
+    { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0                          },
+    { AF_BLUE_STRING_MAX,                 0                          },
+    { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,          0                          },
+    { AF_BLUE_STRING_TAI_VIET_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,             0                          },
     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,           0                          },
+    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_TIFINAGH, 0                          },
+    { AF_BLUE_STRING_MAX,      0                          },
     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_THAI_BOTTOM,          0                                 },
@@ -190,6 +719,9 @@
     { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 },
     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 },
     { AF_BLUE_STRING_MAX,                  0                                 },
+    { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_VAI_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,        0                          },
 #ifdef AF_CONFIG_OPTION_CJK
     { AF_BLUE_STRING_CJK_TOP,    AF_BLUE_PROPERTY_CJK_TOP     },
     { AF_BLUE_STRING_CJK_BOTTOM, 0                            },
diff --git a/src/autofit/afblue.cin b/src/autofit/afblue.cin
index b303a4b..4913e2e 100644
--- a/src/autofit/afblue.cin
+++ b/src/autofit/afblue.cin
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/autofit/afblue.dat b/src/autofit/afblue.dat
index fd5684e..bc2f0d2 100644
--- a/src/autofit/afblue.dat
+++ b/src/autofit/afblue.dat
@@ -2,7 +2,7 @@
 //
 //    Auto-fitter data for blue strings.
 //
-//  Copyright 2013-2015 by
+//  Copyright 2013-2018 by
 //  David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 //  This file is part of the FreeType project, and may only be used,
@@ -20,9 +20,8 @@
 // labels separated by whitespace and followed by a colon (everything in a
 // single line); the first label gives the name of the enumeration template,
 // the second the name of the array template, and the third the name of the
-// `maximum' template, holding the size of the largest array element.  The
-// script then fills the corresponding templates (indicated by `@'
-// characters around the name).
+// `maximum' template.  The script then fills the corresponding templates
+// (indicated by `@' characters around the name).
 //
 // A section contains one or more data records.  Each data record consists
 // of two or more lines.  The first line holds the enumeration name, and the
@@ -30,15 +29,20 @@
 //
 // There are two possible representations for array data.
 //
-// - A string of characters in UTF-8 encoding enclosed in double quotes,
-//   using C syntax.  There can be only one string per line, thus the
-//   starting and ending double quote must be the first and last character
-//   in the line, respectively, ignoring whitespace before and after the
-//   string.  Space characters within the string are ignored too.  If there
-//   are multiple strings (in multiple lines), they are concatenated to a
-//   single string.  In the output, a string gets represented as a series of
-//   singles bytes, followed by a zero byte.  The enumeration values simply
-//   hold byte offsets to the start of the corresponding strings.
+// - A string of characters or character clusters (for example, representing
+//   Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double
+//   quotes, using C syntax, where the elements are separated by spaces.
+//   There can be only one string per line, thus the starting and ending
+//   double quote must be the first and last character in the line,
+//   respectively, ignoring whitespace before and after the string.  If
+//   there are multiple strings (in multiple lines), they are concatenated
+//   to a single string.  In the output, a string gets represented as a
+//   series of singles bytes, followed by a zero byte.  The enumeration
+//   values simply hold byte offsets to the start of the corresponding
+//   strings.
+//
+//   For strings, the `maximum' template holds the maximum number of
+//   non-space characters in all strings.
 //
 // - Data blocks enclosed in balanced braces, which get copied verbatim and
 //   which can span multiple lines.  The opening brace of a block must be
@@ -47,6 +51,9 @@
 //   character after each block and counts the number of blocks to set the
 //   enumeration values.
 //
+//   For data blocks, the `maximum' template holds the maximum number of
+//   array elements.
+//
 // A section can contain either strings only or data blocks only.
 //
 // A comment line starts with `//'; it gets removed.  A preprocessor
@@ -58,8 +65,8 @@
 // values; this essentially means that the maximum values can easily be too
 // large.  Given that the purpose of those values is to create local
 // fixed-size arrays at compile time for further processing of the blue zone
-// data, this isn't a problem.  Note the the final zero byte of a string is
-// not counted.  Note also that the count holds the number of UTF-8 encoded
+// data, this isn't a problem.  Note the final zero byte of a string is not
+// counted.  Note also that the count holds the number of UTF-8 encoded
 // characters, not bytes.
 
 
@@ -67,22 +74,134 @@
 
 AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN:
 
+  AF_BLUE_STRING_ADLAM_CAPITAL_TOP
+    "𞤌 𞤅 𞤈 𞤏 𞤔 𞤚"
+  AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM
+    "𞤂 𞤖"
+  AF_BLUE_STRING_ADLAM_SMALL_TOP
+    "𞤬 𞤮 𞤻 𞤼 𞤾"
+  AF_BLUE_STRING_ADLAM_SMALL_BOTTOM
+    "𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀"
+
   AF_BLUE_STRING_ARABIC_TOP
     "ا إ ل ك ط ظ"
-  AF_BLUE_STRING_ARABIC_JOIN
+  AF_BLUE_STRING_ARABIC_BOTTOM
     "ت ث ط ظ ك"
+  // We don't necessarily have access to medial forms via Unicode in case
+  // Arabic presentational forms are missing.  The only character that is
+  // guaranteed to have the same vertical position with joining (this is,
+  // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both
+  // round and flat curves.
+  AF_BLUE_STRING_ARABIC_JOIN
+    "ـ"
+
+  AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP
+    "Ա Մ Ւ Ս Բ Գ Դ Օ"
+  AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM
+    "Ւ Ո Դ Ճ Շ Ս Տ Օ"
+  AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER
+    "ե է ի մ վ ֆ ճ"
+  AF_BLUE_STRING_ARMENIAN_SMALL_TOP
+    "ա յ ւ ս գ շ ր օ"
+  AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM
+    "հ ո ճ ա ե ծ ս օ"
+  AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER
+    "բ ը ի լ ղ պ փ ց"
+
+  AF_BLUE_STRING_AVESTAN_TOP
+    "𐬀 𐬁 𐬐 𐬛"
+  AF_BLUE_STRING_AVESTAN_BOTTOM
+    "𐬀 𐬁"
+
+  AF_BLUE_STRING_BAMUM_TOP
+    "ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ"
+  AF_BLUE_STRING_BAMUM_BOTTOM
+    "ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲"
+
+  AF_BLUE_STRING_BENGALI_BASE
+    "অ ড ত ন ব ভ ল ক"
+  AF_BLUE_STRING_BENGALI_TOP
+    "ই ট ঠ ি ী ৈ ৗ"
+  AF_BLUE_STRING_BENGALI_HEAD
+    "ও এ ড ত ন ব ল ক"
+
+  AF_BLUE_STRING_BUHID_TOP
+    "ᝐ ᝈ"
+  AF_BLUE_STRING_BUHID_LARGE
+    "ᝅ ᝊ ᝎ"
+  AF_BLUE_STRING_BUHID_SMALL
+    "ᝂ ᝃ ᝉ ᝌ"
+  AF_BLUE_STRING_BUHID_BOTTOM
+    "ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ"
+
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP
+    "ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ"
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM
+    "ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ"
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP
+    "ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ"
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM
+    "ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ"
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP
+    "ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ"
+  AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM
+    "ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ"
+
+  AF_BLUE_STRING_CARIAN_TOP
+    "𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿"
+  AF_BLUE_STRING_CARIAN_BOTTOM
+    "𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉"
+
+  AF_BLUE_STRING_CHAKMA_TOP
+    "𑄃 𑄅 𑄉 𑄙 𑄗"
+  AF_BLUE_STRING_CHAKMA_BOTTOM
+    "𑄅 𑄛 𑄝 𑄗 𑄓"
+  AF_BLUE_STRING_CHAKMA_DESCENDER
+    "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢"
+
+  AF_BLUE_STRING_CHEROKEE_CAPITAL
+    "Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ"
+  AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER
+    "ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ"
+  AF_BLUE_STRING_CHEROKEE_SMALL
+    "ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ"
+  AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER
+    "ᏸ ꮐ ꭹ ꭻ"
+
+  AF_BLUE_STRING_COPTIC_CAPITAL_TOP
+    "Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ"
+  AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM
+    "Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ"
+  AF_BLUE_STRING_COPTIC_SMALL_TOP
+    "ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ"
+  AF_BLUE_STRING_COPTIC_SMALL_BOTTOM
+    "ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ"
+
+  AF_BLUE_STRING_CYPRIOT_TOP
+    "𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦"
+  AF_BLUE_STRING_CYPRIOT_BOTTOM
+    "𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐"
+  AF_BLUE_STRING_CYPRIOT_SMALL
+    "𐠈 𐠏 𐠖"
 
   AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP
-    "БВЕПЗОСЭ"
+    "Б В Е П З О С Э"
   AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM
-    "БВЕШЗОСЭ"
+    "Б В Е Ш З О С Э"
   AF_BLUE_STRING_CYRILLIC_SMALL
-    "хпншезос"
+    "х п н ш е з о с"
   AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER
-    "руф"
+    "р у ф"
 
-  // we separate the letters with spaces to avoid ligatures;
-  // this is just for convenience to simplify reading
+  AF_BLUE_STRING_DESERET_CAPITAL_TOP
+    "𐐂 𐐄 𐐋 𐐗 𐐑"
+  AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM
+    "𐐀 𐐂 𐐄 𐐗 𐐛"
+  AF_BLUE_STRING_DESERET_SMALL_TOP
+    "𐐪 𐐬 𐐳 𐐿 𐐹"
+  AF_BLUE_STRING_DESERET_SMALL_BOTTOM
+    "𐐨 𐐪 𐐬 𐐿 𐑃"
+
   AF_BLUE_STRING_DEVANAGARI_BASE
     "क म अ आ थ ध भ श"
   AF_BLUE_STRING_DEVANAGARI_TOP
@@ -95,37 +214,270 @@
   AF_BLUE_STRING_DEVANAGARI_BOTTOM
     "ु ृ"
 
+  AF_BLUE_STRING_ETHIOPIC_TOP
+    "ሀ ሃ ዘ ፐ ማ በ ዋ ዐ"
+  AF_BLUE_STRING_ETHIOPIC_BOTTOM
+    "ለ ሐ በ ዘ ሀ ሪ ዐ ጨ"
+
+  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP
+    "გ დ ე ვ თ ი ო ღ"
+  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM
+    "ა ზ მ ს შ ძ ხ პ"
+  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER
+    "ს ხ ქ ზ მ შ ჩ წ"
+  AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER
+    "ე ვ ჟ ტ უ ფ ქ ყ"
+
+  AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP
+    "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ"
+  AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM
+    "Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ"
+
+  AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP
+    "ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ"
+  AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM
+    "ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ"
+  AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER
+    "ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ"
+  AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER
+    "ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ"
+
+  AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP
+    "Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ"
+  AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM
+    "Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ"
+
+  AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP
+    "Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ"
+  AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM
+    "Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ"
+  AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP
+    "ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ"
+  AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM
+    "ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ"
+
+  AF_BLUE_STRING_GOTHIC_TOP
+    "𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾"
+  AF_BLUE_STRING_GOTHIC_BOTTOM
+    "𐌶 𐌴 𐍃 𐍈"
+
   AF_BLUE_STRING_GREEK_CAPITAL_TOP
-    "ΓΒΕΖΘΟΩ"
+    "Γ Β Ε Ζ Θ Ο Ω"
   AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM
-    "ΒΔΖΞΘΟ"
+    "Β Δ Ζ Ξ Θ Ο"
   AF_BLUE_STRING_GREEK_SMALL_BETA_TOP
-    "βθδζλξ"
+    "β θ δ ζ λ ξ"
   AF_BLUE_STRING_GREEK_SMALL
-    "αειοπστω"
+    "α ε ι ο π σ τ ω"
   AF_BLUE_STRING_GREEK_SMALL_DESCENDER
-    "βγημρφχψ"
+    "β γ η μ ρ φ χ ψ"
+
+  AF_BLUE_STRING_GUJARATI_TOP
+    "ત ન ઋ ઌ છ ટ ર ૦"
+  AF_BLUE_STRING_GUJARATI_BOTTOM
+    "ખ ગ ઘ ઞ ઇ ઈ ઠ જ"
+  AF_BLUE_STRING_GUJARATI_ASCENDER
+    "ઈ ઊ િ ી લી શ્ચિ જિ સી"
+  AF_BLUE_STRING_GUJARATI_DESCENDER
+    "ુ ૃ ૄ ખુ છૃ છૄ"
+  AF_BLUE_STRING_GUJARATI_DIGIT_TOP
+    "૦ ૧ ૨ ૩ ૭"
+
+  AF_BLUE_STRING_GURMUKHI_BASE
+    "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
+  AF_BLUE_STRING_GURMUKHI_HEAD
+    "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ"
+  AF_BLUE_STRING_GURMUKHI_TOP
+    "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ"
+  AF_BLUE_STRING_GURMUKHI_BOTTOM
+    "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ"
+  AF_BLUE_STRING_GURMUKHI_DIGIT_TOP
+    "੦ ੧ ੨ ੩ ੭"
 
   AF_BLUE_STRING_HEBREW_TOP
-    "בדהחךכםס"
+    "ב ד ה ח ך כ ם ס"
   AF_BLUE_STRING_HEBREW_BOTTOM
-    "בטכםסצ"
+    "ב ט כ ם ס צ"
   AF_BLUE_STRING_HEBREW_DESCENDER
-    "קךןףץ"
+    "ק ך ן ף ץ"
+
+  AF_BLUE_STRING_KANNADA_TOP
+    "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ"
+  AF_BLUE_STRING_KANNADA_BOTTOM
+    "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭"
+
+  AF_BLUE_STRING_KAYAH_LI_TOP
+    "꤅ ꤏ ꤁ ꤋ ꤀ ꤍ"
+  AF_BLUE_STRING_KAYAH_LI_BOTTOM
+    "꤈ ꤘ ꤀ ꤍ ꤢ"
+  AF_BLUE_STRING_KAYAH_LI_ASCENDER
+    "ꤖ ꤡ"
+  AF_BLUE_STRING_KAYAH_LI_DESCENDER
+    "ꤑ ꤜ ꤞ"
+  AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER
+    "ꤑ꤬ ꤜ꤭ ꤔ꤬"
+
+  AF_BLUE_STRING_KHMER_TOP
+    "ខ ទ ន ឧ ឩ ា"
+  AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP
+    "ក្ក ក្ខ ក្គ ក្ថ"
+  AF_BLUE_STRING_KHMER_BOTTOM
+    "ខ ឃ ច ឋ ប ម យ ឲ"
+  AF_BLUE_STRING_KHMER_DESCENDER
+    "ត្រ រៀ ឲ្យ អឿ"
+  AF_BLUE_STRING_KHMER_LARGE_DESCENDER
+    "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ"
+
+  AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP
+    "᧠ ᧡"
+  AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM
+    "᧶ ᧹"
+
+  AF_BLUE_STRING_LAO_TOP
+    "າ ດ ອ ມ ລ ວ ຣ ງ"
+  AF_BLUE_STRING_LAO_BOTTOM
+    "າ ອ ບ ຍ ຣ ຮ ວ ຢ"
+  AF_BLUE_STRING_LAO_ASCENDER
+    "ປ ຢ ຟ ຝ"
+  AF_BLUE_STRING_LAO_LARGE_ASCENDER
+    "ໂ ໄ ໃ"
+  AF_BLUE_STRING_LAO_DESCENDER
+    "ງ ຊ ຖ ຽ ໆ ຯ"
 
   AF_BLUE_STRING_LATIN_CAPITAL_TOP
-    "THEZOCQS"
+    "T H E Z O C Q S"
   AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM
-    "HEZLOCUS"
+    "H E Z L O C U S"
   AF_BLUE_STRING_LATIN_SMALL_F_TOP
-    "fijkdbh"
-  AF_BLUE_STRING_LATIN_SMALL
-    "xzroesc"
+    "f i j k d b h"
+  AF_BLUE_STRING_LATIN_SMALL_TOP
+    "u v x z o e s c"
+  AF_BLUE_STRING_LATIN_SMALL_BOTTOM
+    "n r x z o e s c"
   AF_BLUE_STRING_LATIN_SMALL_DESCENDER
-    "pqgjy"
+    "p q g j y"
 
-  // we separate the letters with spaces to avoid ligatures;
-  // this is just for convenience to simplify reading
+  // we assume that both the subscript and superscript ranges
+  // don't contain oldstyle digits (actually, most fonts probably
+  // have digits only in those ranges)
+  AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP
+    "₀ ₃ ₅ ₇ ₈"
+  AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM
+    "₀ ₁ ₂ ₃ ₈"
+  AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP
+    "ᵢ ⱼ ₕ ₖ ₗ"
+  AF_BLUE_STRING_LATIN_SUBS_SMALL
+    "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ"
+  AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER
+    "ᵦ ᵧ ᵨ ᵩ ₚ"
+
+  AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP
+    "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ"
+  AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM
+    "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ"
+  AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP
+    "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ"
+  AF_BLUE_STRING_LATIN_SUPS_SMALL
+    "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ"
+  AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER
+    "ᵖ ʸ ᵍ"
+
+  AF_BLUE_STRING_LISU_TOP
+    "ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ"
+  AF_BLUE_STRING_LISU_BOTTOM
+    "ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ"
+
+  AF_BLUE_STRING_MALAYALAM_TOP
+    "ഒ ട ഠ റ ച പ ച്ച പ്പ"
+  AF_BLUE_STRING_MALAYALAM_BOTTOM
+    "ട ഠ ധ ശ ഘ ച ഥ ല"
+
+  AF_BLUE_STRING_MYANMAR_TOP
+    "ခ ဂ င ဒ ဝ ၥ ၊ ။"
+  AF_BLUE_STRING_MYANMAR_BOTTOM
+    "င ဎ ဒ ပ ဗ ဝ ၊ ။"
+  AF_BLUE_STRING_MYANMAR_ASCENDER
+    "ဩ ြ ၍ ၏ ၆ ါ ိ"
+  AF_BLUE_STRING_MYANMAR_DESCENDER
+    "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉"
+
+  AF_BLUE_STRING_NKO_TOP
+    "ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ"
+  AF_BLUE_STRING_NKO_BOTTOM
+    "߀ ߘ ߡ ߠ ߥ"
+  AF_BLUE_STRING_NKO_SMALL_TOP
+    "ߏ ߛ ߋ"
+  AF_BLUE_STRING_NKO_SMALL_BOTTOM
+    "ߎ ߏ ߛ ߋ"
+
+  AF_BLUE_STRING_OL_CHIKI
+    "ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ"
+
+  AF_BLUE_STRING_OLD_TURKIC_TOP
+    "𐰗 𐰘 𐰧"
+  AF_BLUE_STRING_OLD_TURKIC_BOTTOM
+    "𐰉 𐰗 𐰦 𐰧"
+
+  AF_BLUE_STRING_OSAGE_CAPITAL_TOP
+    "𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆"
+  AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM
+    "𐒰 𐓍 𐓂 𐒿 𐓎 𐒹"
+  AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER
+    "𐒼 𐒽 𐒾"
+  AF_BLUE_STRING_OSAGE_SMALL_TOP
+    "𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮"
+  AF_BLUE_STRING_OSAGE_SMALL_BOTTOM
+    "𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶"
+  AF_BLUE_STRING_OSAGE_SMALL_ASCENDER
+    "𐓤 𐓦 𐓸 𐓹 𐓛"
+  AF_BLUE_STRING_OSAGE_SMALL_DESCENDER
+    "𐓤 𐓥 𐓦"
+
+  AF_BLUE_STRING_OSMANYA_TOP
+    "𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣"
+  AF_BLUE_STRING_OSMANYA_BOTTOM
+    "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩"
+
+  AF_BLUE_STRING_SAURASHTRA_TOP
+    "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ"
+  AF_BLUE_STRING_SAURASHTRA_BOTTOM
+    "ꢂ ꢨ ꢺ ꢤ ꢎ"
+
+  AF_BLUE_STRING_SHAVIAN_TOP
+    "𐑕 𐑙"
+  AF_BLUE_STRING_SHAVIAN_BOTTOM
+    "𐑔 𐑖 𐑗 𐑹 𐑻"
+  AF_BLUE_STRING_SHAVIAN_DESCENDER
+    "𐑟 𐑣"
+  AF_BLUE_STRING_SHAVIAN_SMALL_TOP
+    "𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼"
+  AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM
+    "𐑴 𐑻 𐑹"
+
+  AF_BLUE_STRING_SINHALA_TOP
+    "ඉ ක ඝ ඳ ප ය ල ෆ"
+  AF_BLUE_STRING_SINHALA_BOTTOM
+    "එ ඔ ඝ ජ ට ථ ධ ර"
+  AF_BLUE_STRING_SINHALA_DESCENDER
+    "ද ඳ උ ල තූ තු බු දු"
+
+  AF_BLUE_STRING_SUNDANESE_TOP
+    "ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ"
+  AF_BLUE_STRING_SUNDANESE_BOTTOM
+    "ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ"
+  AF_BLUE_STRING_SUNDANESE_DESCENDER
+    "ᮼ ᳄"
+
+  AF_BLUE_STRING_TAI_VIET_TOP
+    "ꪆ ꪔ ꪒ ꪖ ꪫ"
+  AF_BLUE_STRING_TAI_VIET_BOTTOM
+    "ꪉ ꪫ ꪮ"
+
+  AF_BLUE_STRING_TAMIL_TOP
+    "உ ஒ ஓ ற ஈ க ங ச"
+  AF_BLUE_STRING_TAMIL_BOTTOM
+    "க ச ல ஶ உ ங ட ப"
+
   AF_BLUE_STRING_TELUGU_TOP
     "ఇ ఌ ఙ ఞ ణ ఱ ౯"
   AF_BLUE_STRING_TELUGU_BOTTOM
@@ -146,48 +498,56 @@
   AF_BLUE_STRING_THAI_DIGIT_TOP
     "๐ ๑ ๓"
 
+  AF_BLUE_STRING_TIFINAGH
+    "ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ"
+
+  AF_BLUE_STRING_VAI_TOP
+    "ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ"
+  AF_BLUE_STRING_VAI_BOTTOM
+    "ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ"
+
 
 #ifdef AF_CONFIG_OPTION_CJK
 
   AF_BLUE_STRING_CJK_TOP
-    "他们你來們到和地"
-    "对對就席我时時會"
-    "来為能舰說说这這"
-    "齊 |"
-    "军同已愿既星是景"
-    "民照现現理用置要"
-    "軍那配里開雷露面"
-    "顾"
+    "他 们 你 來 們 到 和 地"
+    " 对 對 就 席 我 时 時 會"
+    " 来 為 能 舰 說 说 这 這"
+    " 齊 |"
+    " 军 同 已 愿 既 星 是 景"
+    " 民 照 现 現 理 用 置 要"
+    " 軍 那 配 里 開 雷 露 面"
+    " 顾"
   AF_BLUE_STRING_CJK_BOTTOM
-    "个为人他以们你來"
-    "個們到和大对對就"
-    "我时時有来為要說"
-    "说 |"
-    "主些因它想意理生"
-    "當看着置者自著裡"
-    "过还进進過道還里"
-    "面"
+    "个 为 人 他 以 们 你 來"
+    " 個 們 到 和 大 对 對 就"
+    " 我 时 時 有 来 為 要 說"
+    " 说 |"
+    " 主 些 因 它 想 意 理 生"
+    " 當 看 着 置 者 自 著 裡"
+    " 过 还 进 進 過 道 還 里"
+    " 面"
 
 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
 
   AF_BLUE_STRING_CJK_LEFT
-    "些们你來們到和地"
-    "她将將就年得情最"
-    "样樣理能說说这這"
-    "通 |"
-    "即吗吧听呢品响嗎"
-    "师師收断斷明眼間"
-    "间际陈限除陳随際"
-    "隨"
+    " 些 们 你 來 們 到 和 地"
+    " 她 将 將 就 年 得 情 最"
+    " 样 樣 理 能 說 说 这 這"
+    " 通 |"
+    " 即 吗 吧 听 呢 品 响 嗎"
+    " 师 師 收 断 斷 明 眼 間"
+    " 间 际 陈 限 除 陳 随 際"
+    " 隨"
   AF_BLUE_STRING_CJK_RIGHT
-    "事前學将將情想或"
-    "政斯新样樣民沒没"
-    "然特现現球第經谁"
-    "起 |"
-    "例別别制动動吗嗎"
-    "增指明朝期构物确"
-    "种調调費费那都間"
-    "间"
+    "事 前 學 将 將 情 想 或"
+    " 政 斯 新 样 樣 民 沒 没"
+    " 然 特 现 現 球 第 經 谁"
+    " 起 |"
+    " 例 別 别 制 动 動 吗 嗎"
+    " 增 指 明 朝 期 构 物 确"
+    " 种 調 调 費 费 那 都 間"
+    " 间"
 
 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
 
@@ -219,6 +579,14 @@
 // respectively.  Only horizontal blue zones (i.e., adjusting vertical
 // coordinate values) are supported.
 //
+// Some scripts like Khmer need character composition to get all necessary
+// blue zones, since Unicode only provides an abstract data model that
+// doesn't represent all possible glyph shapes.  For such character
+// clusters, the HarfBuzz library is used to convert them into the
+// corresponding glyphs.  The largest glyph element (where `largest' can be
+// either `largest ascender' or `largest descender') then defines the
+// corresponding flat or round extremum.
+//
 // For the latin auto-hinter, the overshoot should be larger than the
 // reference for top zones, and vice versa for bottom zones.
 //
@@ -229,6 +597,21 @@
 //
 //     If not set, take the minimum values.
 //
+//     Mutually exclusive with `LATIN_SUB_TOP'.
+//
+//   LATIN_SUB_TOP
+//     For all glyphs of a character cluster, compute the maximum flat
+//     and round coordinate values of each component, then take the
+//     smallest of the maximum values.  The idea is to get the top of
+//     subscript glyphs, as used in Khmer, for example.  Note that
+//     this mechanism doesn't work for ordinary ligatures.
+//
+//     This flags indicates a secondary blue zone: It gets removed if
+//     there is a non-LATIN_SUB_TOP blue zone at the same coordinate
+//     value (after scaling).
+//
+//     Mutually exclusive with `LATIN_TOP'.
+//
 //   LATIN_NEUTRAL
 //     Ignore round extrema and define the blue zone with flat values only.
 //     Both top and bottom of contours can match.  This is useful for
@@ -264,11 +647,11 @@
 //
 // Characters in a blue string are *not* automatically classified.  Instead,
 // first come the characters used for the overshoot value, then the
-// character `|', then the characters used for the reference value.  The
-// blue zone is then set up by the mean values of all reference values and
-// all overshoot values, respectively.  Both horizontal and vertical blue
-// zones (i.e., adjusting vertical and horizontal coordinate values,
-// respectively) are supported.
+// character `|', then the characters used for the reference value
+// (everything separated by space characters).  The blue zone is then set up
+// by the mean values of all reference values and all overshoot values,
+// respectively.  Both horizontal and vertical blue zones (i.e., adjusting
+// vertical and horizontal coordinate values, respectively) are supported.
 //
 // For the cjk auto-hinter, the overshoot should be smaller than the
 // reference for top zones, and vice versa for bottom zones.
@@ -288,11 +671,103 @@
 
 AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
 
+  AF_BLUE_STRINGSET_ADLM
+    { AF_BLUE_STRING_ADLAM_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_ADLAM_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM,   0                                 }
+    { AF_BLUE_STRING_MAX,                  0                                 }
+
   AF_BLUE_STRINGSET_ARAB
-    { AF_BLUE_STRING_ARABIC_TOP,   AF_BLUE_PROPERTY_LATIN_TOP }
-    { AF_BLUE_STRING_ARABIC_JOIN,  0                          }
+    { AF_BLUE_STRING_ARABIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP     }
+    { AF_BLUE_STRING_ARABIC_BOTTOM, 0                              }
+    { AF_BLUE_STRING_ARABIC_JOIN,   AF_BLUE_PROPERTY_LATIN_NEUTRAL }
+    { AF_BLUE_STRING_MAX,           0                              }
+
+  AF_BLUE_STRINGSET_ARMN
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM,  0                                 }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                      0                                 }
+
+  AF_BLUE_STRINGSET_AVST
+    { AF_BLUE_STRING_AVESTAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_AVESTAN_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,            0                          }
+
+  AF_BLUE_STRINGSET_BAMU
+    { AF_BLUE_STRING_BAMUM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_BAMUM_BOTTOM, 0                          }
     { AF_BLUE_STRING_MAX,          0                          }
 
+  AF_BLUE_STRINGSET_BENG
+    { AF_BLUE_STRING_BENGALI_TOP,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP      |
+                                   AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
+                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_BENGALI_BASE, 0                                 }
+    { AF_BLUE_STRING_MAX,          0                                 }
+
+  AF_BLUE_STRINGSET_BUHD
+    { AF_BLUE_STRING_BUHID_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_BUHID_LARGE,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_BUHID_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP      |
+                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_BUHID_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_MAX,          0                                 }
+
+  AF_BLUE_STRINGSET_CAKM
+    { AF_BLUE_STRING_CHAKMA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_CHAKMA_BOTTOM,    0                          }
+    { AF_BLUE_STRING_CHAKMA_DESCENDER, 0                          }
+    { AF_BLUE_STRING_MAX,              0                          }
+
+  AF_BLUE_STRINGSET_CANS
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP,             AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM,          0                                 }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM,     0                                 }
+    { AF_BLUE_STRING_MAX,                                0                                 }
+
+  AF_BLUE_STRINGSET_CARI
+    { AF_BLUE_STRING_CARIAN_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_CARIAN_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,           0                          }
+
+  AF_BLUE_STRINGSET_CHER
+    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_CHEROKEE_CAPITAL,         0                                 }
+    { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_CHEROKEE_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_CHEROKEE_SMALL,           0                                 }
+    { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                      0                                 }
+
+  AF_BLUE_STRINGSET_COPT
+    { AF_BLUE_STRING_COPTIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_COPTIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM,   0                                 }
+    { AF_BLUE_STRING_MAX,                   0                                 }
+
+  AF_BLUE_STRINGSET_CPRT
+    { AF_BLUE_STRING_CYPRIOT_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0                          }
+    { AF_BLUE_STRING_CYPRIOT_SMALL,  AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_CYPRIOT_SMALL,  0                          }
+    { AF_BLUE_STRING_MAX,            0                          }
+
   AF_BLUE_STRINGSET_CYRL
     { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
     { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM,  0                                 }
@@ -312,6 +787,52 @@
     { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0                                 }
     { AF_BLUE_STRING_MAX,               0                                 }
 
+  AF_BLUE_STRINGSET_DSRT
+    { AF_BLUE_STRING_DESERET_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_DESERET_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_DESERET_SMALL_BOTTOM,   0                                 }
+    { AF_BLUE_STRING_MAX,                    0                                 }
+
+  AF_BLUE_STRINGSET_ETHI
+    { AF_BLUE_STRING_ETHIOPIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,             0                          }
+
+  AF_BLUE_STRINGSET_GEOR
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP,        AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM,     0                                 }
+    { AF_BLUE_STRING_MAX,                          0                                 }
+
+  AF_BLUE_STRINGSET_GEOK
+    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                         0                                 }
+
+  AF_BLUE_STRINGSET_GLAG
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM,   0                                 }
+    { AF_BLUE_STRING_MAX,                       0                                 }
+
+  AF_BLUE_STRINGSET_GOTH
+    { AF_BLUE_STRING_GOTHIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_GOTHIC_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,           0                          }
+
   AF_BLUE_STRINGSET_GREK
     { AF_BLUE_STRING_GREEK_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
     { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM,  0                                 }
@@ -322,6 +843,25 @@
     { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0                                 }
     { AF_BLUE_STRING_MAX,                   0                                 }
 
+  AF_BLUE_STRINGSET_GUJR
+    { AF_BLUE_STRING_GUJARATI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_GUJARATI_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_GUJARATI_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GUJARATI_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_MAX,                0                                 }
+
+  AF_BLUE_STRINGSET_GURU
+    { AF_BLUE_STRING_GURMUKHI_TOP,       AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GURMUKHI_HEAD,      AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_GURMUKHI_BASE,      AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_NEUTRAL  |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_GURMUKHI_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_MAX,                0                                 }
+
   AF_BLUE_STRINGSET_HEBR
     { AF_BLUE_STRING_HEBREW_TOP,       AF_BLUE_PROPERTY_LATIN_TOP  |
                                        AF_BLUE_PROPERTY_LATIN_LONG   }
@@ -329,21 +869,175 @@
     { AF_BLUE_STRING_HEBREW_DESCENDER, 0                             }
     { AF_BLUE_STRING_MAX,              0                             }
 
+  AF_BLUE_STRINGSET_KALI
+    { AF_BLUE_STRING_KAYAH_LI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
+                                               AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_KAYAH_LI_BOTTOM,          0                                 }
+    { AF_BLUE_STRING_KAYAH_LI_ASCENDER,        AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 }
+    { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                      0                                 }
+
+  AF_BLUE_STRINGSET_KHMR
+    { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
+                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    }
+    { AF_BLUE_STRING_KHMER_BOTTOM,          0                                 }
+    { AF_BLUE_STRING_KHMER_DESCENDER,       0                                 }
+    { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                   0                                 }
+
+  AF_BLUE_STRINGSET_KHMS
+    { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                  AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_MAX,                         0                                 }
+
+  AF_BLUE_STRINGSET_KNDA
+    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,            0                          }
+
+  AF_BLUE_STRINGSET_LAO
+    { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
+                                         AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_LAO_BOTTOM,         0                                 }
+    { AF_BLUE_STRING_LAO_ASCENDER,       AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LAO_DESCENDER,      0                                 }
+    { AF_BLUE_STRING_MAX,                0                                 }
+
   AF_BLUE_STRINGSET_LATN
     { AF_BLUE_STRING_LATIN_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
     { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM,  0                                 }
     { AF_BLUE_STRING_LATIN_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
-    { AF_BLUE_STRING_LATIN_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+    { AF_BLUE_STRING_LATIN_SMALL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
-    { AF_BLUE_STRING_LATIN_SMALL,           0                                 }
+    { AF_BLUE_STRING_LATIN_SMALL_BOTTOM,    0                                 }
     { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0                                 }
     { AF_BLUE_STRING_MAX,                   0                                 }
 
+  AF_BLUE_STRINGSET_LATB
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM,  0                                 }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL,           0                                 }
+    { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                        0                                 }
+
+  AF_BLUE_STRINGSET_LATP
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM,  0                                 }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP,     AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           AF_BLUE_PROPERTY_LATIN_TOP      |
+                                                 AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL,           0                                 }
+    { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,                        0                                 }
+
+  AF_BLUE_STRINGSET_LISU
+    { AF_BLUE_STRING_LISU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_LISU_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,         0                          }
+
+  AF_BLUE_STRINGSET_MLYM
+    { AF_BLUE_STRING_MALAYALAM_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,              0                          }
+
+  AF_BLUE_STRINGSET_MYMR
+    { AF_BLUE_STRING_MYANMAR_TOP,       AF_BLUE_PROPERTY_LATIN_TOP      |
+                                        AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_MYANMAR_BOTTOM,    0                                 }
+    { AF_BLUE_STRING_MYANMAR_ASCENDER,  AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_MYANMAR_DESCENDER, 0                                 }
+    { AF_BLUE_STRING_MAX,               0                                 }
+
+  AF_BLUE_STRINGSET_NKOO
+    { AF_BLUE_STRING_NKO_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_NKO_BOTTOM,       0                                 }
+    { AF_BLUE_STRING_NKO_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                       AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_MAX,              0                                 }
+
+  AF_BLUE_STRINGSET_NONE
+    { AF_BLUE_STRING_MAX, 0 }
+
+  AF_BLUE_STRINGSET_OLCK
+    { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_OL_CHIKI, 0                          }
+    { AF_BLUE_STRING_MAX,      0                          }
+
+  AF_BLUE_STRINGSET_ORKH
+    { AF_BLUE_STRING_OLD_TURKIC_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,               0                          }
+
+  AF_BLUE_STRINGSET_OSGE
+    { AF_BLUE_STRING_OSAGE_CAPITAL_TOP,       AF_BLUE_PROPERTY_LATIN_TOP       }
+    { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM,    0                                }
+    { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0                                }
+    { AF_BLUE_STRING_OSAGE_SMALL_TOP,         AF_BLUE_PROPERTY_LATIN_TOP     |
+                                              AF_BLUE_PROPERTY_LATIN_X_HEIGHT  }
+    { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM,      0                                }
+    { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER,    AF_BLUE_PROPERTY_LATIN_TOP       }
+    { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER,   0                                }
+    { AF_BLUE_STRING_MAX,                     0                                }
+
+  AF_BLUE_STRINGSET_OSMA
+    { AF_BLUE_STRING_OSMANYA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_OSMANYA_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,            0                          }
+
+  AF_BLUE_STRINGSET_SAUR
+    { AF_BLUE_STRING_SAURASHTRA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,               0                          }
+
+  AF_BLUE_STRINGSET_SHAW
+    { AF_BLUE_STRING_SHAVIAN_TOP,          AF_BLUE_PROPERTY_LATIN_TOP        }
+    { AF_BLUE_STRING_SHAVIAN_BOTTOM,       0                                 }
+    { AF_BLUE_STRING_SHAVIAN_DESCENDER,    0                                 }
+    { AF_BLUE_STRING_SHAVIAN_SMALL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP      |
+                                           AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
+    { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0                                 }
+    { AF_BLUE_STRING_MAX,                  0                                 }
+
+  AF_BLUE_STRINGSET_SINH
+    { AF_BLUE_STRING_SINHALA_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_SINHALA_BOTTOM,    0                          }
+    { AF_BLUE_STRING_SINHALA_DESCENDER, 0                          }
+    { AF_BLUE_STRING_MAX,               0                          }
+
+  AF_BLUE_STRINGSET_SUND
+    { AF_BLUE_STRING_SUNDANESE_TOP,       AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_SUNDANESE_BOTTOM,    0                          }
+    { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0                          }
+    { AF_BLUE_STRING_MAX,                 0                          }
+
+  AF_BLUE_STRINGSET_TAML
+    { AF_BLUE_STRING_TAMIL_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_TAMIL_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,          0                          }
+
+  AF_BLUE_STRINGSET_TAVT
+    { AF_BLUE_STRING_TAI_VIET_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,             0                          }
+
   AF_BLUE_STRINGSET_TELU
     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
     { AF_BLUE_STRING_MAX,           0                          }
 
+  AF_BLUE_STRINGSET_TFNG
+    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_TIFINAGH, 0                          }
+    { AF_BLUE_STRING_MAX,      0                          }
+
   AF_BLUE_STRINGSET_THAI
     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
@@ -355,6 +1049,10 @@
     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
     { AF_BLUE_STRING_MAX,                  0                                 }
 
+  AF_BLUE_STRINGSET_VAII
+    { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_VAI_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,        0                          }
 
 #ifdef AF_CONFIG_OPTION_CJK
 
diff --git a/src/autofit/afblue.h b/src/autofit/afblue.h
index 94e33a9..de31e25 100644
--- a/src/autofit/afblue.h
+++ b/src/autofit/afblue.h
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,8 +19,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFBLUE_H__
-#define __AFBLUE_H__
+#ifndef AFBLUE_H_
+#define AFBLUE_H_
 
 
 FT_BEGIN_HEADER
@@ -28,32 +28,35 @@
 
   /* an auxiliary macro to decode a UTF-8 character -- since we only use */
   /* hard-coded, self-converted data, no error checking is performed     */
-#define GET_UTF8_CHAR( ch, p )                    \
-          ch = (unsigned char)*p++;               \
-          if ( ch >= 0x80 )                       \
-          {                                       \
-            FT_UInt  len;                         \
-                                                  \
-                                                  \
-            if ( ch < 0xE0 )                      \
-            {                                     \
-              len = 1;                            \
-              ch &= 0x1F;                         \
-            }                                     \
-            else if ( ch < 0xF0 )                 \
-            {                                     \
-              len = 2;                            \
-              ch &= 0x0F;                         \
-            }                                     \
-            else                                  \
-            {                                     \
-              len = 3;                            \
-              ch &= 0x07;                         \
-            }                                     \
-                                                  \
-            for ( ; len > 0; len-- )              \
-              ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-          }
+#define GET_UTF8_CHAR( ch, p )                      \
+          do                                        \
+          {                                         \
+            ch = (unsigned char)*p++;               \
+            if ( ch >= 0x80 )                       \
+            {                                       \
+              FT_UInt  len_;                        \
+                                                    \
+                                                    \
+              if ( ch < 0xE0 )                      \
+              {                                     \
+                len_ = 1;                           \
+                ch  &= 0x1F;                        \
+              }                                     \
+              else if ( ch < 0xF0 )                 \
+              {                                     \
+                len_ = 2;                           \
+                ch  &= 0x0F;                        \
+              }                                     \
+              else                                  \
+              {                                     \
+                len_ = 3;                           \
+                ch  &= 0x07;                        \
+              }                                     \
+                                                    \
+              for ( ; len_ > 0; len_-- )            \
+                ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
+            }                                       \
+          } while ( 0 )
 
 
   /*************************************************************************/
@@ -74,47 +77,199 @@
 
   typedef enum  AF_Blue_String_
   {
-    AF_BLUE_STRING_ARABIC_TOP = 0,
-    AF_BLUE_STRING_ARABIC_JOIN = 13,
-    AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 24,
-    AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 41,
-    AF_BLUE_STRING_CYRILLIC_SMALL = 58,
-    AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 75,
-    AF_BLUE_STRING_DEVANAGARI_BASE = 82,
-    AF_BLUE_STRING_DEVANAGARI_TOP = 107,
-    AF_BLUE_STRING_DEVANAGARI_HEAD = 132,
-    AF_BLUE_STRING_DEVANAGARI_BOTTOM = 157,
-    AF_BLUE_STRING_GREEK_CAPITAL_TOP = 164,
-    AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 179,
-    AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 192,
-    AF_BLUE_STRING_GREEK_SMALL = 205,
-    AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 222,
-    AF_BLUE_STRING_HEBREW_TOP = 239,
-    AF_BLUE_STRING_HEBREW_BOTTOM = 256,
-    AF_BLUE_STRING_HEBREW_DESCENDER = 269,
-    AF_BLUE_STRING_LATIN_CAPITAL_TOP = 280,
-    AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 289,
-    AF_BLUE_STRING_LATIN_SMALL_F_TOP = 298,
-    AF_BLUE_STRING_LATIN_SMALL = 306,
-    AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 314,
-    AF_BLUE_STRING_TELUGU_TOP = 320,
-    AF_BLUE_STRING_TELUGU_BOTTOM = 342,
-    AF_BLUE_STRING_THAI_TOP = 364,
-    AF_BLUE_STRING_THAI_BOTTOM = 383,
-    AF_BLUE_STRING_THAI_ASCENDER = 405,
-    AF_BLUE_STRING_THAI_LARGE_ASCENDER = 415,
-    AF_BLUE_STRING_THAI_DESCENDER = 425,
-    AF_BLUE_STRING_THAI_LARGE_DESCENDER = 438,
-    AF_BLUE_STRING_THAI_DIGIT_TOP = 445,
-    af_blue_1_1 = 454,
+    AF_BLUE_STRING_ADLAM_CAPITAL_TOP = 0,
+    AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM = 30,
+    AF_BLUE_STRING_ADLAM_SMALL_TOP = 40,
+    AF_BLUE_STRING_ADLAM_SMALL_BOTTOM = 65,
+    AF_BLUE_STRING_ARABIC_TOP = 105,
+    AF_BLUE_STRING_ARABIC_BOTTOM = 123,
+    AF_BLUE_STRING_ARABIC_JOIN = 138,
+    AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 141,
+    AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 165,
+    AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 189,
+    AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 210,
+    AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 234,
+    AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 258,
+    AF_BLUE_STRING_AVESTAN_TOP = 282,
+    AF_BLUE_STRING_AVESTAN_BOTTOM = 302,
+    AF_BLUE_STRING_BAMUM_TOP = 312,
+    AF_BLUE_STRING_BAMUM_BOTTOM = 344,
+    AF_BLUE_STRING_BENGALI_BASE = 376,
+    AF_BLUE_STRING_BENGALI_TOP = 408,
+    AF_BLUE_STRING_BENGALI_HEAD = 436,
+    AF_BLUE_STRING_BUHID_TOP = 468,
+    AF_BLUE_STRING_BUHID_LARGE = 476,
+    AF_BLUE_STRING_BUHID_SMALL = 488,
+    AF_BLUE_STRING_BUHID_BOTTOM = 504,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP = 532,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM = 564,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP = 596,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM = 628,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP = 660,
+    AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM = 688,
+    AF_BLUE_STRING_CARIAN_TOP = 720,
+    AF_BLUE_STRING_CARIAN_BOTTOM = 760,
+    AF_BLUE_STRING_CHAKMA_TOP = 795,
+    AF_BLUE_STRING_CHAKMA_BOTTOM = 820,
+    AF_BLUE_STRING_CHAKMA_DESCENDER = 845,
+    AF_BLUE_STRING_CHEROKEE_CAPITAL = 910,
+    AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 942,
+    AF_BLUE_STRING_CHEROKEE_SMALL = 974,
+    AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 1006,
+    AF_BLUE_STRING_COPTIC_CAPITAL_TOP = 1022,
+    AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM = 1054,
+    AF_BLUE_STRING_COPTIC_SMALL_TOP = 1086,
+    AF_BLUE_STRING_COPTIC_SMALL_BOTTOM = 1118,
+    AF_BLUE_STRING_CYPRIOT_TOP = 1150,
+    AF_BLUE_STRING_CYPRIOT_BOTTOM = 1190,
+    AF_BLUE_STRING_CYPRIOT_SMALL = 1225,
+    AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 1240,
+    AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 1264,
+    AF_BLUE_STRING_CYRILLIC_SMALL = 1288,
+    AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 1312,
+    AF_BLUE_STRING_DESERET_CAPITAL_TOP = 1321,
+    AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM = 1346,
+    AF_BLUE_STRING_DESERET_SMALL_TOP = 1371,
+    AF_BLUE_STRING_DESERET_SMALL_BOTTOM = 1396,
+    AF_BLUE_STRING_DEVANAGARI_BASE = 1421,
+    AF_BLUE_STRING_DEVANAGARI_TOP = 1453,
+    AF_BLUE_STRING_DEVANAGARI_HEAD = 1485,
+    AF_BLUE_STRING_DEVANAGARI_BOTTOM = 1517,
+    AF_BLUE_STRING_ETHIOPIC_TOP = 1525,
+    AF_BLUE_STRING_ETHIOPIC_BOTTOM = 1557,
+    AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 1589,
+    AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 1621,
+    AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 1653,
+    AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 1685,
+    AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 1717,
+    AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 1749,
+    AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 1781,
+    AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 1813,
+    AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 1845,
+    AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 1877,
+    AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP = 1909,
+    AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM = 1941,
+    AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP = 1973,
+    AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM = 2005,
+    AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP = 2037,
+    AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM = 2069,
+    AF_BLUE_STRING_GOTHIC_TOP = 2101,
+    AF_BLUE_STRING_GOTHIC_BOTTOM = 2141,
+    AF_BLUE_STRING_GREEK_CAPITAL_TOP = 2161,
+    AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 2182,
+    AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 2200,
+    AF_BLUE_STRING_GREEK_SMALL = 2218,
+    AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 2242,
+    AF_BLUE_STRING_GUJARATI_TOP = 2266,
+    AF_BLUE_STRING_GUJARATI_BOTTOM = 2298,
+    AF_BLUE_STRING_GUJARATI_ASCENDER = 2330,
+    AF_BLUE_STRING_GUJARATI_DESCENDER = 2380,
+    AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 2413,
+    AF_BLUE_STRING_GURMUKHI_BASE = 2433,
+    AF_BLUE_STRING_GURMUKHI_HEAD = 2465,
+    AF_BLUE_STRING_GURMUKHI_TOP = 2497,
+    AF_BLUE_STRING_GURMUKHI_BOTTOM = 2529,
+    AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 2561,
+    AF_BLUE_STRING_HEBREW_TOP = 2581,
+    AF_BLUE_STRING_HEBREW_BOTTOM = 2605,
+    AF_BLUE_STRING_HEBREW_DESCENDER = 2623,
+    AF_BLUE_STRING_KANNADA_TOP = 2638,
+    AF_BLUE_STRING_KANNADA_BOTTOM = 2682,
+    AF_BLUE_STRING_KAYAH_LI_TOP = 2714,
+    AF_BLUE_STRING_KAYAH_LI_BOTTOM = 2738,
+    AF_BLUE_STRING_KAYAH_LI_ASCENDER = 2758,
+    AF_BLUE_STRING_KAYAH_LI_DESCENDER = 2766,
+    AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER = 2778,
+    AF_BLUE_STRING_KHMER_TOP = 2799,
+    AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 2823,
+    AF_BLUE_STRING_KHMER_BOTTOM = 2863,
+    AF_BLUE_STRING_KHMER_DESCENDER = 2895,
+    AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 2929,
+    AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 3016,
+    AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 3024,
+    AF_BLUE_STRING_LAO_TOP = 3032,
+    AF_BLUE_STRING_LAO_BOTTOM = 3064,
+    AF_BLUE_STRING_LAO_ASCENDER = 3096,
+    AF_BLUE_STRING_LAO_LARGE_ASCENDER = 3112,
+    AF_BLUE_STRING_LAO_DESCENDER = 3124,
+    AF_BLUE_STRING_LATIN_CAPITAL_TOP = 3148,
+    AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 3164,
+    AF_BLUE_STRING_LATIN_SMALL_F_TOP = 3180,
+    AF_BLUE_STRING_LATIN_SMALL_TOP = 3194,
+    AF_BLUE_STRING_LATIN_SMALL_BOTTOM = 3210,
+    AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 3226,
+    AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 3236,
+    AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 3256,
+    AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 3276,
+    AF_BLUE_STRING_LATIN_SUBS_SMALL = 3296,
+    AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 3332,
+    AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 3352,
+    AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 3383,
+    AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 3412,
+    AF_BLUE_STRING_LATIN_SUPS_SMALL = 3438,
+    AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 3463,
+    AF_BLUE_STRING_LISU_TOP = 3474,
+    AF_BLUE_STRING_LISU_BOTTOM = 3506,
+    AF_BLUE_STRING_MALAYALAM_TOP = 3538,
+    AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582,
+    AF_BLUE_STRING_MYANMAR_TOP = 3614,
+    AF_BLUE_STRING_MYANMAR_BOTTOM = 3646,
+    AF_BLUE_STRING_MYANMAR_ASCENDER = 3678,
+    AF_BLUE_STRING_MYANMAR_DESCENDER = 3706,
+    AF_BLUE_STRING_NKO_TOP = 3738,
+    AF_BLUE_STRING_NKO_BOTTOM = 3762,
+    AF_BLUE_STRING_NKO_SMALL_TOP = 3777,
+    AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3786,
+    AF_BLUE_STRING_OL_CHIKI = 3798,
+    AF_BLUE_STRING_OLD_TURKIC_TOP = 3822,
+    AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3837,
+    AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3857,
+    AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3897,
+    AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3927,
+    AF_BLUE_STRING_OSAGE_SMALL_TOP = 3942,
+    AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 3982,
+    AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4022,
+    AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4047,
+    AF_BLUE_STRING_OSMANYA_TOP = 4062,
+    AF_BLUE_STRING_OSMANYA_BOTTOM = 4102,
+    AF_BLUE_STRING_SAURASHTRA_TOP = 4142,
+    AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4174,
+    AF_BLUE_STRING_SHAVIAN_TOP = 4194,
+    AF_BLUE_STRING_SHAVIAN_BOTTOM = 4204,
+    AF_BLUE_STRING_SHAVIAN_DESCENDER = 4229,
+    AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4239,
+    AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4274,
+    AF_BLUE_STRING_SINHALA_TOP = 4289,
+    AF_BLUE_STRING_SINHALA_BOTTOM = 4321,
+    AF_BLUE_STRING_SINHALA_DESCENDER = 4353,
+    AF_BLUE_STRING_SUNDANESE_TOP = 4397,
+    AF_BLUE_STRING_SUNDANESE_BOTTOM = 4421,
+    AF_BLUE_STRING_SUNDANESE_DESCENDER = 4453,
+    AF_BLUE_STRING_TAI_VIET_TOP = 4461,
+    AF_BLUE_STRING_TAI_VIET_BOTTOM = 4481,
+    AF_BLUE_STRING_TAMIL_TOP = 4493,
+    AF_BLUE_STRING_TAMIL_BOTTOM = 4525,
+    AF_BLUE_STRING_TELUGU_TOP = 4557,
+    AF_BLUE_STRING_TELUGU_BOTTOM = 4585,
+    AF_BLUE_STRING_THAI_TOP = 4613,
+    AF_BLUE_STRING_THAI_BOTTOM = 4637,
+    AF_BLUE_STRING_THAI_ASCENDER = 4665,
+    AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4677,
+    AF_BLUE_STRING_THAI_DESCENDER = 4689,
+    AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4705,
+    AF_BLUE_STRING_THAI_DIGIT_TOP = 4713,
+    AF_BLUE_STRING_TIFINAGH = 4725,
+    AF_BLUE_STRING_VAI_TOP = 4757,
+    AF_BLUE_STRING_VAI_BOTTOM = 4789,
+    af_blue_1_1 = 4820,
 #ifdef AF_CONFIG_OPTION_CJK
     AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1,
-    AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 153,
-    af_blue_1_1_1 = af_blue_1_1 + 304,
+    AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203,
+    af_blue_1_1_1 = af_blue_1_1 + 404,
 #ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
     AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1,
-    AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 153,
-    af_blue_1_1_2 = af_blue_1_1_1 + 304,
+    AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 204,
+    af_blue_1_1_2 = af_blue_1_1_1 + 405,
 #else
     af_blue_1_1_2 = af_blue_1_1_1 + 0,
 #endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
@@ -148,9 +303,10 @@
   /* blue string can't be used in more than a single writing system, which */
   /* is a safe bet.                                                        */
 #define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )  /* must have value 1 */
-#define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 1 )
-#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 2 )
-#define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 3 )
+#define AF_BLUE_PROPERTY_LATIN_SUB_TOP   ( 1U << 1 )
+#define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 2 )
+#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 3 )
+#define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 4 )
 
 #define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )       /* must have value 1 */
 #define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )       /* must have value 2 */
@@ -164,15 +320,59 @@
 
   typedef enum  AF_Blue_Stringset_
   {
-    AF_BLUE_STRINGSET_ARAB = 0,
-    AF_BLUE_STRINGSET_CYRL = 3,
-    AF_BLUE_STRINGSET_DEVA = 9,
-    AF_BLUE_STRINGSET_GREK = 15,
-    AF_BLUE_STRINGSET_HEBR = 22,
-    AF_BLUE_STRINGSET_LATN = 26,
-    AF_BLUE_STRINGSET_TELU = 33,
-    AF_BLUE_STRINGSET_THAI = 36,
-    af_blue_2_1 = 44,
+    AF_BLUE_STRINGSET_ADLM = 0,
+    AF_BLUE_STRINGSET_ARAB = 5,
+    AF_BLUE_STRINGSET_ARMN = 9,
+    AF_BLUE_STRINGSET_AVST = 16,
+    AF_BLUE_STRINGSET_BAMU = 19,
+    AF_BLUE_STRINGSET_BENG = 22,
+    AF_BLUE_STRINGSET_BUHD = 27,
+    AF_BLUE_STRINGSET_CAKM = 32,
+    AF_BLUE_STRINGSET_CANS = 36,
+    AF_BLUE_STRINGSET_CARI = 43,
+    AF_BLUE_STRINGSET_CHER = 46,
+    AF_BLUE_STRINGSET_COPT = 53,
+    AF_BLUE_STRINGSET_CPRT = 58,
+    AF_BLUE_STRINGSET_CYRL = 63,
+    AF_BLUE_STRINGSET_DEVA = 69,
+    AF_BLUE_STRINGSET_DSRT = 75,
+    AF_BLUE_STRINGSET_ETHI = 80,
+    AF_BLUE_STRINGSET_GEOR = 83,
+    AF_BLUE_STRINGSET_GEOK = 90,
+    AF_BLUE_STRINGSET_GLAG = 97,
+    AF_BLUE_STRINGSET_GOTH = 102,
+    AF_BLUE_STRINGSET_GREK = 105,
+    AF_BLUE_STRINGSET_GUJR = 112,
+    AF_BLUE_STRINGSET_GURU = 118,
+    AF_BLUE_STRINGSET_HEBR = 124,
+    AF_BLUE_STRINGSET_KALI = 128,
+    AF_BLUE_STRINGSET_KHMR = 134,
+    AF_BLUE_STRINGSET_KHMS = 140,
+    AF_BLUE_STRINGSET_KNDA = 143,
+    AF_BLUE_STRINGSET_LAO = 146,
+    AF_BLUE_STRINGSET_LATN = 152,
+    AF_BLUE_STRINGSET_LATB = 159,
+    AF_BLUE_STRINGSET_LATP = 166,
+    AF_BLUE_STRINGSET_LISU = 173,
+    AF_BLUE_STRINGSET_MLYM = 176,
+    AF_BLUE_STRINGSET_MYMR = 179,
+    AF_BLUE_STRINGSET_NKOO = 184,
+    AF_BLUE_STRINGSET_NONE = 189,
+    AF_BLUE_STRINGSET_OLCK = 190,
+    AF_BLUE_STRINGSET_ORKH = 193,
+    AF_BLUE_STRINGSET_OSGE = 196,
+    AF_BLUE_STRINGSET_OSMA = 204,
+    AF_BLUE_STRINGSET_SAUR = 207,
+    AF_BLUE_STRINGSET_SHAW = 210,
+    AF_BLUE_STRINGSET_SINH = 216,
+    AF_BLUE_STRINGSET_SUND = 220,
+    AF_BLUE_STRINGSET_TAML = 224,
+    AF_BLUE_STRINGSET_TAVT = 227,
+    AF_BLUE_STRINGSET_TELU = 230,
+    AF_BLUE_STRINGSET_TFNG = 233,
+    AF_BLUE_STRINGSET_THAI = 236,
+    AF_BLUE_STRINGSET_VAII = 244,
+    af_blue_2_1 = 247,
 #ifdef AF_CONFIG_OPTION_CJK
     AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0,
     af_blue_2_1_1 = af_blue_2_1 + 2,
@@ -208,7 +408,7 @@
 FT_END_HEADER
 
 
-#endif /* __AFBLUE_H__ */
+#endif /* AFBLUE_H_ */
 
 
 /* END */
diff --git a/src/autofit/afblue.hin b/src/autofit/afblue.hin
index ad43fe6..682147c 100644
--- a/src/autofit/afblue.hin
+++ b/src/autofit/afblue.hin
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFBLUE_H__
-#define __AFBLUE_H__
+#ifndef AFBLUE_H_
+#define AFBLUE_H_
 
 
 FT_BEGIN_HEADER
@@ -25,32 +25,35 @@
 
   /* an auxiliary macro to decode a UTF-8 character -- since we only use */
   /* hard-coded, self-converted data, no error checking is performed     */
-#define GET_UTF8_CHAR( ch, p )                    \
-          ch = (unsigned char)*p++;               \
-          if ( ch >= 0x80 )                       \
-          {                                       \
-            FT_UInt  len;                         \
-                                                  \
-                                                  \
-            if ( ch < 0xE0 )                      \
-            {                                     \
-              len = 1;                            \
-              ch &= 0x1F;                         \
-            }                                     \
-            else if ( ch < 0xF0 )                 \
-            {                                     \
-              len = 2;                            \
-              ch &= 0x0F;                         \
-            }                                     \
-            else                                  \
-            {                                     \
-              len = 3;                            \
-              ch &= 0x07;                         \
-            }                                     \
-                                                  \
-            for ( ; len > 0; len-- )              \
-              ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
-          }
+#define GET_UTF8_CHAR( ch, p )                      \
+          do                                        \
+          {                                         \
+            ch = (unsigned char)*p++;               \
+            if ( ch >= 0x80 )                       \
+            {                                       \
+              FT_UInt  len_;                        \
+                                                    \
+                                                    \
+              if ( ch < 0xE0 )                      \
+              {                                     \
+                len_ = 1;                           \
+                ch  &= 0x1F;                        \
+              }                                     \
+              else if ( ch < 0xF0 )                 \
+              {                                     \
+                len_ = 2;                           \
+                ch  &= 0x0F;                        \
+              }                                     \
+              else                                  \
+              {                                     \
+                len_ = 3;                           \
+                ch  &= 0x07;                        \
+              }                                     \
+                                                    \
+              for ( ; len_ > 0; len_-- )            \
+                ch = ( ch << 6 ) | ( *p++ & 0x3F ); \
+            }                                       \
+          } while ( 0 )
 
 
   /*************************************************************************/
@@ -97,9 +100,10 @@
   /* blue string can't be used in more than a single writing system, which */
   /* is a safe bet.                                                        */
 #define AF_BLUE_PROPERTY_LATIN_TOP       ( 1U << 0 )  /* must have value 1 */
-#define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 1 )
-#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 2 )
-#define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 3 )
+#define AF_BLUE_PROPERTY_LATIN_SUB_TOP   ( 1U << 1 )
+#define AF_BLUE_PROPERTY_LATIN_NEUTRAL   ( 1U << 2 )
+#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT  ( 1U << 3 )
+#define AF_BLUE_PROPERTY_LATIN_LONG      ( 1U << 4 )
 
 #define AF_BLUE_PROPERTY_CJK_TOP    ( 1U << 0 )       /* must have value 1 */
 #define AF_BLUE_PROPERTY_CJK_HORIZ  ( 1U << 1 )       /* must have value 2 */
@@ -136,7 +140,7 @@
 FT_END_HEADER
 
 
-#endif /* __AFBLUE_H__ */
+#endif /* AFBLUE_H_ */
 
 
 /* END */
diff --git a/src/autofit/afcjk.c b/src/autofit/afcjk.c
index 905408b..21b6bff 100644
--- a/src/autofit/afcjk.c
+++ b/src/autofit/afcjk.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for CJK writing system (body).          */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,9 +16,9 @@
 /***************************************************************************/
 
   /*
-   *  The algorithm is based on akito's autohint patch, available here:
+   *  The algorithm is based on akito's autohint patch, archived at
    *
-   *  http://www.kde.gr.jp/~akito/patch/freetype2/
+   *  https://web.archive.org/web/20051219160454/http://www.kde.gr.jp:80/~akito/patch/freetype2/2.1.7/
    *
    */
 
@@ -29,13 +29,13 @@
 #include "afglobal.h"
 #include "afpic.h"
 #include "aflatin.h"
+#include "afcjk.h"
 
 
 #ifdef AF_CONFIG_OPTION_CJK
 
 #undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
 
-#include "afcjk.h"
 #include "aferrors.h"
 
 
@@ -88,7 +88,6 @@
     {
       FT_Error          error;
       FT_ULong          glyph_index;
-      FT_Long           y_offset;
       int               dim;
       AF_CJKMetricsRec  dummy[1];
       AF_Scaler         scaler = &dummy->root.scaler;
@@ -101,45 +100,61 @@
       AF_ScriptClass  script_class = AF_SCRIPT_CLASSES_GET
                                        [style_class->script];
 
-      FT_UInt32  standard_char;
+      void*        shaper_buf;
+      const char*  p;
 
+#ifdef FT_DEBUG_LEVEL_TRACE
+      FT_ULong  ch = 0;
+#endif
 
-      standard_char = script_class->standard_char1;
-      af_get_char_index( &metrics->root,
-                         standard_char,
-                         &glyph_index,
-                         &y_offset );
-      if ( !glyph_index )
+      p          = script_class->standard_charstring;
+      shaper_buf = af_shaper_buf_create( face );
+
+      /* We check a list of standard characters.  The first match wins. */
+
+      glyph_index = 0;
+      while ( *p )
       {
-        if ( script_class->standard_char2 )
-        {
-          standard_char = script_class->standard_char2;
-          af_get_char_index( &metrics->root,
-                             standard_char,
-                             &glyph_index,
-                             &y_offset );
-          if ( !glyph_index )
-          {
-            if ( script_class->standard_char3 )
-            {
-              standard_char = script_class->standard_char3;
-              af_get_char_index( &metrics->root,
-                                 standard_char,
-                                 &glyph_index,
-                                 &y_offset );
-              if ( !glyph_index )
-                goto Exit;
-            }
-            else
-              goto Exit;
-          }
-        }
-        else
-          goto Exit;
+        unsigned int  num_idx;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        const char*  p_old;
+#endif
+
+
+        while ( *p == ' ' )
+          p++;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        p_old = p;
+        GET_UTF8_CHAR( ch, p_old );
+#endif
+
+        /* reject input that maps to more than a single glyph */
+        p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+        if ( num_idx > 1 )
+          continue;
+
+        /* otherwise exit loop if we have a result */
+        glyph_index = af_shaper_get_elem( &metrics->root,
+                                          shaper_buf,
+                                          0,
+                                          NULL,
+                                          NULL );
+        if ( glyph_index )
+          break;
       }
 
+      af_shaper_buf_destroy( face, shaper_buf );
+
+      if ( !glyph_index )
+        goto Exit;
+
+      if ( !glyph_index )
+        goto Exit;
+
       FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n",
-                  standard_char, glyph_index ));
+                  ch, glyph_index ));
 
       error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
       if ( error || face->glyph->outline.n_points <= 0 )
@@ -177,6 +192,12 @@
         if ( error )
           goto Exit;
 
+        /*
+         *  We assume that the glyphs selected for the stem width
+         *  computation are `featureless' enough so that the linking
+         *  algorithm works fine without adjustments of its scoring
+         *  function.
+         */
         af_latin_hints_link_segments( hints,
                                       0,
                                       NULL,
@@ -275,6 +296,8 @@
     AF_Blue_Stringset         bss = sc->blue_stringset;
     const AF_Blue_StringRec*  bs  = &af_blue_stringsets[bss];
 
+    void*  shaper_buf;
+
 
     /* we walk over the blue character strings as specified in the   */
     /* style's entry in the `af_blue_stringset' array, computing its */
@@ -284,6 +307,8 @@
                 "==========================\n"
                 "\n" ));
 
+    shaper_buf = af_shaper_buf_create( face );
+
     for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
     {
       const char*  p = &af_blue_strings[bs->string];
@@ -322,26 +347,47 @@
 
       while ( *p )
       {
-        FT_ULong    ch;
         FT_ULong    glyph_index;
-        FT_Long     y_offset;
         FT_Pos      best_pos;       /* same as points.y or points.x, resp. */
         FT_Int      best_point;
         FT_Vector*  points;
 
+        unsigned int  num_idx;
 
-        GET_UTF8_CHAR( ch, p );
+#ifdef FT_DEBUG_LEVEL_TRACE
+        const char*  p_old;
+        FT_ULong     ch;
+#endif
+
+
+        while ( *p == ' ' )
+          p++;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        p_old = p;
+        GET_UTF8_CHAR( ch, p_old );
+#endif
 
         /* switch to characters that define flat values */
-        if ( ch == '|' )
+        if ( *p == '|' )
         {
           fill = 0;
           FT_TRACE5(( "  [reference values]\n" ));
+          p++;
           continue;
         }
 
+        /* reject input that maps to more than a single glyph */
+        p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+        if ( num_idx > 1 )
+          continue;
+
         /* load the character in the face -- skip unknown or empty ones */
-        af_get_char_index( &metrics->root, ch, &glyph_index, &y_offset );
+        glyph_index = af_shaper_get_elem( &metrics->root,
+                                          shaper_buf,
+                                          0,
+                                          NULL,
+                                          NULL );
         if ( glyph_index == 0 )
         {
           FT_TRACE5(( "  U+%04lX unavailable\n", ch ));
@@ -350,9 +396,9 @@
 
         error   = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
         outline = face->glyph->outline;
-        if ( error || outline.n_points <= 0 )
+        if ( error || outline.n_points <= 2 )
         {
-          FT_TRACE5(( "  U+%04lX contains no outlines\n", ch ));
+          FT_TRACE5(( "  U+%04lX contains no (usable) outlines\n", ch ));
           continue;
         }
 
@@ -431,7 +477,8 @@
           fills[num_fills++] = best_pos;
         else
           flats[num_flats++] = best_pos;
-      }
+
+      } /* end while loop */
 
       if ( num_flats == 0 && num_fills == 0 )
       {
@@ -498,7 +545,10 @@
       FT_TRACE5(( "    -> reference = %ld\n"
                   "       overshoot = %ld\n",
                   *blue_ref, *blue_shoot ));
-    }
+
+    } /* end for loop */
+
+    af_shaper_buf_destroy( face, shaper_buf );
 
     FT_TRACE5(( "\n" ));
 
@@ -512,27 +562,36 @@
   af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
                                FT_Face        face )
   {
-    FT_UInt   i;
     FT_Bool   started = 0, same_width = 1;
-    FT_Fixed  advance, old_advance = 0;
+    FT_Fixed  advance = 0, old_advance = 0;
+
+    void*  shaper_buf;
+
+    /* in all supported charmaps, digits have character codes 0x30-0x39 */
+    const char   digits[] = "0 1 2 3 4 5 6 7 8 9";
+    const char*  p;
 
 
-    /* digit `0' is 0x30 in all supported charmaps */
-    for ( i = 0x30; i <= 0x39; i++ )
+    p          = digits;
+    shaper_buf = af_shaper_buf_create( face );
+
+    while ( *p )
     {
-      FT_ULong  glyph_index;
-      FT_Long   y_offset;
+      FT_ULong      glyph_index;
+      unsigned int  num_idx;
 
 
-      af_get_char_index( &metrics->root, i, &glyph_index, &y_offset );
-      if ( glyph_index == 0 )
+      /* reject input that maps to more than a single glyph */
+      p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+      if ( num_idx > 1 )
         continue;
 
-      if ( FT_Get_Advance( face, glyph_index,
-                           FT_LOAD_NO_SCALE         |
-                           FT_LOAD_NO_HINTING       |
-                           FT_LOAD_IGNORE_TRANSFORM,
-                           &advance ) )
+      glyph_index = af_shaper_get_elem( &metrics->root,
+                                        shaper_buf,
+                                        0,
+                                        &advance,
+                                        NULL );
+      if ( !glyph_index )
         continue;
 
       if ( started )
@@ -550,6 +609,8 @@
       }
     }
 
+    af_shaper_buf_destroy( face, shaper_buf );
+
     metrics->root.digits_have_same_width = same_width;
   }
 
@@ -688,6 +749,22 @@
   }
 
 
+  /* Extract standard_width from writing system/script specific */
+  /* metrics class.                                             */
+
+  FT_LOCAL_DEF( void )
+  af_cjk_get_standard_widths( AF_CJKMetrics  metrics,
+                              FT_Pos*        stdHW,
+                              FT_Pos*        stdVW )
+  {
+    if ( stdHW )
+      *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
+
+    if ( stdVW )
+      *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width;
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -889,15 +966,12 @@
 
       if ( seg2 )
       {
-        seg2->num_linked++;
         if ( seg2->link != seg1 )
         {
           seg1->link = NULL;
 
           if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 )
             seg1->serif = seg2->link;
-          else
-            seg2->num_linked--;
         }
       }
     }
@@ -1014,7 +1088,7 @@
         /* insert a new edge in the list and */
         /* sort according to the position    */
         error = af_axis_hints_new_edge( axis, seg->pos,
-                                        (AF_Direction)seg->dir,
+                                        (AF_Direction)seg->dir, 0,
                                         memory, &edge );
         if ( error )
           goto Exit;
@@ -1324,9 +1398,9 @@
       other_flags |= AF_LATIN_HINTS_VERT_SNAP;
 
     /*
-     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     *  We adjust stems to full pixels unless in `light' or `lcd' mode.
      */
-    if ( mode != FT_RENDER_MODE_LIGHT )
+    if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD )
       other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
 
     if ( mode == FT_RENDER_MODE_MONO )
@@ -1451,7 +1525,7 @@
       }
 
       if ( dist < 54 )
-        dist += ( 54 - dist ) / 2 ;
+        dist += ( 54 - dist ) / 2;
       else if ( dist < 3 * 64 )
       {
         FT_Pos  delta;
@@ -2181,7 +2255,8 @@
   /* Apply the complete hinting algorithm to a CJK glyph. */
 
   FT_LOCAL_DEF( FT_Error )
-  af_cjk_hints_apply( AF_GlyphHints  hints,
+  af_cjk_hints_apply( FT_UInt        glyph_index,
+                      AF_GlyphHints  hints,
                       FT_Outline*    outline,
                       AF_CJKMetrics  metrics )
   {
@@ -2189,6 +2264,7 @@
     int       dim;
 
     FT_UNUSED( metrics );
+    FT_UNUSED( glyph_index );
 
 
     error = af_glyph_hints_reload( hints, outline );
@@ -2196,13 +2272,7 @@
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         AF_HINTS_DO_HORIZONTAL( hints )                              )
-#else
     if ( AF_HINTS_DO_HORIZONTAL( hints ) )
-#endif
     {
       error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ );
       if ( error )
@@ -2228,9 +2298,9 @@
       {
 
 #ifdef AF_CONFIG_OPTION_USE_WARPER
-        if ( dim == AF_DIMENSION_HORZ                                 &&
-             metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-             AF_HINTS_DO_WARP( hints )                                )
+        if ( dim == AF_DIMENSION_HORZ                                  &&
+             metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+             AF_HINTS_DO_WARP( hints )                                 )
         {
           AF_WarperRec  warper;
           FT_Fixed      scale;
@@ -2275,12 +2345,13 @@
 
     sizeof ( AF_CJKMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init,
-    (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init,        /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale,       /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL,                       /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   af_cjk_hints_init,
-    (AF_WritingSystem_ApplyHintsFunc)  af_cjk_hints_apply
+    (AF_WritingSystem_InitHintsFunc)   af_cjk_hints_init,          /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  af_cjk_hints_apply          /* style_hints_apply     */
   )
 
 
@@ -2294,12 +2365,13 @@
 
     sizeof ( AF_CJKMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) NULL,
-    (AF_WritingSystem_ScaleMetricsFunc)NULL,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   NULL,
-    (AF_WritingSystem_ApplyHintsFunc)  NULL
+    (AF_WritingSystem_InitHintsFunc)   NULL, /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  NULL  /* style_hints_apply     */
   )
 
 
diff --git a/src/autofit/afcjk.h b/src/autofit/afcjk.h
index bfd11f2..d229c0c 100644
--- a/src/autofit/afcjk.h
+++ b/src/autofit/afcjk.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for CJK writing system (specification). */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFCJK_H__
-#define __AFCJK_H__
+#ifndef AFCJK_H_
+#define AFCJK_H_
 
 #include "afhints.h"
 #include "aflatin.h"
@@ -115,7 +115,8 @@
                      AF_CJKMetrics  metrics );
 
   FT_LOCAL( FT_Error )
-  af_cjk_hints_apply( AF_GlyphHints  hints,
+  af_cjk_hints_apply( FT_UInt        glyph_index,
+                      AF_GlyphHints  hints,
                       FT_Outline*    outline,
                       AF_CJKMetrics  metrics );
 
@@ -134,7 +135,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFCJK_H__ */
+#endif /* AFCJK_H_ */
 
 
 /* END */
diff --git a/src/autofit/afcover.h b/src/autofit/afcover.h
index 520e8a4..6eeb8fc 100644
--- a/src/autofit/afcover.h
+++ b/src/autofit/afcover.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter coverages (specification only).                          */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/autofit/afdummy.c b/src/autofit/afdummy.c
index 03ca25f..f30c517 100644
--- a/src/autofit/afdummy.c
+++ b/src/autofit/afdummy.c
@@ -5,7 +5,7 @@
 /*    Auto-fitter dummy routines to be used if no hinting should be        */
 /*    performed (body).                                                    */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -38,11 +38,14 @@
 
 
   static FT_Error
-  af_dummy_hints_apply( AF_GlyphHints  hints,
+  af_dummy_hints_apply( FT_UInt        glyph_index,
+                        AF_GlyphHints  hints,
                         FT_Outline*    outline )
   {
     FT_Error  error;
 
+    FT_UNUSED( glyph_index );
+
 
     error = af_glyph_hints_reload( hints, outline );
     if ( !error )
@@ -59,12 +62,13 @@
 
     sizeof ( AF_StyleMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) NULL,
-    (AF_WritingSystem_ScaleMetricsFunc)NULL,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) NULL,                /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)NULL,                /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL,                /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)NULL,                /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   af_dummy_hints_init,
-    (AF_WritingSystem_ApplyHintsFunc)  af_dummy_hints_apply
+    (AF_WritingSystem_InitHintsFunc)   af_dummy_hints_init, /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  af_dummy_hints_apply /* style_hints_apply     */
   )
 
 
diff --git a/src/autofit/afdummy.h b/src/autofit/afdummy.h
index b4fdc78..b382acd 100644
--- a/src/autofit/afdummy.h
+++ b/src/autofit/afdummy.h
@@ -5,7 +5,7 @@
 /*    Auto-fitter dummy routines to be used if no hinting should be        */
 /*    performed (specification).                                           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFDUMMY_H__
-#define __AFDUMMY_H__
+#ifndef AFDUMMY_H_
+#define AFDUMMY_H_
 
 #include "aftypes.h"
 
@@ -34,7 +34,7 @@
 FT_END_HEADER
 
 
-#endif /* __AFDUMMY_H__ */
+#endif /* AFDUMMY_H_ */
 
 
 /* END */
diff --git a/src/autofit/aferrors.h b/src/autofit/aferrors.h
index 7b416e4..e5de543 100644
--- a/src/autofit/aferrors.h
+++ b/src/autofit/aferrors.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Autofitter error codes (specification only).                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __AFERRORS_H__
-#define __AFERRORS_H__
+#ifndef AFERRORS_H_
+#define AFERRORS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  AF_Err_
@@ -36,6 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __AFERRORS_H__ */
+#endif /* AFERRORS_H_ */
+
 
 /* END */
diff --git a/src/autofit/afglobal.c b/src/autofit/afglobal.c
index 64b9293..3d09c53 100644
--- a/src/autofit/afglobal.c
+++ b/src/autofit/afglobal.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter routines to compute global hinting values (body).        */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,7 +18,7 @@
 
 #include "afglobal.h"
 #include "afranges.h"
-#include "hbshim.h"
+#include "afshaper.h"
 #include FT_INTERNAL_DEBUG_H
 
 
@@ -42,12 +42,14 @@
 
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
+#define SCRIPT( s, S, d, h, H, ss )         \
           AF_DEFINE_SCRIPT_CLASS(           \
             af_ ## s ## _script_class,      \
             AF_SCRIPT_ ## S,                \
             af_ ## s ## _uniranges,         \
-            sc1, sc2, sc3 )
+            af_ ## s ## _nonbase_uniranges, \
+            AF_ ## H,                       \
+            ss )
 
 #include "afscript.h"
 
@@ -82,7 +84,7 @@
 
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
+#define SCRIPT( s, S, d, h, H, ss )   \
           &af_ ## s ## _script_class,
 
   FT_LOCAL_ARRAY_DEF( AF_ScriptClass )
@@ -135,16 +137,15 @@
     FT_Error    error;
     FT_Face     face        = globals->face;
     FT_CharMap  old_charmap = face->charmap;
-    FT_Byte*    gstyles     = globals->glyph_styles;
+    FT_UShort*  gstyles     = globals->glyph_styles;
     FT_UInt     ss;
     FT_UInt     i;
     FT_UInt     dflt        = ~0U; /* a non-valid value */
 
 
     /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */
-    FT_MEM_SET( globals->glyph_styles,
-                AF_STYLE_UNASSIGNED,
-                globals->glyph_count );
+    for ( i = 0; i < (FT_UInt)globals->glyph_count; i++ )
+      gstyles[i] = AF_STYLE_UNASSIGNED;
 
     error = FT_Select_Charmap( face, FT_ENCODING_UNICODE );
     if ( error )
@@ -167,7 +168,7 @@
       AF_Script_UniRange  range;
 
 
-      if ( script_class->script_uni_ranges == NULL )
+      if ( !script_class->script_uni_ranges )
         continue;
 
       /*
@@ -190,10 +191,10 @@
 
           gindex = FT_Get_Char_Index( face, charcode );
 
-          if ( gindex != 0                             &&
-               gindex < (FT_ULong)globals->glyph_count &&
-               gstyles[gindex] == AF_STYLE_UNASSIGNED  )
-            gstyles[gindex] = (FT_Byte)ss;
+          if ( gindex != 0                                                &&
+               gindex < (FT_ULong)globals->glyph_count                    &&
+               ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
+            gstyles[gindex] = (FT_UShort)ss;
 
           for (;;)
           {
@@ -202,32 +203,61 @@
             if ( gindex == 0 || charcode > range->last )
               break;
 
-            if ( gindex < (FT_ULong)globals->glyph_count &&
-                 gstyles[gindex] == AF_STYLE_UNASSIGNED  )
-              gstyles[gindex] = (FT_Byte)ss;
+            if ( gindex < (FT_ULong)globals->glyph_count                    &&
+                 ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
+              gstyles[gindex] = (FT_UShort)ss;
+          }
+        }
+
+        /* do the same for the script's non-base characters */
+        for ( range = script_class->script_uni_nonbase_ranges;
+              range->first != 0;
+              range++ )
+        {
+          FT_ULong  charcode = range->first;
+          FT_UInt   gindex;
+
+
+          gindex = FT_Get_Char_Index( face, charcode );
+
+          if ( gindex != 0                                          &&
+               gindex < (FT_ULong)globals->glyph_count              &&
+               ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss )
+            gstyles[gindex] |= AF_NONBASE;
+
+          for (;;)
+          {
+            charcode = FT_Get_Next_Char( face, charcode, &gindex );
+
+            if ( gindex == 0 || charcode > range->last )
+              break;
+
+            if ( gindex < (FT_ULong)globals->glyph_count              &&
+                 ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss )
+              gstyles[gindex] |= AF_NONBASE;
           }
         }
       }
       else
       {
         /* get glyphs not directly addressable by cmap */
-        af_get_coverage( globals, style_class, gstyles );
+        af_shaper_get_coverage( globals, style_class, gstyles, 0 );
       }
     }
 
-    /* handle the default OpenType features of the default script ... */
-    af_get_coverage( globals, AF_STYLE_CLASSES_GET[dflt], gstyles );
-
-    /* ... and the remaining default OpenType features */
+    /* handle the remaining default OpenType features ... */
     for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ )
     {
       AF_StyleClass  style_class = AF_STYLE_CLASSES_GET[ss];
 
 
-      if ( ss != dflt && style_class->coverage == AF_COVERAGE_DEFAULT )
-        af_get_coverage( globals, style_class, gstyles );
+      if ( style_class->coverage == AF_COVERAGE_DEFAULT )
+        af_shaper_get_coverage( globals, style_class, gstyles, 0 );
     }
 
+    /* ... and finally the default OpenType features of the default script */
+    af_shaper_get_coverage( globals, AF_STYLE_CLASSES_GET[dflt], gstyles, 1 );
+
     /* mark ASCII digits */
     for ( i = 0x30; i <= 0x39; i++ )
     {
@@ -250,9 +280,9 @@
 
       for ( nn = 0; nn < globals->glyph_count; nn++ )
       {
-        if ( ( gstyles[nn] & ~AF_DIGIT ) == AF_STYLE_UNASSIGNED )
+        if ( ( gstyles[nn] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED )
         {
-          gstyles[nn] &= ~AF_STYLE_UNASSIGNED;
+          gstyles[nn] &= ~AF_STYLE_MASK;
           gstyles[nn] |= globals->module->fallback_style;
         }
       }
@@ -276,7 +306,7 @@
 
       for ( idx = 0; idx < globals->glyph_count; idx++ )
       {
-        if ( ( gstyles[idx] & ~AF_DIGIT ) == style_class->style )
+        if ( ( gstyles[idx] & AF_STYLE_MASK ) == style_class->style )
         {
           if ( !( count % 10 ) )
             FT_TRACE4(( " " ));
@@ -314,18 +344,28 @@
 
     memory = face->memory;
 
+    /* we allocate an AF_FaceGlobals structure together */
+    /* with the glyph_styles array                      */
     if ( FT_ALLOC( globals,
                    sizeof ( *globals ) +
-                     (FT_ULong)face->num_glyphs * sizeof ( FT_Byte ) ) )
+                     (FT_ULong)face->num_glyphs * sizeof ( FT_UShort ) ) )
       goto Exit;
 
-    globals->face         = face;
-    globals->glyph_count  = face->num_glyphs;
-    globals->glyph_styles = (FT_Byte*)( globals + 1 );
-    globals->module       = module;
+    globals->face                      = face;
+    globals->glyph_count               = face->num_glyphs;
+    /* right after the globals structure come the glyph styles */
+    globals->glyph_styles              = (FT_UShort*)( globals + 1 );
+    globals->module                    = module;
+    globals->stem_darkening_for_ppem   = 0;
+    globals->darken_x                  = 0;
+    globals->darken_y                  = 0;
+    globals->standard_vertical_width   = 0;
+    globals->standard_horizontal_width = 0;
+    globals->scale_down_factor         = 0;
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
     globals->hb_font = hb_ft_font_create( face, NULL );
+    globals->hb_buf  = hb_buffer_create();
 #endif
 
     error = af_face_globals_compute_style_coverage( globals );
@@ -371,13 +411,11 @@
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
       hb_font_destroy( globals->hb_font );
-      globals->hb_font = NULL;
+      hb_buffer_destroy( globals->hb_buf );
 #endif
 
-      globals->glyph_count  = 0;
-      globals->glyph_styles = NULL;  /* no need to free this one! */
-      globals->face         = NULL;
-
+      /* no need to free `globals->glyph_styles'; */
+      /* it is part of the `globals' array        */
       FT_FREE( globals );
     }
   }
@@ -415,7 +453,7 @@
                              [style_class->writing_system];
 
     metrics = globals->metrics[style];
-    if ( metrics == NULL )
+    if ( !metrics )
     {
       /* create the global metrics object if necessary */
       FT_Memory  memory = globals->face->memory;
diff --git a/src/autofit/afglobal.h b/src/autofit/afglobal.h
index 9bbb687..489ed46 100644
--- a/src/autofit/afglobal.h
+++ b/src/autofit/afglobal.h
@@ -5,7 +5,7 @@
 /*    Auto-fitter routines to compute global hinting values                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,13 +17,13 @@
 /***************************************************************************/
 
 
-#ifndef __AFGLOBAL_H__
-#define __AFGLOBAL_H__
+#ifndef AFGLOBAL_H_
+#define AFGLOBAL_H_
 
 
 #include "aftypes.h"
 #include "afmodule.h"
-#include "hbshim.h"
+#include "afshaper.h"
 
 
 FT_BEGIN_HEADER
@@ -34,7 +34,7 @@
 
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 )                    \
+#define SCRIPT( s, S, d, h, H, ss )                            \
           AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class )
 
 #include "afscript.h"
@@ -72,10 +72,16 @@
 #endif
   /* default script for OpenType; ignored if HarfBuzz isn't used */
 #define AF_SCRIPT_DEFAULT    AF_SCRIPT_LATN
-  /* a bit mask indicating an uncovered glyph        */
-#define AF_STYLE_UNASSIGNED  0x7F
-  /* if this flag is set, we have an ASCII digit     */
-#define AF_DIGIT             0x80
+
+  /* a bit mask for AF_DIGIT and AF_NONBASE */
+#define AF_STYLE_MASK        0x3FFF
+  /* an uncovered glyph      */
+#define AF_STYLE_UNASSIGNED  AF_STYLE_MASK
+
+  /* if this flag is set, we have an ASCII digit   */
+#define AF_DIGIT             0x8000U
+  /* if this flag is set, we have a non-base character */
+#define AF_NONBASE           0x4000U
 
   /* `increase-x-height' property */
 #define AF_PROP_INCREASE_X_HEIGHT_MIN  6
@@ -100,10 +106,11 @@
   {
     FT_Face          face;
     FT_Long          glyph_count;    /* same as face->num_glyphs */
-    FT_Byte*         glyph_styles;
+    FT_UShort*       glyph_styles;
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
     hb_font_t*       hb_font;
+    hb_buffer_t*     hb_buf;           /* for feature comparison */
 #endif
 
     /* per-face auto-hinter properties */
@@ -111,6 +118,22 @@
 
     AF_StyleMetrics  metrics[AF_STYLE_MAX];
 
+    /* Compute darkening amount once per size.  Use this to check whether */
+    /* darken_{x,y} needs to be recomputed.                               */
+    FT_UShort        stem_darkening_for_ppem;
+    /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_HORZ] */
+    /* to compute the darkening amount.                       */
+    FT_Pos           standard_vertical_width;
+    /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_VERT] */
+    /* to compute the darkening amount.                       */
+    FT_Pos           standard_horizontal_width;
+    /* The actual amount to darken a glyph along the X axis. */
+    FT_Pos           darken_x;
+    /* The actual amount to darken a glyph along the Y axis. */
+    FT_Pos           darken_y;
+    /* Amount to scale down by to keep emboldened points */
+    /* on the Y-axis in pre-computed blue zones.         */
+    FT_Fixed         scale_down_factor;
     AF_Module        module;         /* to access global properties */
 
   } AF_FaceGlobalsRec;
@@ -144,7 +167,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFGLOBAL_H__ */
+#endif /* AFGLOBAL_H_ */
 
 
 /* END */
diff --git a/src/autofit/afhints.c b/src/autofit/afhints.c
index 37482eb..0666dbc 100644
--- a/src/autofit/afhints.c
+++ b/src/autofit/afhints.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines (body).                                 */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -45,7 +45,7 @@
 
     if ( axis->num_segments < AF_SEGMENTS_EMBEDDED )
     {
-      if ( axis->segments == NULL )
+      if ( !axis->segments )
       {
         axis->segments     = axis->embedded.segments;
         axis->max_segments = AF_SEGMENTS_EMBEDDED;
@@ -99,6 +99,7 @@
   af_axis_hints_new_edge( AF_AxisHints  axis,
                           FT_Int        fpos,
                           AF_Direction  dir,
+                          FT_Bool       top_to_bottom_hinting,
                           FT_Memory     memory,
                           AF_Edge      *anedge )
   {
@@ -109,7 +110,7 @@
 
     if ( axis->num_edges < AF_EDGES_EMBEDDED )
     {
-      if ( axis->edges == NULL )
+      if ( !axis->edges )
       {
         axis->edges     = axis->embedded.edges;
         axis->max_edges = AF_EDGES_EMBEDDED;
@@ -153,7 +154,8 @@
 
     while ( edge > edges )
     {
-      if ( edge[-1].fpos < fpos )
+      if ( top_to_bottom_hinting ? ( edge[-1].fpos > fpos )
+                                 : ( edge[-1].fpos < fpos ) )
         break;
 
       /* we want the edge with same position and minor direction */
@@ -219,6 +221,82 @@
 #define AF_INDEX_NUM( ptr, base )  (int)( (ptr) ? ( (ptr) - (base) ) : -1 )
 
 
+  static char*
+  af_print_idx( char* p,
+                int   idx )
+  {
+    if ( idx == -1 )
+    {
+      p[0] = '-';
+      p[1] = '-';
+      p[2] = '\0';
+    }
+    else
+      ft_sprintf( p, "%d", idx );
+
+    return p;
+  }
+
+
+  static int
+  af_get_segment_index( AF_GlyphHints  hints,
+                        int            point_idx,
+                        int            dimension )
+  {
+    AF_AxisHints  axis     = &hints->axis[dimension];
+    AF_Point      point    = hints->points + point_idx;
+    AF_Segment    segments = axis->segments;
+    AF_Segment    limit    = segments + axis->num_segments;
+    AF_Segment    segment;
+
+
+    for ( segment = segments; segment < limit; segment++ )
+    {
+      if ( segment->first <= segment->last )
+      {
+        if ( point >= segment->first && point <= segment->last )
+          break;
+      }
+      else
+      {
+        AF_Point  p = segment->first;
+
+
+        for (;;)
+        {
+          if ( point == p )
+            goto Exit;
+
+          if ( p == segment->last )
+            break;
+
+          p = p->next;
+        }
+      }
+    }
+
+  Exit:
+    if ( segment == limit )
+      return -1;
+
+    return (int)( segment - segments );
+  }
+
+
+  static int
+  af_get_edge_index( AF_GlyphHints  hints,
+                     int            segment_idx,
+                     int            dimension )
+  {
+    AF_AxisHints  axis    = &hints->axis[dimension];
+    AF_Edge       edges   = axis->edges;
+    AF_Segment    segment = axis->segments + segment_idx;
+
+
+    return segment_idx == -1 ? -1 : AF_INDEX_NUM( segment->edge, edges );
+  }
+
+
 #ifdef __cplusplus
   extern "C" {
 #endif
@@ -226,30 +304,63 @@
   af_glyph_hints_dump_points( AF_GlyphHints  hints,
                               FT_Bool        to_stdout )
   {
-    AF_Point  points = hints->points;
-    AF_Point  limit  = points + hints->num_points;
-    AF_Point  point;
+    AF_Point   points  = hints->points;
+    AF_Point   limit   = points + hints->num_points;
+    AF_Point*  contour = hints->contours;
+    AF_Point*  climit  = contour + hints->num_contours;
+    AF_Point   point;
 
 
     AF_DUMP(( "Table of points:\n" ));
 
     if ( hints->num_points )
-      AF_DUMP(( "  [ index |  xorg |  yorg | xscale | yscale"
-                " |  xfit |  yfit |  flags ]\n" ));
+    {
+      AF_DUMP(( "  index  hedge  hseg  vedge  vseg  flags "
+             /* "  XXXXX  XXXXX XXXXX  XXXXX XXXXX  XXXXXX" */
+                "  xorg  yorg  xscale  yscale   xfit    yfit" ));
+             /* " XXXXX XXXXX XXXX.XX XXXX.XX XXXX.XX XXXX.XX" */
+    }
     else
       AF_DUMP(( "  (none)\n" ));
 
     for ( point = points; point < limit; point++ )
-      AF_DUMP(( "  [ %5d | %5d | %5d | %6.2f | %6.2f"
-                " | %5.2f | %5.2f | %c ]\n",
-                AF_INDEX_NUM( point, points ),
+    {
+      int  point_idx     = AF_INDEX_NUM( point, points );
+      int  segment_idx_0 = af_get_segment_index( hints, point_idx, 0 );
+      int  segment_idx_1 = af_get_segment_index( hints, point_idx, 1 );
+
+      char  buf1[16], buf2[16], buf3[16], buf4[16];
+
+
+      /* insert extra newline at the beginning of a contour */
+      if ( contour < climit && *contour == point )
+      {
+        AF_DUMP(( "\n" ));
+        contour++;
+      }
+
+      AF_DUMP(( "  %5d  %5s %5s  %5s %5s  %s"
+                " %5d %5d %7.2f %7.2f %7.2f %7.2f\n",
+                point_idx,
+                af_print_idx( buf1,
+                              af_get_edge_index( hints, segment_idx_1, 1 ) ),
+                af_print_idx( buf2, segment_idx_1 ),
+                af_print_idx( buf3,
+                              af_get_edge_index( hints, segment_idx_0, 0 ) ),
+                af_print_idx( buf4, segment_idx_0 ),
+                ( point->flags & AF_FLAG_NEAR )
+                  ? " near "
+                  : ( point->flags & AF_FLAG_WEAK_INTERPOLATION )
+                    ? " weak "
+                    : "strong",
+
                 point->fx,
                 point->fy,
                 point->ox / 64.0,
                 point->oy / 64.0,
                 point->x / 64.0,
-                point->y / 64.0,
-                ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' '));
+                point->y / 64.0 ));
+    }
     AF_DUMP(( "\n" ));
   }
 #ifdef __cplusplus
@@ -306,31 +417,39 @@
       AF_Segment    limit    = segments + axis->num_segments;
       AF_Segment    seg;
 
+      char  buf1[16], buf2[16], buf3[16];
+
 
       AF_DUMP(( "Table of %s segments:\n",
                 dimension == AF_DIMENSION_HORZ ? "vertical"
                                                : "horizontal" ));
       if ( axis->num_segments )
-        AF_DUMP(( "  [ index |  pos  |  dir  | from"
-                  " |  to  | link | serif | edge"
-                  " | height | extra |    flags    ]\n" ));
+      {
+        AF_DUMP(( "  index   pos   delta   dir   from   to "
+               /* "  XXXXX  XXXXX  XXXXX  XXXXX  XXXX  XXXX" */
+                  "  link  serif  edge"
+               /* "  XXXX  XXXXX  XXXX" */
+                  "  height  extra     flags\n" ));
+               /* "  XXXXXX  XXXXX  XXXXXXXXXXX" */
+      }
       else
         AF_DUMP(( "  (none)\n" ));
 
       for ( seg = segments; seg < limit; seg++ )
-        AF_DUMP(( "  [ %5d | %5.2g | %5s | %4d"
-                  " | %4d | %4d | %5d | %4d"
-                  " | %6d | %5d | %11s ]\n",
+        AF_DUMP(( "  %5d  %5d  %5d  %5s  %4d  %4d"
+                  "  %4s  %5s  %4s"
+                  "  %6d  %5d  %11s\n",
                   AF_INDEX_NUM( seg, segments ),
-                  dimension == AF_DIMENSION_HORZ
-                               ? (int)seg->first->ox / 64.0
-                               : (int)seg->first->oy / 64.0,
+                  seg->pos,
+                  seg->delta,
                   af_dir_str( (AF_Direction)seg->dir ),
                   AF_INDEX_NUM( seg->first, points ),
                   AF_INDEX_NUM( seg->last, points ),
-                  AF_INDEX_NUM( seg->link, segments ),
-                  AF_INDEX_NUM( seg->serif, segments ),
-                  AF_INDEX_NUM( seg->edge, edges ),
+
+                  af_print_idx( buf1, AF_INDEX_NUM( seg->link, segments ) ),
+                  af_print_idx( buf2, AF_INDEX_NUM( seg->serif, segments ) ),
+                  af_print_idx( buf3, AF_INDEX_NUM( seg->edge, edges ) ),
+
                   seg->height,
                   seg->height - ( seg->max_coord - seg->min_coord ),
                   af_edge_flags_to_string( seg->flags ) ));
@@ -397,15 +516,15 @@
       return FT_THROW( Invalid_Argument );
 
     seg      = &axis->segments[idx];
-    *offset  = ( dim == AF_DIMENSION_HORZ ) ? seg->first->ox
-                                            : seg->first->oy;
+    *offset  = ( dim == AF_DIMENSION_HORZ ) ? seg->first->fx
+                                            : seg->first->fy;
     if ( seg->edge )
       *is_blue = (FT_Bool)( seg->edge->blue_edge != 0 );
     else
       *is_blue = FALSE;
 
     if ( *is_blue )
-      *blue_offset = seg->edge->blue_edge->cur;
+      *blue_offset = seg->edge->blue_edge->org;
     else
       *blue_offset = 0;
 
@@ -435,28 +554,43 @@
       AF_Edge       limit = edges + axis->num_edges;
       AF_Edge       edge;
 
+      char  buf1[16], buf2[16];
+
 
       /*
        *  note: AF_DIMENSION_HORZ corresponds to _vertical_ edges
        *        since they have a constant X coordinate.
        */
-      AF_DUMP(( "Table of %s edges:\n",
-                dimension == AF_DIMENSION_HORZ ? "vertical"
-                                               : "horizontal" ));
+      if ( dimension == AF_DIMENSION_HORZ )
+        AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n",
+                  "vertical",
+                  65536.0 * 64.0 / hints->x_scale,
+                  10.0 * hints->x_scale / 65536.0 / 64.0 ));
+      else
+        AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n",
+                  "horizontal",
+                  65536.0 * 64.0 / hints->y_scale,
+                  10.0 * hints->y_scale / 65536.0 / 64.0 ));
+
       if ( axis->num_edges )
-        AF_DUMP(( "  [ index |  pos  |  dir  | link"
-                  " | serif | blue | opos  |  pos  |    flags    ]\n" ));
+      {
+        AF_DUMP(( "  index    pos     dir   link  serif"
+               /* "  XXXXX  XXXX.XX  XXXXX  XXXX  XXXXX" */
+                  "  blue    opos     pos       flags\n" ));
+               /* "    X   XXXX.XX  XXXX.XX  XXXXXXXXXXX" */
+      }
       else
         AF_DUMP(( "  (none)\n" ));
 
       for ( edge = edges; edge < limit; edge++ )
-        AF_DUMP(( "  [ %5d | %5.2g | %5s | %4d"
-                  " | %5d |   %c  | %5.2f | %5.2f | %11s ]\n",
+        AF_DUMP(( "  %5d  %7.2f  %5s  %4s  %5s"
+                  "    %c   %7.2f  %7.2f  %11s\n",
                   AF_INDEX_NUM( edge, edges ),
                   (int)edge->opos / 64.0,
                   af_dir_str( (AF_Direction)edge->dir ),
-                  AF_INDEX_NUM( edge->link, edges ),
-                  AF_INDEX_NUM( edge->serif, edges ),
+                  af_print_idx( buf1, AF_INDEX_NUM( edge->link, edges ) ),
+                  af_print_idx( buf2, AF_INDEX_NUM( edge->serif, edges ) ),
+
                   edge->blue_edge ? 'y' : 'n',
                   edge->opos / 64.0,
                   edge->pos / 64.0,
@@ -622,7 +756,7 @@
 
     if ( new_max <= AF_CONTOURS_EMBEDDED )
     {
-      if ( hints->contours == NULL )
+      if ( !hints->contours )
       {
         hints->contours     = hints->embedded.contours;
         hints->max_contours = AF_CONTOURS_EMBEDDED;
@@ -651,7 +785,7 @@
 
     if ( new_max <= AF_POINTS_EMBEDDED )
     {
-      if ( hints->points == NULL )
+      if ( !hints->points )
       {
         hints->points     = hints->embedded.points;
         hints->max_points = AF_POINTS_EMBEDDED;
@@ -702,18 +836,26 @@
       AF_Point  point;
       AF_Point  point_limit = points + hints->num_points;
 
+      /* value 20 in `near_limit' is heuristic */
+      FT_UInt  units_per_em = hints->metrics->scaler.face->units_per_EM;
+      FT_Int   near_limit   = 20 * units_per_em / 2048;
+
 
       /* compute coordinates & Bezier flags, next and prev */
       {
         FT_Vector*  vec           = outline->points;
         char*       tag           = outline->tags;
-        AF_Point    end           = points + outline->contours[0];
+        FT_Short    endpoint      = outline->contours[0];
+        AF_Point    end           = points + endpoint;
         AF_Point    prev          = end;
         FT_Int      contour_index = 0;
 
 
         for ( point = points; point < point_limit; point++, vec++, tag++ )
         {
+          FT_Pos  out_x, out_y;
+
+
           point->in_dir  = (FT_Char)AF_DIR_NONE;
           point->out_dir = (FT_Char)AF_DIR_NONE;
 
@@ -722,6 +864,9 @@
           point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta;
           point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta;
 
+          end->fx = (FT_Short)outline->points[endpoint].x;
+          end->fy = (FT_Short)outline->points[endpoint].y;
+
           switch ( FT_CURVE_TAG( *tag ) )
           {
           case FT_CURVE_TAG_CONIC:
@@ -734,6 +879,12 @@
             point->flags = AF_FLAG_NONE;
           }
 
+          out_x = point->fx - prev->fx;
+          out_y = point->fy - prev->fy;
+
+          if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit )
+            prev->flags |= AF_FLAG_NEAR;
+
           point->prev = prev;
           prev->next  = point;
           prev        = point;
@@ -742,8 +893,9 @@
           {
             if ( ++contour_index < outline->n_contours )
             {
-              end  = points + outline->contours[contour_index];
-              prev = end;
+              endpoint = outline->contours[contour_index];
+              end      = points + endpoint;
+              prev     = end;
             }
           }
         }
@@ -769,17 +921,15 @@
          *  Compute directions of `in' and `out' vectors.
          *
          *  Note that distances between points that are very near to each
-         *  other are accumulated.  In other words, the auto-hinter
+         *  other are accumulated.  In other words, the auto-hinter either
          *  prepends the small vectors between near points to the first
-         *  non-near vector.  All intermediate points are tagged as
-         *  weak; the directions are adjusted also to be equal to the
-         *  accumulated one.
+         *  non-near vector, or the sum of small vector lengths exceeds a
+         *  threshold, thus `grouping' the small vectors.  All intermediate
+         *  points are tagged as weak; the directions are adjusted also to
+         *  be equal to the accumulated one.
          */
 
-        /* value 20 in `near_limit' is heuristic */
-        FT_UInt  units_per_em = hints->metrics->scaler.face->units_per_EM;
-        FT_Int   near_limit   = 20 * units_per_em / 2048;
-        FT_Int   near_limit2  = 2 * near_limit - 1;
+        FT_Int  near_limit2 = 2 * near_limit - 1;
 
         AF_Point*  contour;
         AF_Point*  contour_limit = hints->contours + hints->num_contours;
@@ -826,7 +976,7 @@
           /* now loop over all points of the contour to get */
           /* `in' and `out' vector directions               */
 
-          curr  = first;
+          curr = first;
 
           /*
            *  We abuse the `u' and `v' fields to store index deltas to the
@@ -849,7 +999,7 @@
 
 
             point = next;
-            next = point->next;
+            next  = point->next;
 
             out_x += next->fx - point->fx;
             out_y += next->fy - point->fy;
@@ -1045,7 +1195,7 @@
         AF_Point  point, first, last;
 
 
-        if ( edge == NULL )
+        if ( !edge )
           continue;
 
         first = seg->first;
@@ -1071,7 +1221,7 @@
         AF_Point  point, first, last;
 
 
-        if ( edge == NULL )
+        if ( !edge )
           continue;
 
         first = seg->first;
diff --git a/src/autofit/afhints.h b/src/autofit/afhints.h
index a64c7a4..3326ebc 100644
--- a/src/autofit/afhints.h
+++ b/src/autofit/afhints.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines (specification).                        */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFHINTS_H__
-#define __AFHINTS_H__
+#ifndef AFHINTS_H_
+#define AFHINTS_H_
 
 #include "aftypes.h"
 
@@ -62,7 +62,7 @@
    *
    *  by David Turner and Werner Lemberg
    *
-   *    http://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf
+   *    https://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf
    *
    *  with appropriate updates.
    *
@@ -221,6 +221,9 @@
   /* candidates for weak interpolation have this flag set */
 #define AF_FLAG_WEAK_INTERPOLATION  ( 1U << 4 )
 
+  /* the distance to the next point is very small */
+#define AF_FLAG_NEAR  ( 1U << 5 )
+
 
   /* edge hint flags */
 #define AF_EDGE_NORMAL  0
@@ -257,6 +260,7 @@
     FT_Byte     flags;       /* edge/segment flags for this segment */
     FT_Char     dir;         /* segment direction                   */
     FT_Short    pos;         /* position of segment                 */
+    FT_Short    delta;       /* deviation from segment position     */
     FT_Short    min_coord;   /* minimum coordinate of segment       */
     FT_Short    max_coord;   /* maximum coordinate of segment       */
     FT_Short    height;      /* the hinted segment height           */
@@ -266,7 +270,6 @@
 
     AF_Segment  link;        /* (stem) link segment        */
     AF_Segment  serif;       /* primary segment for serifs */
-    FT_Pos      num_linked;  /* number of linked segments  */
     FT_Pos      score;       /* used during stem matching  */
     FT_Pos      len;         /* used during stem matching  */
 
@@ -289,7 +292,6 @@
     AF_Width    blue_edge;  /* non-NULL if this is a blue edge */
     AF_Edge     link;       /* link edge                       */
     AF_Edge     serif;      /* primary edge for serifs         */
-    FT_Short    num_linked; /* number of linked edges          */
     FT_Int      score;      /* used during stem matching       */
 
     AF_Segment  first;      /* first segment in edge */
@@ -419,6 +421,7 @@
   af_axis_hints_new_edge( AF_AxisHints  axis,
                           FT_Int        fpos,
                           AF_Direction  dir,
+                          FT_Bool       top_to_bottom_hinting,
                           FT_Memory     memory,
                           AF_Edge      *edge );
 
@@ -472,7 +475,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFHINTS_H__ */
+#endif /* AFHINTS_H_ */
 
 
 /* END */
diff --git a/src/autofit/afindic.c b/src/autofit/afindic.c
index 7412cd1..dfbea5f 100644
--- a/src/autofit/afindic.c
+++ b/src/autofit/afindic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for Indic writing system (body).        */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,13 +18,13 @@
 
 #include "aftypes.h"
 #include "aflatin.h"
+#include "afcjk.h"
 
 
 #ifdef AF_CONFIG_OPTION_INDIC
 
 #include "afindic.h"
 #include "aferrors.h"
-#include "afcjk.h"
 
 
 #ifdef AF_CONFIG_OPTION_USE_WARPER
@@ -79,12 +79,29 @@
 
 
   static FT_Error
-  af_indic_hints_apply( AF_GlyphHints  hints,
+  af_indic_hints_apply( FT_UInt        glyph_index,
+                        AF_GlyphHints  hints,
                         FT_Outline*    outline,
                         AF_CJKMetrics  metrics )
   {
     /* use CJK routines */
-    return af_cjk_hints_apply( hints, outline, metrics );
+    return af_cjk_hints_apply( glyph_index, hints, outline, metrics );
+  }
+
+
+  /* Extract standard_width from writing system/script specific */
+  /* metrics class.                                             */
+
+  static void
+  af_indic_get_standard_widths( AF_CJKMetrics  metrics,
+                                FT_Pos*        stdHW,
+                                FT_Pos*        stdVW )
+  {
+    if ( stdHW )
+      *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
+
+    if ( stdVW )
+      *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width;
   }
 
 
@@ -104,12 +121,13 @@
 
     sizeof ( AF_CJKMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init,
-    (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init,        /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale,       /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL,                         /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   af_indic_hints_init,
-    (AF_WritingSystem_ApplyHintsFunc)  af_indic_hints_apply
+    (AF_WritingSystem_InitHintsFunc)   af_indic_hints_init,          /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  af_indic_hints_apply          /* style_hints_apply     */
   )
 
 
@@ -123,12 +141,13 @@
 
     sizeof ( AF_CJKMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) NULL,
-    (AF_WritingSystem_ScaleMetricsFunc)NULL,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   NULL,
-    (AF_WritingSystem_ApplyHintsFunc)  NULL
+    (AF_WritingSystem_InitHintsFunc)   NULL, /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  NULL  /* style_hints_apply     */
   )
 
 
diff --git a/src/autofit/afindic.h b/src/autofit/afindic.h
index 4c36908..5688738 100644
--- a/src/autofit/afindic.h
+++ b/src/autofit/afindic.h
@@ -5,7 +5,7 @@
 /*    Auto-fitter hinting routines for Indic writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFINDIC_H__
-#define __AFINDIC_H__
+#ifndef AFINDIC_H_
+#define AFINDIC_H_
 
 #include "afhints.h"
 
@@ -35,7 +35,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFINDIC_H__ */
+#endif /* AFINDIC_H_ */
 
 
 /* END */
diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
index 893e986..9f1b540 100644
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for latin writing system (body).        */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -41,6 +41,10 @@
 #define FT_COMPONENT  trace_aflatin
 
 
+  /* needed for computation of round vs. flat segments */
+#define FLAT_THRESHOLD( x )  ( x / 14 )
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -75,7 +79,6 @@
     {
       FT_Error            error;
       FT_ULong            glyph_index;
-      FT_Long             y_offset;
       int                 dim;
       AF_LatinMetricsRec  dummy[1];
       AF_Scaler           scaler = &dummy->root.scaler;
@@ -88,52 +91,63 @@
       AF_ScriptClass  script_class = AF_SCRIPT_CLASSES_GET
                                        [style_class->script];
 
-      FT_UInt32  standard_char;
+      void*        shaper_buf;
+      const char*  p;
 
+#ifdef FT_DEBUG_LEVEL_TRACE
+      FT_ULong  ch = 0;
+#endif
+
+      p          = script_class->standard_charstring;
+      shaper_buf = af_shaper_buf_create( face );
 
       /*
-       * We check more than a single standard character to catch features
-       * like `c2sc' (small caps from caps) that don't contain lowercase
-       * letters by definition, or other features that mainly operate on
-       * numerals.
+       * We check a list of standard characters to catch features like
+       * `c2sc' (small caps from caps) that don't contain lowercase letters
+       * by definition, or other features that mainly operate on numerals.
+       * The first match wins.
        */
 
-      standard_char = script_class->standard_char1;
-      af_get_char_index( &metrics->root,
-                         standard_char,
-                         &glyph_index,
-                         &y_offset );
-      if ( !glyph_index )
+      glyph_index = 0;
+      while ( *p )
       {
-        if ( script_class->standard_char2 )
-        {
-          standard_char = script_class->standard_char2;
-          af_get_char_index( &metrics->root,
-                             standard_char,
-                             &glyph_index,
-                             &y_offset );
-          if ( !glyph_index )
-          {
-            if ( script_class->standard_char3 )
-            {
-              standard_char = script_class->standard_char3;
-              af_get_char_index( &metrics->root,
-                                 standard_char,
-                                 &glyph_index,
-                                 &y_offset );
-              if ( !glyph_index )
-                goto Exit;
-            }
-            else
-              goto Exit;
-          }
-        }
-        else
-          goto Exit;
+        unsigned int  num_idx;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        const char*  p_old;
+#endif
+
+
+        while ( *p == ' ' )
+          p++;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        p_old = p;
+        GET_UTF8_CHAR( ch, p_old );
+#endif
+
+        /* reject input that maps to more than a single glyph */
+        p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+        if ( num_idx > 1 )
+          continue;
+
+        /* otherwise exit loop if we have a result */
+        glyph_index = af_shaper_get_elem( &metrics->root,
+                                          shaper_buf,
+                                          0,
+                                          NULL,
+                                          NULL );
+        if ( glyph_index )
+          break;
       }
 
+      af_shaper_buf_destroy( face, shaper_buf );
+
+      if ( !glyph_index )
+        goto Exit;
+
       FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n",
-                  standard_char, glyph_index ));
+                  ch, glyph_index ));
 
       error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
       if ( error || face->glyph->outline.n_points <= 0 )
@@ -251,6 +265,45 @@
   }
 
 
+  static void
+  af_latin_sort_blue( FT_UInt        count,
+                      AF_LatinBlue*  table )
+  {
+    FT_UInt       i, j;
+    AF_LatinBlue  swap;
+
+
+    /* we sort from bottom to top */
+    for ( i = 1; i < count; i++ )
+    {
+      for ( j = i; j > 0; j-- )
+      {
+        FT_Pos  a, b;
+
+
+        if ( table[j - 1]->flags & ( AF_LATIN_BLUE_TOP     |
+                                     AF_LATIN_BLUE_SUB_TOP ) )
+          a = table[j - 1]->ref.org;
+        else
+          a = table[j - 1]->shoot.org;
+
+        if ( table[j]->flags & ( AF_LATIN_BLUE_TOP     |
+                                 AF_LATIN_BLUE_SUB_TOP ) )
+          b = table[j]->ref.org;
+        else
+          b = table[j]->shoot.org;
+
+        if ( b >= a )
+          break;
+
+        swap         = table[j];
+        table[j]     = table[j - 1];
+        table[j - 1] = swap;
+      }
+    }
+  }
+
+
   /* Find all blue zones.  Flat segments give the reference points, */
   /* round segments the overshoot positions.                        */
 
@@ -274,6 +327,10 @@
     AF_Blue_Stringset         bss = sc->blue_stringset;
     const AF_Blue_StringRec*  bs  = &af_blue_stringsets[bss];
 
+    FT_Pos  flat_threshold = FLAT_THRESHOLD( metrics->units_per_em );
+
+    void*  shaper_buf;
+
 
     /* we walk over the blue character strings as specified in the */
     /* style's entry in the `af_blue_stringset' array              */
@@ -282,11 +339,15 @@
                 "============================\n"
                 "\n" ));
 
+    shaper_buf = af_shaper_buf_create( face );
+
     for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ )
     {
       const char*  p = &af_blue_strings[bs->string];
       FT_Pos*      blue_ref;
       FT_Pos*      blue_shoot;
+      FT_Pos       ascender;
+      FT_Pos       descender;
 
 
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -305,6 +366,11 @@
             FT_TRACE5(( "top" ));
             have_flag = 1;
           }
+          else if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) )
+          {
+            FT_TRACE5(( "sub top" ));
+            have_flag = 1;
+          }
 
           if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
           {
@@ -338,394 +404,482 @@
 
       num_flats  = 0;
       num_rounds = 0;
+      ascender   = 0;
+      descender  = 0;
 
       while ( *p )
       {
-        FT_ULong    ch;
         FT_ULong    glyph_index;
         FT_Long     y_offset;
-        FT_Pos      best_y;                            /* same as points.y */
         FT_Int      best_point, best_contour_first, best_contour_last;
         FT_Vector*  points;
-        FT_Bool     round = 0;
+
+        FT_Pos   best_y_extremum;                      /* same as points.y */
+        FT_Bool  best_round = 0;
+
+        unsigned int  i, num_idx;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        const char*  p_old;
+        FT_ULong     ch;
+#endif
 
 
-        GET_UTF8_CHAR( ch, p );
+        while ( *p == ' ' )
+          p++;
 
-        /* load the character in the face -- skip unknown or empty ones */
-        af_get_char_index( &metrics->root, ch, &glyph_index, &y_offset );
-        if ( glyph_index == 0 )
+#ifdef FT_DEBUG_LEVEL_TRACE
+        p_old = p;
+        GET_UTF8_CHAR( ch, p_old );
+#endif
+
+        p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+
+        if ( !num_idx )
         {
           FT_TRACE5(( "  U+%04lX unavailable\n", ch ));
           continue;
         }
 
-        error   = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
-        outline = face->glyph->outline;
-        /* reject glyphs that don't produce any rendering */
-        if ( error || outline.n_points <= 2 )
+        if ( AF_LATIN_IS_TOP_BLUE( bs ) )
+          best_y_extremum = FT_INT_MIN;
+        else
+          best_y_extremum = FT_INT_MAX;
+
+        /* iterate over all glyph elements of the character cluster */
+        /* and get the data of the `biggest' one                    */
+        for ( i = 0; i < num_idx; i++ )
         {
-          FT_TRACE5(( "  U+%04lX contains no (usable) outlines\n", ch ));
-          continue;
-        }
-
-        /* now compute min or max point indices and coordinates */
-        points             = outline.points;
-        best_point         = -1;
-        best_y             = 0;  /* make compiler happy */
-        best_contour_first = 0;  /* ditto */
-        best_contour_last  = 0;  /* ditto */
-
-        {
-          FT_Int  nn;
-          FT_Int  first = 0;
-          FT_Int  last  = -1;
+          FT_Pos   best_y;
+          FT_Bool  round = 0;
 
 
-          for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ )
+          /* load the character in the face -- skip unknown or empty ones */
+          glyph_index = af_shaper_get_elem( &metrics->root,
+                                            shaper_buf,
+                                            i,
+                                            NULL,
+                                            &y_offset );
+          if ( glyph_index == 0 )
           {
-            FT_Int  old_best_point = best_point;
-            FT_Int  pp;
-
-
-            last = outline.contours[nn];
-
-            /* Avoid single-point contours since they are never rasterized. */
-            /* In some fonts, they correspond to mark attachment points     */
-            /* that are way outside of the glyph's real outline.            */
-            if ( last <= first )
-              continue;
-
-            if ( AF_LATIN_IS_TOP_BLUE( bs ) )
-            {
-              for ( pp = first; pp <= last; pp++ )
-                if ( best_point < 0 || points[pp].y > best_y )
-                {
-                  best_point = pp;
-                  best_y     = points[pp].y;
-                }
-            }
-            else
-            {
-              for ( pp = first; pp <= last; pp++ )
-                if ( best_point < 0 || points[pp].y < best_y )
-                {
-                  best_point = pp;
-                  best_y     = points[pp].y;
-                }
-            }
-
-            if ( best_point != old_best_point )
-            {
-              best_contour_first = first;
-              best_contour_last  = last;
-            }
-          }
-        }
-
-        /* now check whether the point belongs to a straight or round   */
-        /* segment; we first need to find in which contour the extremum */
-        /* lies, then inspect its previous and next points              */
-        if ( best_point >= 0 )
-        {
-          FT_Pos  best_x = points[best_point].x;
-          FT_Int  prev, next;
-          FT_Int  best_segment_first, best_segment_last;
-          FT_Int  best_on_point_first, best_on_point_last;
-          FT_Pos  dist;
-
-
-          best_segment_first = best_point;
-          best_segment_last  = best_point;
-
-          if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON )
-          {
-            best_on_point_first = best_point;
-            best_on_point_last  = best_point;
-          }
-          else
-          {
-            best_on_point_first = -1;
-            best_on_point_last  = -1;
+            FT_TRACE5(( "  U+%04lX unavailable\n", ch ));
+            continue;
           }
 
-          /* look for the previous and next points on the contour  */
-          /* that are not on the same Y coordinate, then threshold */
-          /* the `closeness'...                                    */
-          prev = best_point;
-          next = prev;
-
-          do
+          error   = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+          outline = face->glyph->outline;
+          /* reject glyphs that don't produce any rendering */
+          if ( error || outline.n_points <= 2 )
           {
-            if ( prev > best_contour_first )
-              prev--;
+#ifdef FT_DEBUG_LEVEL_TRACE
+            if ( num_idx == 1 )
+              FT_TRACE5(( "  U+%04lX contains no (usable) outlines\n", ch ));
             else
-              prev = best_contour_last;
+              FT_TRACE5(( "  component %d of cluster starting with U+%04lX"
+                          " contains no (usable) outlines\n", i, ch ));
+#endif
+            continue;
+          }
 
-            dist = FT_ABS( points[prev].y - best_y );
-            /* accept a small distance or a small angle (both values are */
-            /* heuristic; value 20 corresponds to approx. 2.9 degrees)   */
-            if ( dist > 5 )
-              if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )
-                break;
+          /* now compute min or max point indices and coordinates */
+          points             = outline.points;
+          best_point         = -1;
+          best_y             = 0;  /* make compiler happy */
+          best_contour_first = 0;  /* ditto */
+          best_contour_last  = 0;  /* ditto */
 
-            best_segment_first = prev;
-
-            if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON )
-            {
-              best_on_point_first = prev;
-              if ( best_on_point_last < 0 )
-                best_on_point_last = prev;
-            }
-
-          } while ( prev != best_point );
-
-          do
           {
-            if ( next < best_contour_last )
-              next++;
-            else
-              next = best_contour_first;
+            FT_Int  nn;
+            FT_Int  first = 0;
+            FT_Int  last  = -1;
 
-            dist = FT_ABS( points[next].y - best_y );
-            if ( dist > 5 )
-              if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )
-                break;
 
-            best_segment_last = next;
-
-            if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON )
+            for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ )
             {
-              best_on_point_last = next;
-              if ( best_on_point_first < 0 )
-                best_on_point_first = next;
-            }
-
-          } while ( next != best_point );
-
-          if ( AF_LATIN_IS_LONG_BLUE( bs ) )
-          {
-            /* If this flag is set, we have an additional constraint to  */
-            /* get the blue zone distance: Find a segment of the topmost */
-            /* (or bottommost) contour that is longer than a heuristic   */
-            /* threshold.  This ensures that small bumps in the outline  */
-            /* are ignored (for example, the `vertical serifs' found in  */
-            /* many Hebrew glyph designs).                               */
-
-            /* If this segment is long enough, we are done.  Otherwise,  */
-            /* search the segment next to the extremum that is long      */
-            /* enough, has the same direction, and a not too large       */
-            /* vertical distance from the extremum.  Note that the       */
-            /* algorithm doesn't check whether the found segment is      */
-            /* actually the one (vertically) nearest to the extremum.    */
-
-            /* heuristic threshold value */
-            FT_Pos  length_threshold = metrics->units_per_em / 25;
+              FT_Int  old_best_point = best_point;
+              FT_Int  pp;
 
 
-            dist = FT_ABS( points[best_segment_last].x -
-                             points[best_segment_first].x );
+              last = outline.contours[nn];
 
-            if ( dist < length_threshold                       &&
-                 best_segment_last - best_segment_first + 2 <=
-                   best_contour_last - best_contour_first      )
-            {
-              /* heuristic threshold value */
-              FT_Pos  height_threshold = metrics->units_per_em / 4;
-
-              FT_Int   first;
-              FT_Int   last;
-              FT_Bool  hit;
-
-              /* we intentionally declare these two variables        */
-              /* outside of the loop since various compilers emit    */
-              /* incorrect warning messages otherwise, talking about */
-              /* `possibly uninitialized variables'                  */
-              FT_Int  p_first = 0;            /* make compiler happy */
-              FT_Int  p_last  = 0;
-
-              FT_Bool  left2right;
-
-
-              /* compute direction */
-              prev = best_point;
-
-              do
-              {
-                if ( prev > best_contour_first )
-                  prev--;
-                else
-                  prev = best_contour_last;
-
-                if ( points[prev].x != best_x )
-                  break;
-
-              } while ( prev != best_point );
-
-              /* skip glyph for the degenerate case */
-              if ( prev == best_point )
+              /* Avoid single-point contours since they are never      */
+              /* rasterized.  In some fonts, they correspond to mark   */
+              /* attachment points that are way outside of the glyph's */
+              /* real outline.                                         */
+              if ( last <= first )
                 continue;
 
-              left2right = FT_BOOL( points[prev].x < points[best_point].x );
-
-              first = best_segment_last;
-              last  = first;
-              hit   = 0;
-
-              do
+              if ( AF_LATIN_IS_TOP_BLUE( bs )     ||
+                   AF_LATIN_IS_SUB_TOP_BLUE( bs ) )
               {
-                FT_Bool  l2r;
-                FT_Pos   d;
-
-
-                if ( !hit )
+                for ( pp = first; pp <= last; pp++ )
                 {
-                  /* no hit; adjust first point */
-                  first = last;
-
-                  /* also adjust first and last on point */
-                  if ( FT_CURVE_TAG( outline.tags[first] ) ==
-                         FT_CURVE_TAG_ON )
+                  if ( best_point < 0 || points[pp].y > best_y )
                   {
-                    p_first = first;
-                    p_last  = first;
+                    best_point = pp;
+                    best_y     = points[pp].y;
+                    ascender   = FT_MAX( ascender, best_y + y_offset );
                   }
                   else
+                    descender = FT_MIN( descender, points[pp].y + y_offset );
+                }
+              }
+              else
+              {
+                for ( pp = first; pp <= last; pp++ )
+                {
+                  if ( best_point < 0 || points[pp].y < best_y )
                   {
-                    p_first = -1;
-                    p_last  = -1;
+                    best_point = pp;
+                    best_y     = points[pp].y;
+                    descender  = FT_MIN( descender, best_y + y_offset );
+                  }
+                  else
+                    ascender = FT_MAX( ascender, points[pp].y + y_offset );
+                }
+              }
+
+              if ( best_point != old_best_point )
+              {
+                best_contour_first = first;
+                best_contour_last  = last;
+              }
+            }
+          }
+
+          /* now check whether the point belongs to a straight or round   */
+          /* segment; we first need to find in which contour the extremum */
+          /* lies, then inspect its previous and next points              */
+          if ( best_point >= 0 )
+          {
+            FT_Pos  best_x = points[best_point].x;
+            FT_Int  prev, next;
+            FT_Int  best_segment_first, best_segment_last;
+            FT_Int  best_on_point_first, best_on_point_last;
+            FT_Pos  dist;
+
+
+            best_segment_first = best_point;
+            best_segment_last  = best_point;
+
+            if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON )
+            {
+              best_on_point_first = best_point;
+              best_on_point_last  = best_point;
+            }
+            else
+            {
+              best_on_point_first = -1;
+              best_on_point_last  = -1;
+            }
+
+            /* look for the previous and next points on the contour  */
+            /* that are not on the same Y coordinate, then threshold */
+            /* the `closeness'...                                    */
+            prev = best_point;
+            next = prev;
+
+            do
+            {
+              if ( prev > best_contour_first )
+                prev--;
+              else
+                prev = best_contour_last;
+
+              dist = FT_ABS( points[prev].y - best_y );
+              /* accept a small distance or a small angle (both values are */
+              /* heuristic; value 20 corresponds to approx. 2.9 degrees)   */
+              if ( dist > 5 )
+                if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist )
+                  break;
+
+              best_segment_first = prev;
+
+              if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON )
+              {
+                best_on_point_first = prev;
+                if ( best_on_point_last < 0 )
+                  best_on_point_last = prev;
+              }
+
+            } while ( prev != best_point );
+
+            do
+            {
+              if ( next < best_contour_last )
+                next++;
+              else
+                next = best_contour_first;
+
+              dist = FT_ABS( points[next].y - best_y );
+              if ( dist > 5 )
+                if ( FT_ABS( points[next].x - best_x ) <= 20 * dist )
+                  break;
+
+              best_segment_last = next;
+
+              if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON )
+              {
+                best_on_point_last = next;
+                if ( best_on_point_first < 0 )
+                  best_on_point_first = next;
+              }
+
+            } while ( next != best_point );
+
+            if ( AF_LATIN_IS_LONG_BLUE( bs ) )
+            {
+              /* If this flag is set, we have an additional constraint to  */
+              /* get the blue zone distance: Find a segment of the topmost */
+              /* (or bottommost) contour that is longer than a heuristic   */
+              /* threshold.  This ensures that small bumps in the outline  */
+              /* are ignored (for example, the `vertical serifs' found in  */
+              /* many Hebrew glyph designs).                               */
+
+              /* If this segment is long enough, we are done.  Otherwise,  */
+              /* search the segment next to the extremum that is long      */
+              /* enough, has the same direction, and a not too large       */
+              /* vertical distance from the extremum.  Note that the       */
+              /* algorithm doesn't check whether the found segment is      */
+              /* actually the one (vertically) nearest to the extremum.    */
+
+              /* heuristic threshold value */
+              FT_Pos  length_threshold = metrics->units_per_em / 25;
+
+
+              dist = FT_ABS( points[best_segment_last].x -
+                               points[best_segment_first].x );
+
+              if ( dist < length_threshold                       &&
+                   best_segment_last - best_segment_first + 2 <=
+                     best_contour_last - best_contour_first      )
+              {
+                /* heuristic threshold value */
+                FT_Pos  height_threshold = metrics->units_per_em / 4;
+
+                FT_Int   first;
+                FT_Int   last;
+                FT_Bool  hit;
+
+                /* we intentionally declare these two variables        */
+                /* outside of the loop since various compilers emit    */
+                /* incorrect warning messages otherwise, talking about */
+                /* `possibly uninitialized variables'                  */
+                FT_Int  p_first = 0;            /* make compiler happy */
+                FT_Int  p_last  = 0;
+
+                FT_Bool  left2right;
+
+
+                /* compute direction */
+                prev = best_point;
+
+                do
+                {
+                  if ( prev > best_contour_first )
+                    prev--;
+                  else
+                    prev = best_contour_last;
+
+                  if ( points[prev].x != best_x )
+                    break;
+
+                } while ( prev != best_point );
+
+                /* skip glyph for the degenerate case */
+                if ( prev == best_point )
+                  continue;
+
+                left2right = FT_BOOL( points[prev].x < points[best_point].x );
+
+                first = best_segment_last;
+                last  = first;
+                hit   = 0;
+
+                do
+                {
+                  FT_Bool  l2r;
+                  FT_Pos   d;
+
+
+                  if ( !hit )
+                  {
+                    /* no hit; adjust first point */
+                    first = last;
+
+                    /* also adjust first and last on point */
+                    if ( FT_CURVE_TAG( outline.tags[first] ) ==
+                           FT_CURVE_TAG_ON )
+                    {
+                      p_first = first;
+                      p_last  = first;
+                    }
+                    else
+                    {
+                      p_first = -1;
+                      p_last  = -1;
+                    }
+
+                    hit = 1;
                   }
 
-                  hit = 1;
-                }
+                  if ( last < best_contour_last )
+                    last++;
+                  else
+                    last = best_contour_first;
 
-                if ( last < best_contour_last )
-                  last++;
-                else
-                  last = best_contour_first;
-
-                if ( FT_ABS( best_y - points[first].y ) > height_threshold )
-                {
-                  /* vertical distance too large */
-                  hit = 0;
-                  continue;
-                }
-
-                /* same test as above */
-                dist = FT_ABS( points[last].y - points[first].y );
-                if ( dist > 5 )
-                  if ( FT_ABS( points[last].x - points[first].x ) <=
-                         20 * dist )
+                  if ( FT_ABS( best_y - points[first].y ) > height_threshold )
                   {
+                    /* vertical distance too large */
                     hit = 0;
                     continue;
                   }
 
-                if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON )
-                {
-                  p_last = last;
-                  if ( p_first < 0 )
-                    p_first = last;
-                }
-
-                l2r = FT_BOOL( points[first].x < points[last].x );
-                d   = FT_ABS( points[last].x - points[first].x );
-
-                if ( l2r == left2right     &&
-                     d >= length_threshold )
-                {
-                  /* all constraints are met; update segment after finding */
-                  /* its end                                               */
-                  do
-                  {
-                    if ( last < best_contour_last )
-                      last++;
-                    else
-                      last = best_contour_first;
-
-                    d = FT_ABS( points[last].y - points[first].y );
-                    if ( d > 5 )
-                      if ( FT_ABS( points[next].x - points[first].x ) <=
-                             20 * dist )
-                      {
-                        if ( last > best_contour_first )
-                          last--;
-                        else
-                          last = best_contour_last;
-                        break;
-                      }
-
-                    p_last = last;
-
-                    if ( FT_CURVE_TAG( outline.tags[last] ) ==
-                           FT_CURVE_TAG_ON )
+                  /* same test as above */
+                  dist = FT_ABS( points[last].y - points[first].y );
+                  if ( dist > 5 )
+                    if ( FT_ABS( points[last].x - points[first].x ) <=
+                           20 * dist )
                     {
-                      p_last = last;
-                      if ( p_first < 0 )
-                        p_first = last;
+                      hit = 0;
+                      continue;
                     }
 
-                  } while ( last != best_segment_first );
+                  if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON )
+                  {
+                    p_last = last;
+                    if ( p_first < 0 )
+                      p_first = last;
+                  }
 
-                  best_y = points[first].y;
+                  l2r = FT_BOOL( points[first].x < points[last].x );
+                  d   = FT_ABS( points[last].x - points[first].x );
 
-                  best_segment_first = first;
-                  best_segment_last  = last;
+                  if ( l2r == left2right     &&
+                       d >= length_threshold )
+                  {
+                    /* all constraints are met; update segment after */
+                    /* finding its end                               */
+                    do
+                    {
+                      if ( last < best_contour_last )
+                        last++;
+                      else
+                        last = best_contour_first;
 
-                  best_on_point_first = p_first;
-                  best_on_point_last  = p_last;
+                      d = FT_ABS( points[last].y - points[first].y );
+                      if ( d > 5 )
+                        if ( FT_ABS( points[next].x - points[first].x ) <=
+                               20 * dist )
+                        {
+                          if ( last > best_contour_first )
+                            last--;
+                          else
+                            last = best_contour_last;
+                          break;
+                        }
 
-                  break;
-                }
+                      p_last = last;
 
-              } while ( last != best_segment_first );
+                      if ( FT_CURVE_TAG( outline.tags[last] ) ==
+                             FT_CURVE_TAG_ON )
+                      {
+                        p_last = last;
+                        if ( p_first < 0 )
+                          p_first = last;
+                      }
+
+                    } while ( last != best_segment_first );
+
+                    best_y = points[first].y;
+
+                    best_segment_first = first;
+                    best_segment_last  = last;
+
+                    best_on_point_first = p_first;
+                    best_on_point_last  = p_last;
+
+                    break;
+                  }
+
+                } while ( last != best_segment_first );
+              }
+            }
+
+            /* for computing blue zones, we add the y offset as returned */
+            /* by the currently used OpenType feature -- for example,    */
+            /* superscript glyphs might be identical to subscript glyphs */
+            /* with a vertical shift                                     */
+            best_y += y_offset;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+            if ( num_idx == 1 )
+              FT_TRACE5(( "  U+%04lX: best_y = %5ld", ch, best_y ));
+            else
+              FT_TRACE5(( "  component %d of cluster starting with U+%04lX:"
+                          " best_y = %5ld", i, ch, best_y ));
+#endif
+
+            /* now set the `round' flag depending on the segment's kind: */
+            /*                                                           */
+            /* - if the horizontal distance between the first and last   */
+            /*   `on' point is larger than a heuristic threshold         */
+            /*   we have a flat segment                                  */
+            /* - if either the first or the last point of the segment is */
+            /*   an `off' point, the segment is round, otherwise it is   */
+            /*   flat                                                    */
+            if ( best_on_point_first >= 0                               &&
+                 best_on_point_last >= 0                                &&
+                 ( FT_ABS( points[best_on_point_last].x -
+                           points[best_on_point_first].x ) ) >
+                   flat_threshold                                       )
+              round = 0;
+            else
+              round = FT_BOOL(
+                        FT_CURVE_TAG( outline.tags[best_segment_first] ) !=
+                          FT_CURVE_TAG_ON                                   ||
+                        FT_CURVE_TAG( outline.tags[best_segment_last]  ) !=
+                          FT_CURVE_TAG_ON                                   );
+
+            if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
+            {
+              /* only use flat segments for a neutral blue zone */
+              FT_TRACE5(( " (round, skipped)\n" ));
+              continue;
+            }
+
+            FT_TRACE5(( " (%s)\n", round ? "round" : "flat" ));
+          }
+
+          if ( AF_LATIN_IS_TOP_BLUE( bs ) )
+          {
+            if ( best_y > best_y_extremum )
+            {
+              best_y_extremum = best_y;
+              best_round      = round;
+            }
+          }
+          else
+          {
+            if ( best_y < best_y_extremum )
+            {
+              best_y_extremum = best_y;
+              best_round      = round;
             }
           }
 
-          /* for computing blue zones, we add the y offset as returned */
-          /* by the currently used OpenType feature -- for example,    */
-          /* superscript glyphs might be identical to subscript glyphs */
-          /* with a vertical shift                                     */
-          best_y += y_offset;
+        } /* end for loop */
 
-          FT_TRACE5(( "  U+%04lX: best_y = %5ld", ch, best_y ));
-
-          /* now set the `round' flag depending on the segment's kind: */
-          /*                                                           */
-          /* - if the horizontal distance between the first and last   */
-          /*   `on' point is larger than upem/8 (value 8 is heuristic) */
-          /*   we have a flat segment                                  */
-          /* - if either the first or the last point of the segment is */
-          /*   an `off' point, the segment is round, otherwise it is   */
-          /*   flat                                                    */
-          if ( best_on_point_first >= 0                               &&
-               best_on_point_last >= 0                                &&
-               (FT_UInt)( FT_ABS( points[best_on_point_last].x -
-                                  points[best_on_point_first].x ) ) >
-                 metrics->units_per_em / 8                            )
-            round = 0;
+        if ( !( best_y_extremum == FT_INT_MIN ||
+                best_y_extremum == FT_INT_MAX ) )
+        {
+          if ( best_round )
+            rounds[num_rounds++] = best_y_extremum;
           else
-            round = FT_BOOL(
-                      FT_CURVE_TAG( outline.tags[best_segment_first] ) !=
-                        FT_CURVE_TAG_ON                                   ||
-                      FT_CURVE_TAG( outline.tags[best_segment_last]  ) !=
-                        FT_CURVE_TAG_ON                                   );
-
-          if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
-          {
-            /* only use flat segments for a neutral blue zone */
-            FT_TRACE5(( " (round, skipped)\n" ));
-            continue;
-          }
-
-          FT_TRACE5(( " (%s)\n", round ? "round" : "flat" ));
+            flats[num_flats++]   = best_y_extremum;
         }
 
-        if ( round )
-          rounds[num_rounds++] = best_y;
-        else
-          flats[num_flats++]   = best_y;
-      }
+      } /* end while loop */
 
       if ( num_flats == 0 && num_rounds == 0 )
       {
@@ -775,7 +929,8 @@
         FT_Bool  over_ref = FT_BOOL( shoot > ref );
 
 
-        if ( AF_LATIN_IS_TOP_BLUE( bs ) ^ over_ref )
+        if ( ( AF_LATIN_IS_TOP_BLUE( bs )    ||
+               AF_LATIN_IS_SUB_TOP_BLUE( bs) ) ^ over_ref )
         {
           *blue_ref   =
           *blue_shoot = ( shoot + ref ) / 2;
@@ -785,9 +940,14 @@
         }
       }
 
+      blue->ascender  = ascender;
+      blue->descender = descender;
+
       blue->flags = 0;
       if ( AF_LATIN_IS_TOP_BLUE( bs ) )
         blue->flags |= AF_LATIN_BLUE_TOP;
+      if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) )
+        blue->flags |= AF_LATIN_BLUE_SUB_TOP;
       if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) )
         blue->flags |= AF_LATIN_BLUE_NEUTRAL;
 
@@ -802,6 +962,63 @@
       FT_TRACE5(( "    -> reference = %ld\n"
                   "       overshoot = %ld\n",
                   *blue_ref, *blue_shoot ));
+
+    } /* end for loop */
+
+    af_shaper_buf_destroy( face, shaper_buf );
+
+    /* we finally check whether blue zones are ordered; */
+    /* `ref' and `shoot' values of two blue zones must not overlap */
+    if ( axis->blue_count )
+    {
+      FT_UInt       i;
+      AF_LatinBlue  blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2];
+
+
+      for ( i = 0; i < axis->blue_count; i++ )
+        blue_sorted[i] = &axis->blues[i];
+
+      /* sort bottoms of blue zones... */
+      af_latin_sort_blue( axis->blue_count, blue_sorted );
+
+      /* ...and adjust top values if necessary */
+      for ( i = 0; i < axis->blue_count - 1; i++ )
+      {
+        FT_Pos*  a;
+        FT_Pos*  b;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        FT_Bool  a_is_top = 0;
+#endif
+
+
+        if ( blue_sorted[i]->flags & ( AF_LATIN_BLUE_TOP     |
+                                       AF_LATIN_BLUE_SUB_TOP ) )
+        {
+          a = &blue_sorted[i]->shoot.org;
+#ifdef FT_DEBUG_LEVEL_TRACE
+          a_is_top = 1;
+#endif
+        }
+        else
+          a = &blue_sorted[i]->ref.org;
+
+        if ( blue_sorted[i + 1]->flags & ( AF_LATIN_BLUE_TOP     |
+                                           AF_LATIN_BLUE_SUB_TOP ) )
+          b = &blue_sorted[i + 1]->shoot.org;
+        else
+          b = &blue_sorted[i + 1]->ref.org;
+
+        if ( *a > *b )
+        {
+          *a = *b;
+          FT_TRACE5(( "blue zone overlap:"
+                      " adjusting %s %d to %ld\n",
+                      a_is_top ? "overshoot" : "reference",
+                      blue_sorted[i] - axis->blues,
+                      *a ));
+        }
+      }
     }
 
     FT_TRACE5(( "\n" ));
@@ -816,27 +1033,36 @@
   af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
                                  FT_Face          face )
   {
-    FT_UInt   i;
     FT_Bool   started = 0, same_width = 1;
-    FT_Fixed  advance, old_advance = 0;
+    FT_Fixed  advance = 0, old_advance = 0;
+
+    void*  shaper_buf;
+
+    /* in all supported charmaps, digits have character codes 0x30-0x39 */
+    const char   digits[] = "0 1 2 3 4 5 6 7 8 9";
+    const char*  p;
 
 
-    /* digit `0' is 0x30 in all supported charmaps */
-    for ( i = 0x30; i <= 0x39; i++ )
+    p          = digits;
+    shaper_buf = af_shaper_buf_create( face );
+
+    while ( *p )
     {
-      FT_ULong  glyph_index;
-      FT_Long   y_offset;
+      FT_ULong      glyph_index;
+      unsigned int  num_idx;
 
 
-      af_get_char_index( &metrics->root, i, &glyph_index, &y_offset );
-      if ( glyph_index == 0 )
+      /* reject input that maps to more than a single glyph */
+      p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx );
+      if ( num_idx > 1 )
         continue;
 
-      if ( FT_Get_Advance( face, glyph_index,
-                           FT_LOAD_NO_SCALE         |
-                           FT_LOAD_NO_HINTING       |
-                           FT_LOAD_IGNORE_TRANSFORM,
-                           &advance ) )
+      glyph_index = af_shaper_get_elem( &metrics->root,
+                                        shaper_buf,
+                                        0,
+                                        &advance,
+                                        NULL );
+      if ( !glyph_index )
         continue;
 
       if ( started )
@@ -854,6 +1080,8 @@
       }
     }
 
+    af_shaper_buf_destroy( face, shaper_buf );
+
     metrics->root.digits_have_same_width = same_width;
   }
 
@@ -941,7 +1169,7 @@
         FT_UInt  ppem;
 
 
-        scaled    = FT_MulFix( blue->shoot.org, scaler->y_scale );
+        scaled    = FT_MulFix( blue->shoot.org, scale );
         ppem      = metrics->root.scaler.face->size->metrics.x_ppem;
         limit     = metrics->root.globals->increase_x_height;
         threshold = 40;
@@ -967,18 +1195,52 @@
 #endif
           if ( dim == AF_DIMENSION_VERT )
           {
-            scale = FT_MulDiv( scale, fitted, scaled );
+            FT_Pos    max_height;
+            FT_Pos    dist;
+            FT_Fixed  new_scale;
 
-            FT_TRACE5((
-              "af_latin_metrics_scale_dim:"
-              " x height alignment (style `%s'):\n"
-              "                           "
-              " vertical scaling changed from %.4f to %.4f (by %d%%)\n"
-              "\n",
-              af_style_names[metrics->root.style_class->style],
-              axis->org_scale / 65536.0,
-              scale / 65536.0,
-              ( fitted - scaled ) * 100 / scaled ));
+
+            new_scale = FT_MulDiv( scale, fitted, scaled );
+
+            /* the scaling should not change the result by more than two pixels */
+            max_height = metrics->units_per_em;
+
+            for ( nn = 0; nn < Axis->blue_count; nn++ )
+            {
+              max_height = FT_MAX( max_height, Axis->blues[nn].ascender );
+              max_height = FT_MAX( max_height, -Axis->blues[nn].descender );
+            }
+
+            dist  = FT_ABS( FT_MulFix( max_height, new_scale - scale ) );
+            dist &= ~127;
+
+            if ( dist == 0 )
+            {
+              FT_TRACE5((
+                "af_latin_metrics_scale_dim:"
+                " x height alignment (style `%s'):\n"
+                "                           "
+                " vertical scaling changed from %.5f to %.5f (by %d%%)\n"
+                "\n",
+                af_style_names[metrics->root.style_class->style],
+                scale / 65536.0,
+                new_scale / 65536.0,
+                ( fitted - scaled ) * 100 / scaled ));
+
+              scale = new_scale;
+            }
+#ifdef FT_DEBUG_LEVEL_TRACE
+            else
+            {
+              FT_TRACE5((
+                "af_latin_metrics_scale_dim:"
+                " x height alignment (style `%s'):\n"
+                "                           "
+                " excessive vertical scaling abandoned\n"
+                "\n",
+                af_style_names[metrics->root.style_class->style] ));
+            }
+#endif
           }
         }
       }
@@ -1032,8 +1294,11 @@
 
     if ( dim == AF_DIMENSION_VERT )
     {
-      FT_TRACE5(( "blue zones (style `%s')\n",
-                  af_style_names[metrics->root.style_class->style] ));
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( axis->blue_count )
+        FT_TRACE5(( "blue zones (style `%s')\n",
+                    af_style_names[metrics->root.style_class->style] ));
+#endif
 
       /* scale the blue zones */
       for ( nn = 0; nn < axis->blue_count; nn++ )
@@ -1106,21 +1371,63 @@
 #endif
 
           blue->flags |= AF_LATIN_BLUE_ACTIVE;
-
-          FT_TRACE5(( "  reference %d: %d scaled to %.2f%s\n"
-                      "  overshoot %d: %d scaled to %.2f%s\n",
-                      nn,
-                      blue->ref.org,
-                      blue->ref.fit / 64.0,
-                      blue->flags & AF_LATIN_BLUE_ACTIVE ? ""
-                                                         : " (inactive)",
-                      nn,
-                      blue->shoot.org,
-                      blue->shoot.fit / 64.0,
-                      blue->flags & AF_LATIN_BLUE_ACTIVE ? ""
-                                                         : " (inactive)" ));
         }
       }
+
+      /* use sub-top blue zone only if it doesn't overlap with */
+      /* another (non-sup-top) blue zone; otherwise, the       */
+      /* effect would be similar to a neutral blue zone, which */
+      /* is not desired here                                   */
+      for ( nn = 0; nn < axis->blue_count; nn++ )
+      {
+        AF_LatinBlue  blue = &axis->blues[nn];
+        FT_UInt       i;
+
+
+        if ( !( blue->flags & AF_LATIN_BLUE_SUB_TOP ) )
+          continue;
+        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )
+          continue;
+
+        for ( i = 0; i < axis->blue_count; i++ )
+        {
+          AF_LatinBlue  b = &axis->blues[i];
+
+
+          if ( b->flags & AF_LATIN_BLUE_SUB_TOP )
+            continue;
+          if ( !( b->flags & AF_LATIN_BLUE_ACTIVE ) )
+            continue;
+
+          if ( b->ref.fit <= blue->shoot.fit &&
+               b->shoot.fit >= blue->ref.fit )
+          {
+            blue->flags &= ~AF_LATIN_BLUE_ACTIVE;
+            break;
+          }
+        }
+      }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      for ( nn = 0; nn < axis->blue_count; nn++ )
+      {
+        AF_LatinBlue  blue = &axis->blues[nn];
+
+
+        FT_TRACE5(( "  reference %d: %d scaled to %.2f%s\n"
+                    "  overshoot %d: %d scaled to %.2f%s\n",
+                    nn,
+                    blue->ref.org,
+                    blue->ref.fit / 64.0,
+                    blue->flags & AF_LATIN_BLUE_ACTIVE ? ""
+                                                       : " (inactive)",
+                    nn,
+                    blue->shoot.org,
+                    blue->shoot.fit / 64.0,
+                    blue->flags & AF_LATIN_BLUE_ACTIVE ? ""
+                                                       : " (inactive)" ));
+      }
+#endif
     }
   }
 
@@ -1140,6 +1447,22 @@
   }
 
 
+  /* Extract standard_width from writing system/script specific */
+  /* metrics class.                                             */
+
+  FT_LOCAL_DEF( void )
+  af_latin_get_standard_widths( AF_LatinMetrics  metrics,
+                                FT_Pos*          stdHW,
+                                FT_Pos*          stdVW )
+  {
+    if ( stdHW )
+      *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
+
+    if ( stdVW )
+      *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width;
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -1155,14 +1478,17 @@
   af_latin_hints_compute_segments( AF_GlyphHints  hints,
                                    AF_Dimension   dim )
   {
-    AF_AxisHints   axis          = &hints->axis[dim];
-    FT_Memory      memory        = hints->memory;
-    FT_Error       error         = FT_Err_Ok;
-    AF_Segment     segment       = NULL;
-    AF_SegmentRec  seg0;
-    AF_Point*      contour       = hints->contours;
-    AF_Point*      contour_limit = contour + hints->num_contours;
-    AF_Direction   major_dir, segment_dir;
+    AF_LatinMetrics  metrics       = (AF_LatinMetrics)hints->metrics;
+    AF_AxisHints     axis          = &hints->axis[dim];
+    FT_Memory        memory        = hints->memory;
+    FT_Error         error         = FT_Err_Ok;
+    AF_Segment       segment       = NULL;
+    AF_SegmentRec    seg0;
+    AF_Point*        contour       = hints->contours;
+    AF_Point*        contour_limit = contour + hints->num_contours;
+    AF_Direction     major_dir, segment_dir;
+
+    FT_Pos  flat_threshold = FLAT_THRESHOLD( metrics->units_per_em );
 
 
     FT_ZERO( &seg0 );
@@ -1203,16 +1529,35 @@
     /* do each contour separately */
     for ( ; contour < contour_limit; contour++ )
     {
-      AF_Point  point   =  contour[0];
-      AF_Point  last    =  point->prev;
-      int       on_edge =  0;
-      FT_Pos    min_pos =  32000;  /* minimum segment pos != min_coord */
-      FT_Pos    max_pos = -32000;  /* maximum segment pos != max_coord */
-      FT_Bool   passed;
+      AF_Point  point   = contour[0];
+      AF_Point  last    = point->prev;
+      int       on_edge = 0;
 
+      /* we call values measured along a segment (point->v)    */
+      /* `coordinates', and values orthogonal to it (point->u) */
+      /* `positions'                                           */
+      FT_Pos     min_pos      =  32000;
+      FT_Pos     max_pos      = -32000;
+      FT_Pos     min_coord    =  32000;
+      FT_Pos     max_coord    = -32000;
+      FT_UShort  min_flags    =  AF_FLAG_NONE;
+      FT_UShort  max_flags    =  AF_FLAG_NONE;
+      FT_Pos     min_on_coord =  32000;
+      FT_Pos     max_on_coord = -32000;
 
-      if ( point == last )  /* skip singletons -- just in case */
-        continue;
+      FT_Bool  passed;
+
+      AF_Segment  prev_segment = NULL;
+
+      FT_Pos     prev_min_pos      = min_pos;
+      FT_Pos     prev_max_pos      = max_pos;
+      FT_Pos     prev_min_coord    = min_coord;
+      FT_Pos     prev_max_coord    = max_coord;
+      FT_UShort  prev_min_flags    = min_flags;
+      FT_UShort  prev_max_flags    = max_flags;
+      FT_Pos     prev_min_on_coord = min_on_coord;
+      FT_Pos     prev_max_on_coord = max_on_coord;
+
 
       if ( FT_ABS( last->out_dir )  == major_dir &&
            FT_ABS( point->out_dir ) == major_dir )
@@ -1243,40 +1588,187 @@
 
         if ( on_edge )
         {
+          /* get minimum and maximum position */
           u = point->u;
           if ( u < min_pos )
             min_pos = u;
           if ( u > max_pos )
             max_pos = u;
 
+          /* get minimum and maximum coordinate together with flags */
+          v = point->v;
+          if ( v < min_coord )
+          {
+            min_coord = v;
+            min_flags = point->flags;
+          }
+          if ( v > max_coord )
+          {
+            max_coord = v;
+            max_flags = point->flags;
+          }
+
+          /* get minimum and maximum coordinate of `on' points */
+          if ( !( point->flags & AF_FLAG_CONTROL ) )
+          {
+            v = point->v;
+            if ( v < min_on_coord )
+              min_on_coord = v;
+            if ( v > max_on_coord )
+              max_on_coord = v;
+          }
+
           if ( point->out_dir != segment_dir || point == last )
           {
-            /* we are just leaving an edge; record a new segment! */
-            segment->last = point;
-            segment->pos  = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+            /* check whether the new segment's start point is identical to */
+            /* the previous segment's end point; for example, this might   */
+            /* happen for spikes                                           */
 
-            /* a segment is round if either its first or last point */
-            /* is a control point                                   */
-            if ( ( segment->first->flags | point->flags ) &
-                 AF_FLAG_CONTROL                          )
-              segment->flags |= AF_EDGE_ROUND;
+            if ( !prev_segment || segment->first != prev_segment->last )
+            {
+              /* points are different: we are just leaving an edge, thus */
+              /* record a new segment                                    */
 
-            /* compute segment size */
-            min_pos = max_pos = point->v;
+              segment->last  = point;
+              segment->pos   = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+              segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 );
 
-            v = segment->first->v;
-            if ( v < min_pos )
-              min_pos = v;
-            if ( v > max_pos )
-              max_pos = v;
+              /* a segment is round if either its first or last point */
+              /* is a control point, and the length of the on points  */
+              /* inbetween doesn't exceed a heuristic limit           */
+              if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL      &&
+                   ( max_on_coord - min_on_coord ) < flat_threshold )
+                segment->flags |= AF_EDGE_ROUND;
 
-            segment->min_coord = (FT_Short)min_pos;
-            segment->max_coord = (FT_Short)max_pos;
-            segment->height    = (FT_Short)( segment->max_coord -
-                                             segment->min_coord );
+              segment->min_coord = (FT_Short)min_coord;
+              segment->max_coord = (FT_Short)max_coord;
+              segment->height    = segment->max_coord - segment->min_coord;
+
+              prev_segment      = segment;
+              prev_min_pos      = min_pos;
+              prev_max_pos      = max_pos;
+              prev_min_coord    = min_coord;
+              prev_max_coord    = max_coord;
+              prev_min_flags    = min_flags;
+              prev_max_flags    = max_flags;
+              prev_min_on_coord = min_on_coord;
+              prev_max_on_coord = max_on_coord;
+            }
+            else
+            {
+              /* points are the same: we don't create a new segment but */
+              /* merge the current segment with the previous one        */
+
+              if ( prev_segment->last->in_dir == point->in_dir )
+              {
+                /* we have identical directions (this can happen for       */
+                /* degenerate outlines that move zig-zag along the main    */
+                /* axis without changing the coordinate value of the other */
+                /* axis, and where the segments have just been merged):    */
+                /* unify segments                                          */
+
+                /* update constraints */
+
+                if ( prev_min_pos < min_pos )
+                  min_pos = prev_min_pos;
+                if ( prev_max_pos > max_pos )
+                  max_pos = prev_max_pos;
+
+                if ( prev_min_coord < min_coord )
+                {
+                  min_coord = prev_min_coord;
+                  min_flags = prev_min_flags;
+                }
+                if ( prev_max_coord > max_coord )
+                {
+                  max_coord = prev_max_coord;
+                  max_flags = prev_max_flags;
+                }
+
+                if ( prev_min_on_coord < min_on_coord )
+                  min_on_coord = prev_min_on_coord;
+                if ( prev_max_on_coord > max_on_coord )
+                  max_on_coord = prev_max_on_coord;
+
+                prev_segment->last  = point;
+                prev_segment->pos   = (FT_Short)( ( min_pos +
+                                                    max_pos ) >> 1 );
+                prev_segment->delta = (FT_Short)( ( max_pos -
+                                                    min_pos ) >> 1 );
+
+                if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL      &&
+                     ( max_on_coord - min_on_coord ) < flat_threshold )
+                  prev_segment->flags |= AF_EDGE_ROUND;
+                else
+                  prev_segment->flags &= ~AF_EDGE_ROUND;
+
+                prev_segment->min_coord = (FT_Short)min_coord;
+                prev_segment->max_coord = (FT_Short)max_coord;
+                prev_segment->height    = prev_segment->max_coord -
+                                          prev_segment->min_coord;
+              }
+              else
+              {
+                /* we have different directions; use the properties of the */
+                /* longer segment and discard the other one                */
+
+                if ( FT_ABS( prev_max_coord - prev_min_coord ) >
+                     FT_ABS( max_coord - min_coord ) )
+                {
+                  /* discard current segment */
+
+                  if ( min_pos < prev_min_pos )
+                    prev_min_pos = min_pos;
+                  if ( max_pos > prev_max_pos )
+                    prev_max_pos = max_pos;
+
+                  prev_segment->last  = point;
+                  prev_segment->pos   = (FT_Short)( ( prev_min_pos +
+                                                      prev_max_pos ) >> 1 );
+                  prev_segment->delta = (FT_Short)( ( prev_max_pos -
+                                                      prev_min_pos ) >> 1 );
+                }
+                else
+                {
+                  /* discard previous segment */
+
+                  if ( prev_min_pos < min_pos )
+                    min_pos = prev_min_pos;
+                  if ( prev_max_pos > max_pos )
+                    max_pos = prev_max_pos;
+
+                  segment->last  = point;
+                  segment->pos   = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+                  segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 );
+
+                  if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL      &&
+                       ( max_on_coord - min_on_coord ) < flat_threshold )
+                    segment->flags |= AF_EDGE_ROUND;
+
+                  segment->min_coord = (FT_Short)min_coord;
+                  segment->max_coord = (FT_Short)max_coord;
+                  segment->height    = segment->max_coord -
+                                       segment->min_coord;
+
+                  *prev_segment = *segment;
+
+                  prev_min_pos      = min_pos;
+                  prev_max_pos      = max_pos;
+                  prev_min_coord    = min_coord;
+                  prev_max_coord    = max_coord;
+                  prev_min_flags    = min_flags;
+                  prev_max_flags    = max_flags;
+                  prev_min_on_coord = min_on_coord;
+                  prev_max_on_coord = max_on_coord;
+                }
+              }
+
+              axis->num_segments--;
+            }
 
             on_edge = 0;
             segment = NULL;
+
             /* fall through */
           }
         }
@@ -1289,7 +1781,12 @@
           passed = 1;
         }
 
-        if ( !on_edge && FT_ABS( point->out_dir ) == major_dir )
+        /* if we are not on an edge, check whether the major direction */
+        /* coincides with the current point's `out' direction, or      */
+        /* whether we have a single-point contour                      */
+        if ( !on_edge                                  &&
+             ( FT_ABS( point->out_dir ) == major_dir ||
+               point == point->prev                  ) )
         {
           /* this is the start of a new segment! */
           segment_dir = (AF_Direction)point->out_dir;
@@ -1301,12 +1798,46 @@
           /* clear all segment fields */
           segment[0] = seg0;
 
-          segment->dir      = (FT_Char)segment_dir;
-          min_pos = max_pos = point->u;
-          segment->first    = point;
-          segment->last     = point;
+          segment->dir   = (FT_Char)segment_dir;
+          segment->first = point;
+          segment->last  = point;
+
+          /* `af_axis_hints_new_segment' reallocates memory,    */
+          /* thus we have to refresh the `prev_segment' pointer */
+          if ( prev_segment )
+            prev_segment = segment - 1;
+
+          min_pos   = max_pos   = point->u;
+          min_coord = max_coord = point->v;
+          min_flags = max_flags = point->flags;
+
+          if ( point->flags & AF_FLAG_CONTROL )
+          {
+            min_on_coord =  32000;
+            max_on_coord = -32000;
+          }
+          else
+            min_on_coord = max_on_coord = point->v;
 
           on_edge = 1;
+
+          if ( point == point->prev )
+          {
+            /* we have a one-point segment: this is a one-point */
+            /* contour with `in' and `out' direction set to     */
+            /* AF_DIR_NONE                                      */
+            segment->pos = (FT_Short)min_pos;
+
+            if (point->flags & AF_FLAG_CONTROL)
+              segment->flags |= AF_EDGE_ROUND;
+
+            segment->min_coord = (FT_Short)point->v;
+            segment->max_coord = (FT_Short)point->v;
+            segment->height = 0;
+
+            on_edge = 0;
+            segment = NULL;
+          }
         }
 
         point = point->next;
@@ -1518,6 +2049,16 @@
     FT_Memory     memory = hints->memory;
     AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];
 
+#ifdef FT_CONFIG_OPTION_PIC
+    AF_FaceGlobals  globals = hints->metrics->globals;
+#endif
+
+    AF_StyleClass   style_class  = hints->metrics->style_class;
+    AF_ScriptClass  script_class = AF_SCRIPT_CLASSES_GET
+                                     [style_class->script];
+
+    FT_Bool  top_to_bottom_hinting = 0;
+
     AF_Segment    segments      = axis->segments;
     AF_Segment    segment_limit = segments + axis->num_segments;
     AF_Segment    seg;
@@ -1528,6 +2069,7 @@
     FT_Fixed      scale;
     FT_Pos        edge_distance_threshold;
     FT_Pos        segment_length_threshold;
+    FT_Pos        segment_width_threshold;
 
 
     axis->num_edges = 0;
@@ -1540,15 +2082,24 @@
                                           : AF_DIR_RIGHT;
 #endif
 
+    if ( dim == AF_DIMENSION_VERT )
+      top_to_bottom_hinting = script_class->top_to_bottom_hinting;
+
     /*
      *  We ignore all segments that are less than 1 pixel in length
      *  to avoid many problems with serif fonts.  We compute the
      *  corresponding threshold in font units.
      */
     if ( dim == AF_DIMENSION_HORZ )
-        segment_length_threshold = FT_DivFix( 64, hints->y_scale );
+      segment_length_threshold = FT_DivFix( 64, hints->y_scale );
     else
-        segment_length_threshold = 0;
+      segment_length_threshold = 0;
+
+    /*
+     *  Similarly, we ignore segments that have a width delta
+     *  larger than 0.5px (i.e., a width larger than 1px).
+     */
+    segment_width_threshold = FT_DivFix( 32, scale );
 
     /*********************************************************************/
     /*                                                                   */
@@ -1581,7 +2132,11 @@
       FT_Int   ee;
 
 
-      if ( seg->height < segment_length_threshold )
+      /* ignore too short segments, too wide ones, and, in this loop, */
+      /* one-point segments without a direction                       */
+      if ( seg->height < segment_length_threshold ||
+           seg->delta > segment_width_threshold   ||
+           seg->dir == AF_DIR_NONE                )
         continue;
 
       /* A special case for serif edges: If they are smaller than */
@@ -1617,6 +2172,7 @@
         /* sort according to the position    */
         error = af_axis_hints_new_edge( axis, seg->pos,
                                         (AF_Direction)seg->dir,
+                                        top_to_bottom_hinting,
                                         memory, &edge );
         if ( error )
           goto Exit;
@@ -1642,6 +2198,44 @@
       }
     }
 
+    /* we loop again over all segments to catch one-point segments   */
+    /* without a direction: if possible, link them to existing edges */
+    for ( seg = segments; seg < segment_limit; seg++ )
+    {
+      AF_Edge  found = NULL;
+      FT_Int   ee;
+
+
+      if ( seg->dir != AF_DIR_NONE )
+        continue;
+
+      /* look for an edge corresponding to the segment */
+      for ( ee = 0; ee < axis->num_edges; ee++ )
+      {
+        AF_Edge  edge = axis->edges + ee;
+        FT_Pos   dist;
+
+
+        dist = seg->pos - edge->fpos;
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < edge_distance_threshold )
+        {
+          found = edge;
+          break;
+        }
+      }
+
+      /* one-point segments without a match are ignored */
+      if ( found )
+      {
+        seg->edge_next         = found->first;
+        found->last->edge_next = seg;
+        found->last            = seg;
+      }
+    }
+
 
     /******************************************************************/
     /*                                                                */
@@ -1719,7 +2313,7 @@
                                 seg->serif->edge         &&
                                 seg->serif->edge != edge );
 
-          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )
+          if ( ( seg->link && seg->link->edge ) || is_serif )
           {
             AF_Edge     edge2;
             AF_Segment  seg2;
@@ -1872,7 +2466,8 @@
         /* the major direction) -- this assumes the TrueType convention  */
         /* for the orientation of contours                               */
         is_top_blue =
-          (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );
+          (FT_Byte)( ( blue->flags & ( AF_LATIN_BLUE_TOP     |
+                                       AF_LATIN_BLUE_SUB_TOP ) ) != 0 );
         is_neutral_blue =
           (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_NEUTRAL ) != 0);
         is_major_dir =
@@ -1985,23 +2580,23 @@
       other_flags |= AF_LATIN_HINTS_VERT_SNAP;
 
     /*
-     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     *  We adjust stems to full pixels unless in `light' or `lcd' mode.
      */
-    if ( mode != FT_RENDER_MODE_LIGHT )
+    if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD )
       other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
 
     if ( mode == FT_RENDER_MODE_MONO )
       other_flags |= AF_LATIN_HINTS_MONO;
 
     /*
-     *  In `light' hinting mode we disable horizontal hinting completely.
+     *  In `light' or `lcd' mode we disable horizontal hinting completely.
      *  We also do it if the face is italic.
      *
      *  However, if warping is enabled (which only works in `light' hinting
      *  mode), advance widths get adjusted, too.
      */
-    if ( mode == FT_RENDER_MODE_LIGHT                      ||
-         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )
+    if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD ||
+         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0          )
       scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
 
 #ifdef AF_CONFIG_OPTION_USE_WARPER
@@ -2081,6 +2676,7 @@
   af_latin_compute_stem_width( AF_GlyphHints  hints,
                                AF_Dimension   dim,
                                FT_Pos         width,
+                               FT_Pos         base_delta,
                                FT_UInt        base_flags,
                                FT_UInt        stem_flags )
   {
@@ -2158,7 +2754,39 @@
             dist += delta;
         }
         else
-          dist = ( dist + 32 ) & ~63;
+        {
+          /* A stem's end position depends on two values: the start        */
+          /* position and the stem length.  The former gets usually        */
+          /* rounded to the grid, while the latter gets rounded also if it */
+          /* exceeds a certain length (see below in this function).  This  */
+          /* `double rounding' can lead to a great difference to the       */
+          /* original, unhinted position; this normally doesn't matter for */
+          /* large PPEM values, but for small sizes it can easily make     */
+          /* outlines collide.  For this reason, we adjust the stem length */
+          /* by a small amount depending on the PPEM value in case the     */
+          /* former and latter rounding both point into the same           */
+          /* direction.                                                    */
+
+          FT_Pos  bdelta = 0;
+
+
+          if ( ( ( width > 0 ) && ( base_delta > 0 ) ) ||
+               ( ( width < 0 ) && ( base_delta < 0 ) ) )
+          {
+            FT_UInt  ppem = metrics->root.scaler.face->size->metrics.x_ppem;
+
+
+            if ( ppem < 10 )
+              bdelta = base_delta;
+            else if ( ppem < 30 )
+              bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20;
+
+            if ( bdelta < 0 )
+              bdelta = -bdelta;
+          }
+
+          dist = ( dist - bdelta + 32 ) & ~63;
+        }
       }
     }
     else
@@ -2247,11 +2875,17 @@
                               AF_Edge        base_edge,
                               AF_Edge        stem_edge )
   {
-    FT_Pos  dist = stem_edge->opos - base_edge->opos;
+    FT_Pos  dist, base_delta;
+    FT_Pos  fitted_width;
 
-    FT_Pos  fitted_width = af_latin_compute_stem_width( hints, dim, dist,
-                                                        base_edge->flags,
-                                                        stem_edge->flags );
+
+    dist       = stem_edge->opos - base_edge->opos;
+    base_delta = base_edge->pos - base_edge->opos;
+
+    fitted_width = af_latin_compute_stem_width( hints, dim,
+                                                dist, base_delta,
+                                                base_edge->flags,
+                                                stem_edge->flags );
 
 
     stem_edge->pos = base_edge->pos + fitted_width;
@@ -2302,8 +2936,18 @@
     AF_Edge       anchor     = NULL;
     FT_Int        has_serifs = 0;
 
+#ifdef FT_CONFIG_OPTION_PIC
+    AF_FaceGlobals  globals = hints->metrics->globals;
+#endif
+
+    AF_StyleClass   style_class  = hints->metrics->style_class;
+    AF_ScriptClass  script_class = AF_SCRIPT_CLASSES_GET
+                                     [style_class->script];
+
+    FT_Bool  top_to_bottom_hinting = 0;
+
 #ifdef FT_DEBUG_LEVEL_TRACE
-    FT_UInt       num_actions = 0;
+    FT_UInt  num_actions = 0;
 #endif
 
 
@@ -2311,6 +2955,9 @@
                 dim == AF_DIMENSION_VERT ? "horizontal" : "vertical",
                 af_style_names[hints->metrics->style_class->style] ));
 
+    if ( dim == AF_DIMENSION_VERT )
+      top_to_bottom_hinting = script_class->top_to_bottom_hinting;
+
     /* we begin by aligning all stems relative to the blue zone */
     /* if needed -- that's only for horizontal edges            */
 
@@ -2446,7 +3093,8 @@
 
 
         org_len = edge2->opos - edge->opos;
-        cur_len = af_latin_compute_stem_width( hints, dim, org_len,
+        cur_len = af_latin_compute_stem_width( hints, dim,
+                                               org_len, 0,
                                                edge->flags,
                                                edge2->flags );
 
@@ -2515,7 +3163,8 @@
         org_len    = edge2->opos - edge->opos;
         org_center = org_pos + ( org_len >> 1 );
 
-        cur_len = af_latin_compute_stem_width( hints, dim, org_len,
+        cur_len = af_latin_compute_stem_width( hints, dim,
+                                               org_len, 0,
                                                edge->flags,
                                                edge2->flags );
 
@@ -2575,7 +3224,8 @@
           org_len    = edge2->opos - edge->opos;
           org_center = org_pos + ( org_len >> 1 );
 
-          cur_len    = af_latin_compute_stem_width( hints, dim, org_len,
+          cur_len    = af_latin_compute_stem_width( hints, dim,
+                                                    org_len, 0,
                                                     edge->flags,
                                                     edge2->flags );
 
@@ -2606,16 +3256,25 @@
         edge->flags  |= AF_EDGE_DONE;
         edge2->flags |= AF_EDGE_DONE;
 
-        if ( edge > edges && edge->pos < edge[-1].pos )
+        if ( edge > edges                                             &&
+             ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos )
+                                     : ( edge->pos < edge[-1].pos ) ) )
         {
+          /* don't move if stem would (almost) disappear otherwise; */
+          /* the ad-hoc value 16 corresponds to 1/4px               */
+          if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
+          {
 #ifdef FT_DEBUG_LEVEL_TRACE
-          FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
-                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
+            FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
+                        edge - edges,
+                        edge->pos / 64.0,
+                        edge[-1].pos / 64.0 ));
 
-          num_actions++;
+            num_actions++;
 #endif
 
-          edge->pos = edge[-1].pos;
+            edge->pos = edge[-1].pos;
+          }
         }
       }
     }
@@ -2767,29 +3426,46 @@
 #endif
         edge->flags |= AF_EDGE_DONE;
 
-        if ( edge > edges && edge->pos < edge[-1].pos )
+        if ( edge > edges                                             &&
+             ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos )
+                                     : ( edge->pos < edge[-1].pos ) ) )
         {
+          /* don't move if stem would (almost) disappear otherwise; */
+          /* the ad-hoc value 16 corresponds to 1/4px               */
+          if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
+          {
 #ifdef FT_DEBUG_LEVEL_TRACE
-          FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
-                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
+            FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
+                        edge - edges,
+                        edge->pos / 64.0,
+                        edge[-1].pos / 64.0 ));
 
-          num_actions++;
+            num_actions++;
 #endif
-          edge->pos = edge[-1].pos;
+            edge->pos = edge[-1].pos;
+          }
         }
 
-        if ( edge + 1 < edge_limit        &&
-             edge[1].flags & AF_EDGE_DONE &&
-             edge->pos > edge[1].pos      )
+        if ( edge + 1 < edge_limit                                   &&
+             edge[1].flags & AF_EDGE_DONE                            &&
+             ( top_to_bottom_hinting ? ( edge->pos < edge[1].pos )
+                                     : ( edge->pos > edge[1].pos ) ) )
         {
+          /* don't move if stem would (almost) disappear otherwise; */
+          /* the ad-hoc value 16 corresponds to 1/4px               */
+          if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 )
+          {
 #ifdef FT_DEBUG_LEVEL_TRACE
-          FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
-                      edge - edges, edge->pos / 64.0, edge[1].pos / 64.0 ));
+            FT_TRACE5(( "  BOUND: edge %d (pos=%.2f) moved to %.2f\n",
+                        edge - edges,
+                        edge->pos / 64.0,
+                        edge[1].pos / 64.0 ));
 
-          num_actions++;
+            num_actions++;
 #endif
 
-          edge->pos = edge[1].pos;
+            edge->pos = edge[1].pos;
+          }
         }
       }
     }
@@ -2805,7 +3481,8 @@
   /* Apply the complete hinting algorithm to a latin glyph. */
 
   static FT_Error
-  af_latin_hints_apply( AF_GlyphHints    hints,
+  af_latin_hints_apply( FT_UInt          glyph_index,
+                        AF_GlyphHints    hints,
                         FT_Outline*      outline,
                         AF_LatinMetrics  metrics )
   {
@@ -2820,13 +3497,7 @@
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         AF_HINTS_DO_HORIZONTAL( hints )                              )
-#else
     if ( AF_HINTS_DO_HORIZONTAL( hints ) )
-#endif
     {
       axis  = &metrics->axis[AF_DIMENSION_HORZ];
       error = af_latin_hints_detect_features( hints,
@@ -2847,16 +3518,18 @@
       if ( error )
         goto Exit;
 
-      af_latin_hints_compute_blue_edges( hints, metrics );
+      /* apply blue zones to base characters only */
+      if ( !( metrics->root.globals->glyph_styles[glyph_index] & AF_NONBASE ) )
+        af_latin_hints_compute_blue_edges( hints, metrics );
     }
 
     /* grid-fit the outline */
     for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
     {
 #ifdef AF_CONFIG_OPTION_USE_WARPER
-      if ( dim == AF_DIMENSION_HORZ                                 &&
-           metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                )
+      if ( dim == AF_DIMENSION_HORZ                                  &&
+           metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+           AF_HINTS_DO_WARP( hints )                                 )
       {
         AF_WarperRec  warper;
         FT_Fixed      scale;
@@ -2904,12 +3577,13 @@
 
     sizeof ( AF_LatinMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init,
-    (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init,        /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale,       /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL,                         /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   af_latin_hints_init,
-    (AF_WritingSystem_ApplyHintsFunc)  af_latin_hints_apply
+    (AF_WritingSystem_InitHintsFunc)   af_latin_hints_init,          /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  af_latin_hints_apply          /* style_hints_apply     */
   )
 
 
diff --git a/src/autofit/aflatin.h b/src/autofit/aflatin.h
index 6855492..432cccc 100644
--- a/src/autofit/aflatin.h
+++ b/src/autofit/aflatin.h
@@ -5,7 +5,7 @@
 /*    Auto-fitter hinting routines for latin writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFLATIN_H__
-#define __AFLATIN_H__
+#ifndef AFLATIN_H_
+#define AFLATIN_H_
 
 #include "afhints.h"
 
@@ -53,6 +53,8 @@
 
 #define AF_LATIN_IS_TOP_BLUE( b ) \
           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP )
+#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \
+          ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP )
 #define AF_LATIN_IS_NEUTRAL_BLUE( b ) \
           ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL )
 #define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \
@@ -65,8 +67,10 @@
 
 #define AF_LATIN_BLUE_ACTIVE      ( 1U << 0 ) /* zone height is <= 3/4px   */
 #define AF_LATIN_BLUE_TOP         ( 1U << 1 ) /* we have a top blue zone   */
-#define AF_LATIN_BLUE_NEUTRAL     ( 1U << 2 ) /* we have neutral blue zone */
-#define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 3 ) /* used for scale adjustment */
+#define AF_LATIN_BLUE_SUB_TOP     ( 1U << 2 ) /* we have a subscript top   */
+                                              /* blue zone                 */
+#define AF_LATIN_BLUE_NEUTRAL     ( 1U << 3 ) /* we have neutral blue zone */
+#define AF_LATIN_BLUE_ADJUSTMENT  ( 1U << 4 ) /* used for scale adjustment */
                                               /* optimization              */
 
 
@@ -74,6 +78,8 @@
   {
     AF_WidthRec  ref;
     AF_WidthRec  shoot;
+    FT_Pos       ascender;
+    FT_Pos       descender;
     FT_UInt      flags;
 
   } AF_LatinBlueRec, *AF_LatinBlue;
@@ -182,7 +188,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFLATIN_H__ */
+#endif /* AFLATIN_H_ */
 
 
 /* END */
diff --git a/src/autofit/aflatin2.c b/src/autofit/aflatin2.c
index ac9f933..5c71378 100644
--- a/src/autofit/aflatin2.c
+++ b/src/autofit/aflatin2.c
@@ -1,10 +1,15 @@
+/* ATTENTION: This file doesn't compile.  It is only here as a reference */
+/*            of an alternative latin hinting algorithm that was always  */
+/*            marked as experimental.                                    */
+
+
 /***************************************************************************/
 /*                                                                         */
 /*  aflatin2.c                                                             */
 /*                                                                         */
 /*    Auto-fitter hinting routines for latin writing system (body).        */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,6 +23,9 @@
 
 #include FT_ADVANCES_H
 
+
+#ifdef FT_OPTION_AUTOFIT2
+
 #include "afglobal.h"
 #include "aflatin.h"
 #include "aflatin2.h"
@@ -693,6 +701,22 @@
   }
 
 
+  /* Extract standard_width from writing system/script specific */
+  /* metrics class.                                             */
+
+  FT_LOCAL_DEF( void )
+  af_latin2_get_standard_widths( AF_LatinMetrics  metrics,
+                                 FT_Pos*          stdHW,
+                                 FT_Pos*          stdVW )
+  {
+    if ( stdHW )
+      *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width;
+
+    if ( stdVW )
+      *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width;
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -1179,7 +1203,7 @@
 
         /* insert a new edge in the list and */
         /* sort according to the position    */
-        error = af_axis_hints_new_edge( axis, seg->pos, seg->dir,
+        error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, 0,
                                         memory, &edge );
         if ( error )
           goto Exit;
@@ -1282,7 +1306,7 @@
                                 seg->serif->edge         &&
                                 seg->serif->edge != edge );
 
-          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )
+          if ( ( seg->link && seg->link->edge ) || is_serif )
           {
             AF_Edge     edge2;
             AF_Segment  seg2;
@@ -1534,20 +1558,20 @@
       other_flags |= AF_LATIN_HINTS_VERT_SNAP;
 
     /*
-     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     *  We adjust stems to full pixels unless in `light' or `lcd' mode.
      */
-    if ( mode != FT_RENDER_MODE_LIGHT )
+    if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD )
       other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
 
     if ( mode == FT_RENDER_MODE_MONO )
       other_flags |= AF_LATIN_HINTS_MONO;
 
     /*
-     *  In `light' hinting mode we disable horizontal hinting completely.
+     *  In `light' or `lcd' mode we disable horizontal hinting completely.
      *  We also do it if the face is italic.
      */
-    if ( mode == FT_RENDER_MODE_LIGHT                      ||
-         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )
+    if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD ||
+         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0          )
       scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
 
 #ifdef AF_CONFIG_OPTION_USE_WARPER
@@ -2300,26 +2324,23 @@
 
 
   static FT_Error
-  af_latin2_hints_apply( AF_GlyphHints    hints,
+  af_latin2_hints_apply( FT_UInt          glyph_index,
+                         AF_GlyphHints    hints,
                          FT_Outline*      outline,
                          AF_LatinMetrics  metrics )
   {
     FT_Error  error;
     int       dim;
 
+    FT_UNUSED( glyph_index );
+
 
     error = af_glyph_hints_reload( hints, outline );
     if ( error )
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         AF_HINTS_DO_HORIZONTAL( hints )                              )
-#else
     if ( AF_HINTS_DO_HORIZONTAL( hints ) )
-#endif
     {
       error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ );
       if ( error )
@@ -2339,9 +2360,9 @@
     for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
     {
 #ifdef AF_CONFIG_OPTION_USE_WARPER
-      if ( dim == AF_DIMENSION_HORZ                                 &&
-           metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                )
+      if ( dim == AF_DIMENSION_HORZ                                  &&
+           metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+           AF_HINTS_DO_WARP( hints )                                 )
       {
         AF_WarperRec  warper;
         FT_Fixed      scale;
@@ -2386,13 +2407,21 @@
 
     sizeof ( AF_LatinMetricsRec ),
 
-    (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init,
-    (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale,
-    (AF_WritingSystem_DoneMetricsFunc) NULL,
+    (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init,        /* style_metrics_init    */
+    (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale,       /* style_metrics_scale   */
+    (AF_WritingSystem_DoneMetricsFunc) NULL,                          /* style_metrics_done    */
+    (AF_WritingSystem_GetStdWidthsFunc)af_latin2_get_standard_widths, /* style_metrics_getstdw */
 
-    (AF_WritingSystem_InitHintsFunc)   af_latin2_hints_init,
-    (AF_WritingSystem_ApplyHintsFunc)  af_latin2_hints_apply
+    (AF_WritingSystem_InitHintsFunc)   af_latin2_hints_init,          /* style_hints_init      */
+    (AF_WritingSystem_ApplyHintsFunc)  af_latin2_hints_apply          /* style_hints_apply     */
   )
 
+#else /* !FT_OPTION_AUTOFIT2 */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _af_latin2_dummy;
+
+#endif /* !FT_OPTION_AUTOFIT2 */
+
 
 /* END */
diff --git a/src/autofit/aflatin2.h b/src/autofit/aflatin2.h
index 9326753..0129dc7 100644
--- a/src/autofit/aflatin2.h
+++ b/src/autofit/aflatin2.h
@@ -1,3 +1,8 @@
+/* ATTENTION: This file doesn't compile.  It is only here as a reference */
+/*            of an alternative latin hinting algorithm that was always  */
+/*            marked as experimental.                                    */
+
+
 /***************************************************************************/
 /*                                                                         */
 /*  aflatin2.h                                                             */
@@ -5,7 +10,7 @@
 /*    Auto-fitter hinting routines for latin writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +22,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFLATIN2_H__
-#define __AFLATIN2_H__
+#ifndef AFLATIN2_H_
+#define AFLATIN2_H_
 
 #include "afhints.h"
 
@@ -35,7 +40,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFLATIN_H__ */
+#endif /* AFLATIN_H_ */
 
 
 /* END */
diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c
index 7c2fa7c..a55550b 100644
--- a/src/autofit/afloader.c
+++ b/src/autofit/afloader.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter glyph loading routines (body).                           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,6 +23,8 @@
 #include "afmodule.h"
 #include "afpic.h"
 
+#include FT_INTERNAL_CALC_H
+
 
   /* Initialize glyph loader. */
 
@@ -49,7 +51,7 @@
     loader->face    = face;
     loader->globals = (AF_FaceGlobals)face->autohint.data;
 
-    if ( loader->globals == NULL )
+    if ( !loader->globals )
     {
       error = af_face_globals_new( face, &loader->globals, module );
       if ( !error )
@@ -76,41 +78,324 @@
   }
 
 
-  /* Do the main work of `af_loader_load_glyph'.  Note that we never   */
-  /* have to deal with composite glyphs as those get loaded into       */
-  /* FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. */
-  /* In the rare cases where FT_LOAD_NO_RECURSE is set, it implies     */
-  /* FT_LOAD_NO_SCALE and as such the auto-hinter is never called.     */
+#define af_intToFixed( i ) \
+          ( (FT_Fixed)( (FT_UInt32)(i) << 16 ) )
+#define af_fixedToInt( x ) \
+          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+#define af_floatToFixed( f ) \
+          ( (FT_Fixed)( (f) * 65536.0 + 0.5 ) )
+
 
   static FT_Error
-  af_loader_load_g( AF_Loader  loader,
-                    AF_Scaler  scaler,
-                    FT_UInt    glyph_index,
-                    FT_Int32   load_flags )
+  af_loader_embolden_glyph_in_slot( AF_Loader        loader,
+                                    FT_Face          face,
+                                    AF_StyleMetrics  style_metrics )
   {
-    FT_Error          error;
-    FT_Face           face     = loader->face;
-    AF_StyleMetrics   metrics  = loader->metrics;
-    AF_GlyphHints     hints    = loader->hints;
-    FT_GlyphSlot      slot     = face->glyph;
-    FT_Slot_Internal  internal = slot->internal;
-    FT_GlyphLoader    gloader  = internal->loader;
-    FT_Int32          flags;
+    FT_Error  error = FT_Err_Ok;
+
+    FT_GlyphSlot           slot    = face->glyph;
+    AF_FaceGlobals         globals = loader->globals;
+    AF_WritingSystemClass  writing_system_class;
+
+    FT_Size_Metrics*  size_metrics = &face->size->internal->autohint_metrics;
+
+    FT_Pos  stdVW = 0;
+    FT_Pos  stdHW = 0;
+
+    FT_Bool  size_changed = size_metrics->x_ppem !=
+                              globals->stem_darkening_for_ppem;
+
+    FT_Fixed  em_size  = af_intToFixed( face->units_per_EM );
+    FT_Fixed  em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size );
+
+    FT_Matrix  scale_down_matrix = { 0x10000L, 0, 0, 0x10000L };
 
 
-    flags = load_flags | FT_LOAD_LINEAR_DESIGN;
-    error = FT_Load_Glyph( face, glyph_index, flags );
+    /* Skip stem darkening for broken fonts. */
+    if ( !face->units_per_EM )
+    {
+      error = FT_ERR( Corrupted_Font_Header );
+      goto Exit;
+    }
+
+    /*
+     *  We depend on the writing system (script analyzers) to supply
+     *  standard widths for the script of the glyph we are looking at.  If
+     *  it can't deliver, stem darkening is disabled.
+     */
+    writing_system_class =
+      AF_WRITING_SYSTEM_CLASSES_GET[style_metrics->style_class->writing_system];
+
+    if ( writing_system_class->style_metrics_getstdw )
+      writing_system_class->style_metrics_getstdw( style_metrics,
+                                                   &stdHW,
+                                                   &stdVW );
+    else
+    {
+      error = FT_ERR( Unimplemented_Feature );
+      goto Exit;
+    }
+
+    if ( size_changed                                               ||
+         ( stdVW > 0 && stdVW != globals->standard_vertical_width ) )
+    {
+      FT_Fixed  darken_by_font_units_x, darken_x;
+
+
+      darken_by_font_units_x =
+        af_intToFixed( af_loader_compute_darkening( loader,
+                                                    face,
+                                                    stdVW ) );
+      darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x,
+                                       size_metrics->x_scale ),
+                            em_ratio );
+
+      globals->standard_vertical_width = stdVW;
+      globals->stem_darkening_for_ppem = size_metrics->x_ppem;
+      globals->darken_x                = af_fixedToInt( darken_x );
+    }
+
+    if ( size_changed                                                 ||
+         ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) )
+    {
+      FT_Fixed  darken_by_font_units_y, darken_y;
+
+
+      darken_by_font_units_y =
+        af_intToFixed( af_loader_compute_darkening( loader,
+                                                    face,
+                                                    stdHW ) );
+      darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y,
+                                       size_metrics->y_scale ),
+                            em_ratio );
+
+      globals->standard_horizontal_width = stdHW;
+      globals->stem_darkening_for_ppem   = size_metrics->x_ppem;
+      globals->darken_y                  = af_fixedToInt( darken_y );
+
+      /*
+       *  Scale outlines down on the Y-axis to keep them inside their blue
+       *  zones.  The stronger the emboldening, the stronger the downscaling
+       *  (plus heuristical padding to prevent outlines still falling out
+       *  their zones due to rounding).
+       *
+       *  Reason: `FT_Outline_Embolden' works by shifting the rightmost
+       *  points of stems farther to the right, and topmost points farther
+       *  up.  This positions points on the Y-axis outside their
+       *  pre-computed blue zones and leads to distortion when applying the
+       *  hints in the code further below.  Code outside this emboldening
+       *  block doesn't know we are presenting it with modified outlines the
+       *  analyzer didn't see!
+       *
+       *  An unfortunate side effect of downscaling is that the emboldening
+       *  effect is slightly decreased.  The loss becomes more pronounced
+       *  versus the CFF driver at smaller sizes, e.g., at 9ppem and below.
+       */
+      globals->scale_down_factor =
+        FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ),
+                   em_size );
+    }
+
+    FT_Outline_EmboldenXY( &slot->outline,
+                           globals->darken_x,
+                           globals->darken_y );
+
+    scale_down_matrix.yy = globals->scale_down_factor;
+    FT_Outline_Transform( &slot->outline, &scale_down_matrix );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Load the glyph at index into the current slot of a face and hint it. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_loader_load_glyph( AF_Loader  loader,
+                        AF_Module  module,
+                        FT_Face    face,
+                        FT_UInt    glyph_index,
+                        FT_Int32   load_flags )
+  {
+    FT_Error  error;
+
+    FT_Size           size          = face->size;
+    FT_Size_Internal  size_internal = size->internal;
+    FT_GlyphSlot      slot          = face->glyph;
+    FT_Slot_Internal  slot_internal = slot->internal;
+    FT_GlyphLoader    gloader       = slot_internal->loader;
+
+    AF_GlyphHints          hints         = loader->hints;
+    AF_ScalerRec           scaler;
+    AF_StyleMetrics        style_metrics;
+    FT_UInt                style_options = AF_STYLE_NONE_DFLT;
+    AF_StyleClass          style_class;
+    AF_WritingSystemClass  writing_system_class;
+
+#ifdef FT_CONFIG_OPTION_PIC
+    AF_FaceGlobals  globals = loader->globals;
+#endif
+
+
+    if ( !size )
+      return FT_THROW( Invalid_Size_Handle );
+
+    FT_ZERO( &scaler );
+
+    if ( !size_internal->autohint_metrics.x_scale                          ||
+         size_internal->autohint_mode != FT_LOAD_TARGET_MODE( load_flags ) )
+    {
+      /* switching between hinting modes usually means different scaling */
+      /* values; this later on enforces recomputation of everything      */
+      /* related to the current size                                     */
+
+      size_internal->autohint_mode    = FT_LOAD_TARGET_MODE( load_flags );
+      size_internal->autohint_metrics = size->metrics;
+
+#ifdef AF_CONFIG_OPTION_TT_SIZE_METRICS
+      {
+        FT_Size_Metrics*  size_metrics = &size_internal->autohint_metrics;
+
+
+        /* set metrics to integer values and adjust scaling accordingly; */
+        /* this is the same setup as with TrueType fonts, cf. function   */
+        /* `tt_size_reset' in file `ttobjs.c'                            */
+        size_metrics->ascender  = FT_PIX_ROUND(
+                                    FT_MulFix( face->ascender,
+                                               size_metrics->y_scale ) );
+        size_metrics->descender = FT_PIX_ROUND(
+                                    FT_MulFix( face->descender,
+                                               size_metrics->y_scale ) );
+        size_metrics->height    = FT_PIX_ROUND(
+                                    FT_MulFix( face->height,
+                                               size_metrics->y_scale ) );
+
+        size_metrics->x_scale     = FT_DivFix( size_metrics->x_ppem << 6,
+                                               face->units_per_EM );
+        size_metrics->y_scale     = FT_DivFix( size_metrics->y_ppem << 6,
+                                               face->units_per_EM );
+        size_metrics->max_advance = FT_PIX_ROUND(
+                                      FT_MulFix( face->max_advance_width,
+                                                 size_metrics->x_scale ) );
+      }
+#endif /* AF_CONFIG_OPTION_TT_SIZE_METRICS */
+    }
+
+    /*
+     *  TODO: This code currently doesn't support fractional advance widths,
+     *  i.e., placing hinted glyphs at anything other than integer
+     *  x-positions.  This is only relevant for the warper code, which
+     *  scales and shifts glyphs to optimize blackness of stems (hinting on
+     *  the x-axis by nature places things on pixel integers, hinting on the
+     *  y-axis only, i.e., LIGHT mode, doesn't touch the x-axis).  The delta
+     *  values of the scaler would need to be adjusted.
+     */
+    scaler.face    = face;
+    scaler.x_scale = size_internal->autohint_metrics.x_scale;
+    scaler.x_delta = 0;
+    scaler.y_scale = size_internal->autohint_metrics.y_scale;
+    scaler.y_delta = 0;
+
+    scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );
+    scaler.flags       = 0;
+
+    /* note that the fallback style can't be changed anymore */
+    /* after the first call of `af_loader_load_glyph'        */
+    error = af_loader_reset( loader, module, face );
     if ( error )
       goto Exit;
 
-    loader->transformed = internal->glyph_transformed;
+#ifdef FT_OPTION_AUTOFIT2
+    /* XXX: undocumented hook to activate the latin2 writing system. */
+    if ( load_flags & ( 1UL << 20 ) )
+      style_options = AF_STYLE_LTN2_DFLT;
+#endif
+
+    /*
+     *  Glyphs (really code points) are assigned to scripts.  Script
+     *  analysis is done lazily: For each glyph that passes through here,
+     *  the corresponding script analyzer is called, but returns immediately
+     *  if it has been run already.
+     */
+    error = af_face_globals_get_metrics( loader->globals, glyph_index,
+                                         style_options, &style_metrics );
+    if ( error )
+      goto Exit;
+
+    style_class          = style_metrics->style_class;
+    writing_system_class =
+      AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system];
+
+    loader->metrics = style_metrics;
+
+    if ( writing_system_class->style_metrics_scale )
+      writing_system_class->style_metrics_scale( style_metrics, &scaler );
+    else
+      style_metrics->scaler = scaler;
+
+    if ( writing_system_class->style_hints_init )
+    {
+      error = writing_system_class->style_hints_init( hints,
+                                                      style_metrics );
+      if ( error )
+        goto Exit;
+    }
+
+    /*
+     *  Do the main work of `af_loader_load_glyph'.  Note that we never have
+     *  to deal with composite glyphs as those get loaded into
+     *  FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function.
+     *  In the rare cases where FT_LOAD_NO_RECURSE is set, it implies
+     *  FT_LOAD_NO_SCALE and as such the auto-hinter is never called.
+     */
+    load_flags |=  FT_LOAD_NO_SCALE         |
+                   FT_LOAD_IGNORE_TRANSFORM |
+                   FT_LOAD_LINEAR_DESIGN;
+    load_flags &= ~FT_LOAD_RENDER;
+
+    error = FT_Load_Glyph( face, glyph_index, load_flags );
+    if ( error )
+      goto Exit;
+
+    /*
+     *  Apply stem darkening (emboldening) here before hints are applied to
+     *  the outline.  Glyphs are scaled down proportionally to the
+     *  emboldening so that curve points don't fall outside their
+     *  precomputed blue zones.
+     *
+     *  Any emboldening done by the font driver (e.g., the CFF driver)
+     *  doesn't reach here because the autohinter loads the unprocessed
+     *  glyphs in font units for analysis (functions `af_*_metrics_init_*')
+     *  and then above to prepare it for the rasterizers by itself,
+     *  independently of the font driver.  So emboldening must be done here,
+     *  within the autohinter.
+     *
+     *  All glyphs to be autohinted pass through here one by one.  The
+     *  standard widths can therefore change from one glyph to the next,
+     *  depending on what script a glyph is assigned to (each script has its
+     *  own set of standard widths and other metrics).  The darkening amount
+     *  must therefore be recomputed for each size and
+     *  `standard_{vertical,horizontal}_width' change.
+     *
+     *  Ignore errors and carry on without emboldening.
+     *
+     */
+
+    /* stem darkening only works well in `light' mode */
+    if ( scaler.render_mode == FT_RENDER_MODE_LIGHT    &&
+         ( !face->internal->no_stem_darkening        ||
+           ( face->internal->no_stem_darkening < 0 &&
+             !module->no_stem_darkening            ) ) )
+      af_loader_embolden_glyph_in_slot( loader, face, style_metrics );
+
+    loader->transformed = slot_internal->glyph_transformed;
     if ( loader->transformed )
     {
       FT_Matrix  inverse;
 
 
-      loader->trans_matrix = internal->glyph_matrix;
-      loader->trans_delta  = internal->glyph_delta;
+      loader->trans_matrix = slot_internal->glyph_matrix;
+      loader->trans_delta  = slot_internal->glyph_delta;
 
       inverse = loader->trans_matrix;
       if ( !FT_Matrix_Invert( &inverse ) )
@@ -126,8 +411,8 @@
                               loader->trans_delta.x,
                               loader->trans_delta.y );
 
-      /* compute original horizontal phantom points (and ignore */
-      /* vertical ones)                                         */
+      /* compute original horizontal phantom points */
+      /* (and ignore vertical ones)                 */
       loader->pp1.x = hints->x_delta;
       loader->pp1.y = hints->y_delta;
       loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance,
@@ -138,29 +423,21 @@
       if ( slot->outline.n_points == 0 )
         goto Hint_Metrics;
 
-      /* now load the slot image into the auto-outline and run the */
-      /* automatic hinting process                                 */
-      {
-#ifdef FT_CONFIG_OPTION_PIC
-        AF_FaceGlobals         globals = loader->globals;
-#endif
-        AF_StyleClass          style_class = metrics->style_class;
-        AF_WritingSystemClass  writing_system_class =
-          AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system];
-
-
-        if ( writing_system_class->style_hints_apply )
-          writing_system_class->style_hints_apply( hints,
-                                                   &gloader->base.outline,
-                                                   metrics );
-      }
+      /* now load the slot image into the auto-outline */
+      /* and run the automatic hinting process         */
+      if ( writing_system_class->style_hints_apply )
+        writing_system_class->style_hints_apply( glyph_index,
+                                                 hints,
+                                                 &gloader->base.outline,
+                                                 style_metrics );
 
       /* we now need to adjust the metrics according to the change in */
       /* width/positioning that occurred during the hinting process   */
-      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT )
+      if ( scaler.render_mode != FT_RENDER_MODE_LIGHT )
       {
-        FT_Pos        old_rsb, old_lsb, new_lsb;
-        FT_Pos        pp1x_uh, pp2x_uh;
+        FT_Pos  old_rsb, old_lsb, new_lsb;
+        FT_Pos  pp1x_uh, pp2x_uh;
+
         AF_AxisHints  axis  = &hints->axis[AF_DIMENSION_HORZ];
         AF_Edge       edge1 = axis->edges;         /* leftmost edge  */
         AF_Edge       edge2 = edge1 +
@@ -170,12 +447,12 @@
         if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) )
         {
           old_rsb = loader->pp2.x - edge2->opos;
-          old_lsb = edge1->opos;
+          /* loader->pp1.x is always zero at this point of time */
+          old_lsb = edge1->opos /* - loader->pp1.x */;
           new_lsb = edge1->pos;
 
           /* remember unhinted values to later account */
           /* for rounding errors                       */
-
           pp1x_uh = new_lsb    - old_lsb;
           pp2x_uh = edge2->pos + old_rsb;
 
@@ -206,21 +483,23 @@
           FT_Pos  pp2x = loader->pp2.x;
 
 
-          loader->pp1.x = FT_PIX_ROUND( pp1x );
-          loader->pp2.x = FT_PIX_ROUND( pp2x );
+          loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta );
+          loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta );
 
           slot->lsb_delta = loader->pp1.x - pp1x;
           slot->rsb_delta = loader->pp2.x - pp2x;
         }
       }
+      /* `light' mode uses integer advance widths */
+      /* but sets `lsb_delta' and `rsb_delta'     */
       else
       {
         FT_Pos  pp1x = loader->pp1.x;
         FT_Pos  pp2x = loader->pp2.x;
 
 
-        loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta );
-        loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta );
+        loader->pp1.x = FT_PIX_ROUND( pp1x );
+        loader->pp2.x = FT_PIX_ROUND( pp2x );
 
         slot->lsb_delta = loader->pp1.x - pp1x;
         slot->rsb_delta = loader->pp2.x - pp2x;
@@ -241,8 +520,8 @@
 
       vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX;
       vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY;
-      vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale );
-      vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale );
+      vvector.x = FT_MulFix( vvector.x, style_metrics->scaler.x_scale );
+      vvector.y = FT_MulFix( vvector.y, style_metrics->scaler.y_scale );
 
       /* transform the hinted outline if needed */
       if ( loader->transformed )
@@ -250,12 +529,12 @@
         FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix );
         FT_Vector_Transform( &vvector, &loader->trans_matrix );
       }
-#if 1
+
       /* we must translate our final outline by -pp1.x and compute */
       /* the new metrics                                           */
       if ( loader->pp1.x )
         FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 );
-#endif
+
       FT_Outline_Get_CBox( &gloader->base.outline, &bbox );
 
       bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
@@ -274,20 +553,14 @@
       /* for mono-width fonts (like Andale, Courier, etc.) we need */
       /* to keep the original rounded advance width; ditto for     */
       /* digits if all have the same advance width                 */
-#if 0
-      if ( !FT_IS_FIXED_WIDTH( slot->face ) )
-        slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
-      else
-        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,
-                                               x_scale );
-#else
-      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT                      &&
+      if ( scaler.render_mode != FT_RENDER_MODE_LIGHT                       &&
            ( FT_IS_FIXED_WIDTH( slot->face )                              ||
              ( af_face_globals_is_digit( loader->globals, glyph_index ) &&
-               metrics->digits_have_same_width                          ) ) )
+               style_metrics->digits_have_same_width                    ) ) )
       {
-        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,
-                                               metrics->scaler.x_scale );
+        slot->metrics.horiAdvance =
+          FT_MulFix( slot->metrics.horiAdvance,
+                     style_metrics->scaler.x_scale );
 
         /* Set delta values to 0.  Otherwise code that uses them is */
         /* going to ruin the fixed advance width.                   */
@@ -300,23 +573,13 @@
         if ( slot->metrics.horiAdvance )
           slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
       }
-#endif
 
       slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance,
-                                             metrics->scaler.y_scale );
+                                             style_metrics->scaler.y_scale );
 
       slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance );
       slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance );
 
-#if 0
-      /* reassign all outline fields except flags to protect them */
-      slot->outline.n_contours = internal->loader->base.outline.n_contours;
-      slot->outline.n_points   = internal->loader->base.outline.n_points;
-      slot->outline.points     = internal->loader->base.outline.points;
-      slot->outline.tags       = internal->loader->base.outline.tags;
-      slot->outline.contours   = internal->loader->base.outline.contours;
-#endif
-
       slot->format  = FT_GLYPH_FORMAT_OUTLINE;
     }
 
@@ -325,82 +588,133 @@
   }
 
 
-  /* Load a glyph. */
-
-  FT_LOCAL_DEF( FT_Error )
-  af_loader_load_glyph( AF_Loader  loader,
-                        AF_Module  module,
-                        FT_Face    face,
-                        FT_UInt    gindex,
-                        FT_Int32   load_flags )
+  /*
+   * Compute amount of font units the face should be emboldened by, in
+   * analogy to the CFF driver's `cf2_computeDarkening' function.  See there
+   * for details of the algorithm.
+   *
+   * XXX: Currently a crude adaption of the original algorithm.  Do better?
+   */
+  FT_LOCAL_DEF( FT_Int32 )
+  af_loader_compute_darkening( AF_Loader  loader,
+                               FT_Face    face,
+                               FT_Pos     standard_width )
   {
-    FT_Error      error;
-    FT_Size       size   = face->size;
-    AF_ScalerRec  scaler;
+    AF_Module  module = loader->globals->module;
+
+    FT_UShort  units_per_EM;
+    FT_Fixed   ppem, em_ratio;
+    FT_Fixed   stem_width, stem_width_per_1000, scaled_stem, darken_amount;
+    FT_Int     log_base_2;
+    FT_Int     x1, y1, x2, y2, x3, y3, x4, y4;
 
 
-    if ( !size )
-      return FT_THROW( Invalid_Size_Handle );
+    ppem         = FT_MAX( af_intToFixed( 4 ),
+                           af_intToFixed( face->size->metrics.x_ppem ) );
+    units_per_EM = face->units_per_EM;
 
-    FT_ZERO( &scaler );
-
-    scaler.face    = face;
-    scaler.x_scale = size->metrics.x_scale;
-    scaler.x_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */
-    scaler.y_scale = size->metrics.y_scale;
-    scaler.y_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */
-
-    scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );
-    scaler.flags       = 0;  /* XXX: fix this */
-
-    error = af_loader_reset( loader, module, face );
-    if ( !error )
+    em_ratio = FT_DivFix( af_intToFixed( 1000 ),
+                          af_intToFixed ( units_per_EM ) );
+    if ( em_ratio < af_floatToFixed( .01 ) )
     {
-      AF_StyleMetrics  metrics;
-      FT_UInt          options = AF_STYLE_NONE_DFLT;
+      /* If something goes wrong, don't embolden. */
+      return 0;
+    }
+
+    x1 = module->darken_params[0];
+    y1 = module->darken_params[1];
+    x2 = module->darken_params[2];
+    y2 = module->darken_params[3];
+    x3 = module->darken_params[4];
+    y3 = module->darken_params[5];
+    x4 = module->darken_params[6];
+    y4 = module->darken_params[7];
+
+    if ( standard_width <= 0 )
+    {
+      stem_width          = af_intToFixed( 75 ); /* taken from cf2font.c */
+      stem_width_per_1000 = stem_width;
+    }
+    else
+    {
+      stem_width          = af_intToFixed( standard_width );
+      stem_width_per_1000 = FT_MulFix( stem_width, em_ratio );
+    }
+
+    log_base_2 = FT_MSB( (FT_UInt32)stem_width_per_1000 ) +
+                 FT_MSB( (FT_UInt32)ppem );
+
+    if ( log_base_2 >= 46 )
+    {
+      /* possible overflow */
+      scaled_stem = af_intToFixed( x4 );
+    }
+    else
+      scaled_stem = FT_MulFix( stem_width_per_1000, ppem );
+
+    /* now apply the darkening parameters */
+    if ( scaled_stem < af_intToFixed( x1 ) )
+      darken_amount = FT_DivFix( af_intToFixed( y1 ), ppem );
+
+    else if ( scaled_stem < af_intToFixed( x2 ) )
+    {
+      FT_Int  xdelta = x2 - x1;
+      FT_Int  ydelta = y2 - y1;
+      FT_Int  x      = stem_width_per_1000 -
+                       FT_DivFix( af_intToFixed( x1 ), ppem );
 
 
-#ifdef FT_OPTION_AUTOFIT2
-      /* XXX: undocumented hook to activate the latin2 writing system */
-      if ( load_flags & ( 1UL << 20 ) )
-        options = AF_STYLE_LTN2_DFLT;
-#endif
+      if ( !xdelta )
+        goto Try_x3;
 
-      error = af_face_globals_get_metrics( loader->globals, gindex,
-                                           options, &metrics );
-      if ( !error )
+      darken_amount = FT_MulDiv( x, ydelta, xdelta ) +
+                      FT_DivFix( af_intToFixed( y1 ), ppem );
+    }
+
+    else if ( scaled_stem < af_intToFixed( x3 ) )
+    {
+    Try_x3:
       {
-#ifdef FT_CONFIG_OPTION_PIC
-        AF_FaceGlobals         globals = loader->globals;
-#endif
-        AF_StyleClass          style_class = metrics->style_class;
-        AF_WritingSystemClass  writing_system_class =
-          AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system];
+        FT_Int  xdelta = x3 - x2;
+        FT_Int  ydelta = y3 - y2;
+        FT_Int  x      = stem_width_per_1000 -
+                         FT_DivFix( af_intToFixed( x2 ), ppem );
 
 
-        loader->metrics = metrics;
+        if ( !xdelta )
+          goto Try_x4;
 
-        if ( writing_system_class->style_metrics_scale )
-          writing_system_class->style_metrics_scale( metrics, &scaler );
-        else
-          metrics->scaler = scaler;
-
-        load_flags |=  FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
-        load_flags &= ~FT_LOAD_RENDER;
-
-        if ( writing_system_class->style_hints_init )
-        {
-          error = writing_system_class->style_hints_init( loader->hints,
-                                                          metrics );
-          if ( error )
-            goto Exit;
-        }
-
-        error = af_loader_load_g( loader, &scaler, gindex, load_flags );
+        darken_amount = FT_MulDiv( x, ydelta, xdelta ) +
+                        FT_DivFix( af_intToFixed( y2 ), ppem );
       }
     }
-  Exit:
-    return error;
+
+    else if ( scaled_stem < af_intToFixed( x4 ) )
+    {
+    Try_x4:
+      {
+        FT_Int  xdelta = x4 - x3;
+        FT_Int  ydelta = y4 - y3;
+        FT_Int  x      = stem_width_per_1000 -
+                         FT_DivFix( af_intToFixed( x3 ), ppem );
+
+
+        if ( !xdelta )
+          goto Use_y4;
+
+        darken_amount = FT_MulDiv( x, ydelta, xdelta ) +
+                        FT_DivFix( af_intToFixed( y3 ), ppem );
+      }
+    }
+
+    else
+    {
+    Use_y4:
+      darken_amount = FT_DivFix( af_intToFixed( y4 ), ppem );
+    }
+
+    /* Convert darken_amount from per 1000 em to true character space. */
+    return af_fixedToInt( FT_DivFix( darken_amount, em_ratio ) );
   }
 
 
diff --git a/src/autofit/afloader.h b/src/autofit/afloader.h
index 37cfd14..d4d72d1 100644
--- a/src/autofit/afloader.h
+++ b/src/autofit/afloader.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter glyph loading routines (specification).                  */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFLOADER_H__
-#define __AFLOADER_H__
+#ifndef AFLOADER_H_
+#define AFLOADER_H_
 
 #include "afhints.h"
 #include "afmodule.h"
@@ -75,12 +75,17 @@
                         FT_UInt    gindex,
                         FT_Int32   load_flags );
 
+  FT_LOCAL_DEF( FT_Int32 )
+  af_loader_compute_darkening( AF_Loader  loader,
+                               FT_Face    face,
+                               FT_Pos     standard_width );
+
 /* */
 
 
 FT_END_HEADER
 
-#endif /* __AFLOADER_H__ */
+#endif /* AFLOADER_H_ */
 
 
 /* END */
diff --git a/src/autofit/afmodule.c b/src/autofit/afmodule.c
index 8ae425c..dcaa17a 100644
--- a/src/autofit/afmodule.c
+++ b/src/autofit/afmodule.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module implementation (body).                            */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,6 +25,10 @@
 #ifdef FT_DEBUG_AUTOFIT
 
 #ifndef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
   extern void
   af_glyph_hints_dump_segments( AF_GlyphHints  hints,
                                 FT_Bool        to_stdout );
@@ -34,6 +38,10 @@
   extern void
   af_glyph_hints_dump_edges( AF_GlyphHints  hints,
                              FT_Bool        to_stdout );
+#ifdef __cplusplus
+  }
+#endif
+
 #endif
 
   int  _af_debug_disable_horz_hints;
@@ -48,7 +56,7 @@
 
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_DEBUG_H
-#include FT_AUTOHINTER_H
+#include FT_DRIVER_H
 #include FT_SERVICE_PROPERTIES_H
 
 
@@ -96,21 +104,45 @@
   }
 
 
+#ifdef FT_CONFIG_OPTION_PIC
+
+#undef  AF_SCRIPT_CLASSES_GET
+#define AF_SCRIPT_CLASSES_GET  \
+          ( GET_PIC( ft_module->library )->af_script_classes )
+
+#undef  AF_STYLE_CLASSES_GET
+#define AF_STYLE_CLASSES_GET  \
+          ( GET_PIC( ft_module->library )->af_style_classes )
+
+#endif
+
+
   static FT_Error
   af_property_set( FT_Module    ft_module,
                    const char*  property_name,
-                   const void*  value )
+                   const void*  value,
+                   FT_Bool      value_is_string )
   {
     FT_Error   error  = FT_Err_Ok;
     AF_Module  module = (AF_Module)ft_module;
 
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
 
     if ( !ft_strcmp( property_name, "fallback-script" ) )
     {
-      FT_UInt*  fallback_script = (FT_UInt*)value;
+      FT_UInt*  fallback_script;
+      FT_UInt   ss;
 
-      FT_UInt  ss;
 
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+        return FT_THROW( Invalid_Argument );
+#endif
+
+      fallback_script = (FT_UInt*)value;
 
       /* We translate the fallback script to a fallback style that uses */
       /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its  */
@@ -139,19 +171,33 @@
     }
     else if ( !ft_strcmp( property_name, "default-script" ) )
     {
-      FT_UInt*  default_script = (FT_UInt*)value;
+      FT_UInt*  default_script;
 
 
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+        return FT_THROW( Invalid_Argument );
+#endif
+
+      default_script = (FT_UInt*)value;
+
       module->default_script = *default_script;
 
       return error;
     }
     else if ( !ft_strcmp( property_name, "increase-x-height" ) )
     {
-      FT_Prop_IncreaseXHeight*  prop = (FT_Prop_IncreaseXHeight*)value;
+      FT_Prop_IncreaseXHeight*  prop;
       AF_FaceGlobals            globals;
 
 
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+        return FT_THROW( Invalid_Argument );
+#endif
+
+      prop = (FT_Prop_IncreaseXHeight*)value;
+
       error = af_property_get_face_globals( prop->face, &globals, module );
       if ( !error )
         globals->increase_x_height = prop->limit;
@@ -161,14 +207,119 @@
 #ifdef AF_CONFIG_OPTION_USE_WARPER
     else if ( !ft_strcmp( property_name, "warping" ) )
     {
-      FT_Bool*  warping = (FT_Bool*)value;
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        long         w = ft_strtol( s, NULL, 10 );
 
 
-      module->warping = *warping;
+        if ( w == 0 )
+          module->warping = 0;
+        else if ( w == 1 )
+          module->warping = 1;
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif
+      {
+        FT_Bool*  warping = (FT_Bool*)value;
+
+
+        module->warping = *warping;
+      }
 
       return error;
     }
 #endif /* AF_CONFIG_OPTION_USE_WARPER */
+    else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params;
+      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      FT_Int   dp[8];
+
+
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        char*        ep;
+        int          i;
+
+
+        /* eight comma-separated numbers */
+        for ( i = 0; i < 7; i++ )
+        {
+          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
+          if ( *ep != ',' || s == ep )
+            return FT_THROW( Invalid_Argument );
+
+          s = ep + 1;
+        }
+
+        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
+        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
+          return FT_THROW( Invalid_Argument );
+
+        darken_params = dp;
+      }
+      else
+#endif
+        darken_params = (FT_Int*)value;
+
+      x1 = darken_params[0];
+      y1 = darken_params[1];
+      x2 = darken_params[2];
+      y2 = darken_params[3];
+      x3 = darken_params[4];
+      y3 = darken_params[5];
+      x4 = darken_params[6];
+      y4 = darken_params[7];
+
+      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
+           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
+           x1 > x2  || x2 > x3  || x3 > x4              ||
+           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
+        return FT_THROW( Invalid_Argument );
+
+      module->darken_params[0] = x1;
+      module->darken_params[1] = y1;
+      module->darken_params[2] = x2;
+      module->darken_params[3] = y2;
+      module->darken_params[4] = x3;
+      module->darken_params[5] = y3;
+      module->darken_params[6] = x4;
+      module->darken_params[7] = y4;
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         nsd = ft_strtol( s, NULL, 10 );
+
+
+        if ( !nsd )
+          module->no_stem_darkening = FALSE;
+        else
+          module->no_stem_darkening = TRUE;
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+        module->no_stem_darkening = *no_stem_darkening;
+      }
+
+      return error;
+    }
 
     FT_TRACE0(( "af_property_set: missing property `%s'\n",
                 property_name ));
@@ -245,6 +396,33 @@
       return error;
     }
 #endif /* AF_CONFIG_OPTION_USE_WARPER */
+    else if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params = module->darken_params;
+      FT_Int*  val           = (FT_Int*)value;
+
+
+      val[0] = darken_params[0];
+      val[1] = darken_params[1];
+      val[2] = darken_params[2];
+      val[3] = darken_params[3];
+      val[4] = darken_params[4];
+      val[5] = darken_params[5];
+      val[6] = darken_params[6];
+      val[7] = darken_params[7];
+
+      return error;
+    }
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool   no_stem_darkening = module->no_stem_darkening;
+      FT_Bool*  val               = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
 
     FT_TRACE0(( "af_property_get: missing property `%s'\n",
                 property_name ));
@@ -254,12 +432,14 @@
 
   FT_DEFINE_SERVICE_PROPERTIESREC(
     af_service_properties,
-    (FT_Properties_SetFunc)af_property_set,
-    (FT_Properties_GetFunc)af_property_get )
+
+    (FT_Properties_SetFunc)af_property_set,        /* set_property */
+    (FT_Properties_GetFunc)af_property_get )       /* get_property */
 
 
   FT_DEFINE_SERVICEDESCREC1(
     af_services,
+
     FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET )
 
 
@@ -291,11 +471,21 @@
     AF_Module  module = (AF_Module)ft_module;
 
 
-    module->fallback_style = AF_STYLE_FALLBACK;
-    module->default_script = AF_SCRIPT_DEFAULT;
+    module->fallback_style    = AF_STYLE_FALLBACK;
+    module->default_script    = AF_SCRIPT_DEFAULT;
 #ifdef AF_CONFIG_OPTION_USE_WARPER
-    module->warping        = 0;
+    module->warping           = 0;
 #endif
+    module->no_stem_darkening = TRUE;
+
+    module->darken_params[0]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
+    module->darken_params[1]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
+    module->darken_params[2]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
+    module->darken_params[3]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
+    module->darken_params[4]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
+    module->darken_params[5]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
+    module->darken_params[6]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
+    module->darken_params[7]  = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
 
     return FT_Err_Ok;
   }
@@ -342,9 +532,16 @@
     error = af_loader_load_glyph( loader, module, slot->face,
                                   glyph_index, load_flags );
 
-    af_glyph_hints_dump_points( hints, 0 );
-    af_glyph_hints_dump_segments( hints, 0 );
-    af_glyph_hints_dump_edges( hints, 0 );
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( ft_trace_levels[FT_COMPONENT] )
+    {
+#endif
+      af_glyph_hints_dump_points( hints, 0 );
+      af_glyph_hints_dump_segments( hints, 0 );
+      af_glyph_hints_dump_edges( hints, 0 );
+#ifdef FT_DEBUG_LEVEL_TRACE
+    }
+#endif
 
     af_loader_done( loader );
 
@@ -375,6 +572,7 @@
 
   FT_DEFINE_AUTOHINTER_INTERFACE(
     af_autofitter_interface,
+
     NULL,                                                    /* reset_face */
     NULL,                                              /* get_global_hints */
     NULL,                                             /* done_global_hints */
@@ -393,9 +591,10 @@
 
     (const void*)&AF_INTERFACE_GET,
 
-    (FT_Module_Constructor)af_autofitter_init,
-    (FT_Module_Destructor) af_autofitter_done,
-    (FT_Module_Requester)  af_get_interface )
+    (FT_Module_Constructor)af_autofitter_init,  /* module_init   */
+    (FT_Module_Destructor) af_autofitter_done,  /* module_done   */
+    (FT_Module_Requester)  af_get_interface     /* get_interface */
+  )
 
 
 /* END */
diff --git a/src/autofit/afmodule.h b/src/autofit/afmodule.h
index b9c2fd8..56f64ea 100644
--- a/src/autofit/afmodule.h
+++ b/src/autofit/afmodule.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module implementation (specification).                   */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFMODULE_H__
-#define __AFMODULE_H__
+#ifndef AFMODULE_H_
+#define AFMODULE_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
@@ -41,6 +41,8 @@
 #ifdef AF_CONFIG_OPTION_USE_WARPER
     FT_Bool       warping;
 #endif
+    FT_Bool       no_stem_darkening;
+    FT_Int        darken_params[8];
 
   } AF_ModuleRec, *AF_Module;
 
@@ -50,7 +52,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFMODULE_H__ */
+#endif /* AFMODULE_H_ */
 
 
 /* END */
diff --git a/src/autofit/afpic.c b/src/autofit/afpic.c
index 5589e61..d48d016 100644
--- a/src/autofit/afpic.c
+++ b/src/autofit/afpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for autofit module.  */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -122,7 +122,7 @@
 #include "afwrtsys.h"
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 )          \
+#define SCRIPT( s, S, d, h, H, sss )                 \
         FT_Init_Class_af_ ## s ## _script_class(     \
           &container->af_script_classes_rec[ss++] );
 
diff --git a/src/autofit/afpic.h b/src/autofit/afpic.h
index 25071e3..0c73456 100644
--- a/src/autofit/afpic.h
+++ b/src/autofit/afpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for autofit module.  */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,12 +16,10 @@
 /***************************************************************************/
 
 
-#ifndef __AFPIC_H__
-#define __AFPIC_H__
+#ifndef AFPIC_H_
+#define AFPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
 
@@ -43,6 +41,8 @@
 #include "aftypes.h"
 
 
+FT_BEGIN_HEADER
+
   typedef struct  AFModulePIC_
   {
     FT_ServiceDescRec*          af_services;
@@ -69,7 +69,7 @@
 
 
 #define GET_PIC( lib )  \
-          ( (AFModulePIC*)((lib)->pic_container.autofit) )
+          ( (AFModulePIC*)( (lib)->pic_container.autofit ) )
 
 #define AF_SERVICES_GET  \
           ( GET_PIC( library )->af_services )
@@ -93,13 +93,13 @@
   FT_Error
   autofit_module_class_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
-FT_END_HEADER
-
-#endif /* __AFPIC_H__ */
+#endif /* AFPIC_H_ */
 
 
 /* END */
diff --git a/src/autofit/afranges.c b/src/autofit/afranges.c
index c1e0afb..cf67faf 100644
--- a/src/autofit/afranges.c
+++ b/src/autofit/afranges.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter Unicode script ranges (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,175 +18,963 @@
 
 #include "afranges.h"
 
+  /*
+   * The algorithm for assigning properties and styles to the `glyph_styles'
+   * array is as follows (cf. the implementation in
+   * `af_face_globals_compute_style_coverage').
+   *
+   *   Walk over all scripts (as listed in `afscript.h').
+   *
+   *   For a given script, walk over all styles (as listed in `afstyles.h').
+   *   The order of styles is important and should be as follows.
+   *
+   *   - First come styles based on OpenType features (small caps, for
+   *     example).  Since features rely on glyph indices, thus completely
+   *     bypassing character codes, no properties are assigned.
+   *
+   *   - Next comes the default style, using the character ranges as defined
+   *     below.  This also assigns properties.
+   *
+   *   Note that there also exist fallback scripts, mainly covering
+   *   superscript and subscript glyphs of a script that are not present as
+   *   OpenType features.  Fallback scripts are defined below, also
+   *   assigning properties; they are applied after the corresponding
+   *   script.
+   *
+   */
+
+
+  /* XXX Check base character ranges again:                        */
+  /*     Right now, they are quickly derived by visual inspection. */
+  /*     I can imagine that fine-tuning is necessary.              */
+
+  /* for the auto-hinter, a `non-base character' is something that should */
+  /* not be affected by blue zones, regardless of whether this is a       */
+  /* spacing or no-spacing glyph                                          */
+
+  /* the `af_xxxx_nonbase_uniranges' ranges must be strict subsets */
+  /* of the corresponding `af_xxxx_uniranges' ranges               */
+
+
+  const AF_Script_UniRangeRec  af_adlm_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x1E900, 0x1E95F ),   /* Adlam */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_adlm_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x1D944, 0x1E94A ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
 
   const AF_Script_UniRangeRec  af_arab_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0600UL,  0x06FFUL ),  /* Arabic                                 */
-    AF_UNIRANGE_REC(  0x0750UL,  0x07FFUL ),  /* Arabic Supplement                      */
-    AF_UNIRANGE_REC(  0x08A0UL,  0x08FFUL ),  /* Arabic Extended-A                      */
-    AF_UNIRANGE_REC(  0xFB50UL,  0xFDFFUL ),  /* Arabic Presentation Forms-A            */
-    AF_UNIRANGE_REC(  0xFE70UL,  0xFEFFUL ),  /* Arabic Presentation Forms-B            */
-    AF_UNIRANGE_REC( 0x1EE00UL, 0x1EEFFUL ),  /* Arabic Mathematical Alphabetic Symbols */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0600,  0x06FF ),  /* Arabic                                 */
+    AF_UNIRANGE_REC(  0x0750,  0x07FF ),  /* Arabic Supplement                      */
+    AF_UNIRANGE_REC(  0x08A0,  0x08FF ),  /* Arabic Extended-A                      */
+    AF_UNIRANGE_REC(  0xFB50,  0xFDFF ),  /* Arabic Presentation Forms-A            */
+    AF_UNIRANGE_REC(  0xFE70,  0xFEFF ),  /* Arabic Presentation Forms-B            */
+    AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ),  /* Arabic Mathematical Alphabetic Symbols */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_cyrl_uniranges[] =
+  const AF_Script_UniRangeRec  af_arab_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0400UL,  0x04FFUL ),  /* Cyrillic            */
-    AF_UNIRANGE_REC(  0x0500UL,  0x052FUL ),  /* Cyrillic Supplement */
-    AF_UNIRANGE_REC(  0x2DE0UL,  0x2DFFUL ),  /* Cyrillic Extended-A */
-    AF_UNIRANGE_REC(  0xA640UL,  0xA69FUL ),  /* Cyrillic Extended-B */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0600,  0x0605 ),
+    AF_UNIRANGE_REC(  0x0610,  0x061A ),
+    AF_UNIRANGE_REC(  0x064B,  0x065F ),
+    AF_UNIRANGE_REC(  0x0670,  0x0670 ),
+    AF_UNIRANGE_REC(  0x06D6,  0x06DC ),
+    AF_UNIRANGE_REC(  0x06DF,  0x06E4 ),
+    AF_UNIRANGE_REC(  0x06E7,  0x06E8 ),
+    AF_UNIRANGE_REC(  0x06EA,  0x06ED ),
+    AF_UNIRANGE_REC(  0x08D4,  0x08E1 ),
+    AF_UNIRANGE_REC(  0x08D3,  0x08FF ),
+    AF_UNIRANGE_REC(  0xFBB2,  0xFBC1 ),
+    AF_UNIRANGE_REC(  0xFE70,  0xFE70 ),
+    AF_UNIRANGE_REC(  0xFE72,  0xFE72 ),
+    AF_UNIRANGE_REC(  0xFE74,  0xFE74 ),
+    AF_UNIRANGE_REC(  0xFE76,  0xFE76 ),
+    AF_UNIRANGE_REC(  0xFE78,  0xFE78 ),
+    AF_UNIRANGE_REC(  0xFE7A,  0xFE7A ),
+    AF_UNIRANGE_REC(  0xFE7C,  0xFE7C ),
+    AF_UNIRANGE_REC(  0xFE7E,  0xFE7E ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  /* there are some characters in the Devanagari Unicode block that are    */
-  /* generic to Indic scripts; we omit them so that their presence doesn't */
-  /* trigger Devanagari                                                    */
 
-  const AF_Script_UniRangeRec  af_deva_uniranges[] =
+  const AF_Script_UniRangeRec  af_armn_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0900UL,  0x093BUL ),  /* Devanagari       */
-    /* omitting U+093C nukta */
-    AF_UNIRANGE_REC(  0x093DUL,  0x0950UL ),
-    /* omitting U+0951 udatta, U+0952 anudatta */
-    AF_UNIRANGE_REC(  0x0953UL,  0x0963UL ),
-    /* omitting U+0964 danda, U+0965 double danda */
-    AF_UNIRANGE_REC(  0x0966UL,  0x097FUL ),
-    AF_UNIRANGE_REC(  0x20B9UL,  0x20B9UL ),  /* (new) Rupee sign */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0530,  0x058F ),  /* Armenian                          */
+    AF_UNIRANGE_REC(  0xFB13,  0xFB17 ),  /* Alphab. Present. Forms (Armenian) */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_grek_uniranges[] =
+  const AF_Script_UniRangeRec  af_armn_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0370UL,  0x03FFUL ),  /* Greek and Coptic */
-    AF_UNIRANGE_REC(  0x1F00UL,  0x1FFFUL ),  /* Greek Extended   */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0559,  0x055F ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_hebr_uniranges[] =
+
+  const AF_Script_UniRangeRec  af_avst_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0590UL,  0x05FFUL ),  /* Hebrew                          */
-    AF_UNIRANGE_REC(  0xFB1DUL,  0xFB4FUL ),  /* Alphab. Present. Forms (Hebrew) */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC( 0x10B00,  0x10B3F ),  /* Avestan */
+    AF_UNIRANGE_REC(       0,        0 )
   };
 
-  const AF_Script_UniRangeRec  af_latn_uniranges[] =
+  const AF_Script_UniRangeRec  af_avst_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0020UL,  0x007FUL ),  /* Basic Latin (no control chars)         */
-    AF_UNIRANGE_REC(  0x00A0UL,  0x00FFUL ),  /* Latin-1 Supplement (no control chars)  */
-    AF_UNIRANGE_REC(  0x0100UL,  0x017FUL ),  /* Latin Extended-A                       */
-    AF_UNIRANGE_REC(  0x0180UL,  0x024FUL ),  /* Latin Extended-B                       */
-    AF_UNIRANGE_REC(  0x0250UL,  0x02AFUL ),  /* IPA Extensions                         */
-    AF_UNIRANGE_REC(  0x02B0UL,  0x02FFUL ),  /* Spacing Modifier Letters               */
-    AF_UNIRANGE_REC(  0x0300UL,  0x036FUL ),  /* Combining Diacritical Marks            */
-    AF_UNIRANGE_REC(  0x1D00UL,  0x1D7FUL ),  /* Phonetic Extensions                    */
-    AF_UNIRANGE_REC(  0x1D80UL,  0x1DBFUL ),  /* Phonetic Extensions Supplement         */
-    AF_UNIRANGE_REC(  0x1DC0UL,  0x1DFFUL ),  /* Combining Diacritical Marks Supplement */
-    AF_UNIRANGE_REC(  0x1E00UL,  0x1EFFUL ),  /* Latin Extended Additional              */
-    AF_UNIRANGE_REC(  0x2000UL,  0x206FUL ),  /* General Punctuation                    */
-    AF_UNIRANGE_REC(  0x2070UL,  0x209FUL ),  /* Superscripts and Subscripts            */
-    AF_UNIRANGE_REC(  0x20A0UL,  0x20B8UL ),  /* Currency Symbols ...                   */
-    AF_UNIRANGE_REC(  0x20BAUL,  0x20CFUL ),  /* ... except new Rupee sign              */
-    AF_UNIRANGE_REC(  0x2150UL,  0x218FUL ),  /* Number Forms                           */
-    AF_UNIRANGE_REC(  0x2460UL,  0x24FFUL ),  /* Enclosed Alphanumerics                 */
-    AF_UNIRANGE_REC(  0x2C60UL,  0x2C7FUL ),  /* Latin Extended-C                       */
-    AF_UNIRANGE_REC(  0x2E00UL,  0x2E7FUL ),  /* Supplemental Punctuation               */
-    AF_UNIRANGE_REC(  0xA720UL,  0xA7FFUL ),  /* Latin Extended-D                       */
-    AF_UNIRANGE_REC(  0xFB00UL,  0xFB06UL ),  /* Alphab. Present. Forms (Latin Ligs)    */
-    AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ),  /* Mathematical Alphanumeric Symbols      */
-    AF_UNIRANGE_REC( 0x1F100UL, 0x1F1FFUL ),  /* Enclosed Alphanumeric Supplement       */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC( 0x10B39,  0x10B3F ),
+    AF_UNIRANGE_REC(       0,        0 )
   };
 
-  const AF_Script_UniRangeRec  af_none_uniranges[] =
+
+  const AF_Script_UniRangeRec  af_bamu_uniranges[] =
   {
-    AF_UNIRANGE_REC( 0UL, 0UL )
+    AF_UNIRANGE_REC( 0xA6A0,   0xA6FF ),   /* Bamum */
+#if 0
+    /* The characters in the Bamum supplement are pictograms, */
+    /* not (directly) related to the syllabic Bamum script    */
+    AF_UNIRANGE_REC( 0x16800, 0x16A3F ),   /* Bamum Supplement */
+#endif
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_telu_uniranges[] =
+  const AF_Script_UniRangeRec  af_bamu_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0C00UL,  0x0C7FUL ),  /* Telugu */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0xA6F0,  0xA6F1 ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_thai_uniranges[] =
-  {
-    AF_UNIRANGE_REC(  0x0E00UL,  0x0E7FUL ),  /* Thai */
-    AF_UNIRANGE_REC(       0UL,       0UL )
-  };
-
-#ifdef AF_CONFIG_OPTION_INDIC
 
   const AF_Script_UniRangeRec  af_beng_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0980UL,  0x09FFUL ),  /* Bengali */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0980,  0x09FF ),  /* Bengali */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+  const AF_Script_UniRangeRec  af_beng_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0981,  0x0981 ),
+    AF_UNIRANGE_REC(  0x09BC,  0x09BC ),
+    AF_UNIRANGE_REC(  0x09C1,  0x09C4 ),
+    AF_UNIRANGE_REC(  0x09CD,  0x09CD ),
+    AF_UNIRANGE_REC(  0x09E2,  0x09E3 ),
+    AF_UNIRANGE_REC(  0x09FE,  0x09FE ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_buhd_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1740,  0x175F ),   /* Buhid */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_buhd_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1752,  0x1753 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cakm_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x11100, 0x1114F ),   /* Chakma */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cakm_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x11100, 0x11102 ),
+    AF_UNIRANGE_REC( 0x11127, 0x11134 ),
+    AF_UNIRANGE_REC( 0x11146, 0x11146 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cans_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1400,  0x167F ), /* Unified Canadian Aboriginal Syllabics          */
+    AF_UNIRANGE_REC(  0x18B0,  0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cans_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cari_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x102A0, 0x102DF ),   /* Carian */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cari_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cher_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x13A0,  0x13FF ),  /* Cherokee            */
+    AF_UNIRANGE_REC(  0xAB70,  0xABBF ),  /* Cherokee Supplement */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cher_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_copt_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x2C80,  0x2CFF ),   /* Coptic */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_copt_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x2CEF,  0x2CF1 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cprt_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10800, 0x1083F ),   /* Cypriot */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cprt_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_cyrl_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0400,  0x04FF ),  /* Cyrillic            */
+    AF_UNIRANGE_REC(  0x0500,  0x052F ),  /* Cyrillic Supplement */
+    AF_UNIRANGE_REC(  0x2DE0,  0x2DFF ),  /* Cyrillic Extended-A */
+    AF_UNIRANGE_REC(  0xA640,  0xA69F ),  /* Cyrillic Extended-B */
+    AF_UNIRANGE_REC(  0x1C80,  0x1C8F ),  /* Cyrillic Extended-C */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_cyrl_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0483,  0x0489 ),
+    AF_UNIRANGE_REC(  0x2DE0,  0x2DFF ),
+    AF_UNIRANGE_REC(  0xA66F,  0xA67F ),
+    AF_UNIRANGE_REC(  0xA69E,  0xA69F ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  /* There are some characters in the Devanagari Unicode block that are    */
+  /* generic to Indic scripts; we omit them so that their presence doesn't */
+  /* trigger Devanagari.                                                   */
+
+  const AF_Script_UniRangeRec  af_deva_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0900,  0x093B ),  /* Devanagari          */
+    /* omitting U+093C nukta */
+    AF_UNIRANGE_REC(  0x093D,  0x0950 ),  /* ... continued       */
+    /* omitting U+0951 udatta, U+0952 anudatta */
+    AF_UNIRANGE_REC(  0x0953,  0x0963 ),  /* ... continued       */
+    /* omitting U+0964 danda, U+0965 double danda */
+    AF_UNIRANGE_REC(  0x0966,  0x097F ),  /* ... continued       */
+    AF_UNIRANGE_REC(  0x20B9,  0x20B9 ),  /* (new) Rupee sign    */
+    AF_UNIRANGE_REC(  0xA8E0,  0xA8FF ),  /* Devanagari Extended */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_deva_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0900,  0x0902 ),
+    AF_UNIRANGE_REC(  0x093A,  0x093A ),
+    AF_UNIRANGE_REC(  0x0941,  0x0948 ),
+    AF_UNIRANGE_REC(  0x094D,  0x094D ),
+    AF_UNIRANGE_REC(  0x0953,  0x0957 ),
+    AF_UNIRANGE_REC(  0x0962,  0x0963 ),
+    AF_UNIRANGE_REC(  0xA8E0,  0xA8F1 ),
+    AF_UNIRANGE_REC(  0xA8FF,  0xA8FF ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_dsrt_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10400, 0x1044F ),  /* Deseret */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_dsrt_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_ethi_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1200,  0x137F ),  /* Ethiopic            */
+    AF_UNIRANGE_REC(  0x1380,  0x139F ),  /* Ethiopic Supplement */
+    AF_UNIRANGE_REC(  0x2D80,  0x2DDF ),  /* Ethiopic Extended   */
+    AF_UNIRANGE_REC(  0xAB00,  0xAB2F ),  /* Ethiopic Extended-A */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_ethi_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x135D,  0x135F ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_geor_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x10D0,  0x10FF ),  /* Georgian (Mkhedruli)          */
+    AF_UNIRANGE_REC(  0x1C90,  0x1CBF ),  /* Georgian Extended (Mtavruli)  */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_geor_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_geok_uniranges[] =
+  {
+    /* Khutsuri */
+    AF_UNIRANGE_REC(  0x10A0,  0x10CD ),  /* Georgian (Asomtavruli)         */
+    AF_UNIRANGE_REC(  0x2D00,  0x2D2D ),  /* Georgian Supplement (Nuskhuri) */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_geok_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_glag_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x2C00,  0x2C5F ),  /* Glagolitic */
+    AF_UNIRANGE_REC( 0x1E000, 0x1E02F ),  /* Glagolitic Supplement */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_glag_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x1E000, 0x1E02F ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_goth_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10330, 0x1034F ),   /* Gothic */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_goth_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_grek_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0370,  0x03FF ),  /* Greek and Coptic */
+    AF_UNIRANGE_REC(  0x1F00,  0x1FFF ),  /* Greek Extended   */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_grek_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x037A,  0x037A ),
+    AF_UNIRANGE_REC(  0x0384,  0x0385 ),
+    AF_UNIRANGE_REC(  0x1FBD,  0x1FC1 ),
+    AF_UNIRANGE_REC(  0x1FCD,  0x1FCF ),
+    AF_UNIRANGE_REC(  0x1FDD,  0x1FDF ),
+    AF_UNIRANGE_REC(  0x1FED,  0x1FEF ),
+    AF_UNIRANGE_REC(  0x1FFD,  0x1FFE ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_gujr_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0A80UL,  0x0AFFUL ),  /* Gujarati */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0A80,  0x0AFF ),  /* Gujarati */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+  const AF_Script_UniRangeRec  af_gujr_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0A81,  0x0A82 ),
+    AF_UNIRANGE_REC(  0x0ABC,  0x0ABC ),
+    AF_UNIRANGE_REC(  0x0AC1,  0x0AC8 ),
+    AF_UNIRANGE_REC(  0x0ACD,  0x0ACD ),
+    AF_UNIRANGE_REC(  0x0AE2,  0x0AE3 ),
+    AF_UNIRANGE_REC(  0x0AFA,  0x0AFF ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_guru_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0A00UL,  0x0A7FUL ),  /* Gurmukhi */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0A00,  0x0A7F ),  /* Gurmukhi */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+  const AF_Script_UniRangeRec  af_guru_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0A01,  0x0A02 ),
+    AF_UNIRANGE_REC(  0x0A3C,  0x0A3C ),
+    AF_UNIRANGE_REC(  0x0A41,  0x0A51 ),
+    AF_UNIRANGE_REC(  0x0A70,  0x0A71 ),
+    AF_UNIRANGE_REC(  0x0A75,  0x0A75 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_hebr_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0590,  0x05FF ),  /* Hebrew                          */
+    AF_UNIRANGE_REC(  0xFB1D,  0xFB4F ),  /* Alphab. Present. Forms (Hebrew) */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_hebr_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0591,  0x05BF ),
+    AF_UNIRANGE_REC(  0x05C1,  0x05C2 ),
+    AF_UNIRANGE_REC(  0x05C4,  0x05C5 ),
+    AF_UNIRANGE_REC(  0x05C7,  0x05C7 ),
+    AF_UNIRANGE_REC(  0xFB1E,  0xFB1E ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_kali_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA900,  0xA92F ),   /* Kayah Li */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_kali_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA926,  0xA92D ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_knda_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0C80UL,  0x0CFFUL ),  /* Kannada */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0C80,  0x0CFF ),  /* Kannada */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_limb_uniranges[] =
+  const AF_Script_UniRangeRec  af_knda_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x1900UL,  0x194FUL ),  /* Limbu */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0C81,  0x0C81 ),
+    AF_UNIRANGE_REC(  0x0CBC,  0x0CBC ),
+    AF_UNIRANGE_REC(  0x0CBF,  0x0CBF ),
+    AF_UNIRANGE_REC(  0x0CC6,  0x0CC6 ),
+    AF_UNIRANGE_REC(  0x0CCC,  0x0CCD ),
+    AF_UNIRANGE_REC(  0x0CE2,  0x0CE3 ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+
+  const AF_Script_UniRangeRec  af_khmr_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1780,  0x17FF ),  /* Khmer */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_khmr_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x17B7,  0x17BD ),
+    AF_UNIRANGE_REC(  0x17C6,  0x17C6 ),
+    AF_UNIRANGE_REC(  0x17C9,  0x17D3 ),
+    AF_UNIRANGE_REC(  0x17DD,  0x17DD ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_khms_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x19E0,  0x19FF ),  /* Khmer Symbols */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_khms_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_lao_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0E80,  0x0EFF ),  /* Lao */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_lao_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0EB1,  0x0EB1 ),
+    AF_UNIRANGE_REC(  0x0EB4,  0x0EBC ),
+    AF_UNIRANGE_REC(  0x0EC8,  0x0ECD ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_latn_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0020,  0x007F ),  /* Basic Latin (no control chars)         */
+    AF_UNIRANGE_REC(  0x00A0,  0x00A9 ),  /* Latin-1 Supplement (no control chars)  */
+    AF_UNIRANGE_REC(  0x00AB,  0x00B1 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x00B4,  0x00B8 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x00BB,  0x00FF ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x0100,  0x017F ),  /* Latin Extended-A                       */
+    AF_UNIRANGE_REC(  0x0180,  0x024F ),  /* Latin Extended-B                       */
+    AF_UNIRANGE_REC(  0x0250,  0x02AF ),  /* IPA Extensions                         */
+    AF_UNIRANGE_REC(  0x02B9,  0x02DF ),  /* Spacing Modifier Letters               */
+    AF_UNIRANGE_REC(  0x02E5,  0x02FF ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x0300,  0x036F ),  /* Combining Diacritical Marks            */
+    AF_UNIRANGE_REC(  0x1AB0,  0x1ABE ),  /* Combining Diacritical Marks Extended   */
+    AF_UNIRANGE_REC(  0x1D00,  0x1D2B ),  /* Phonetic Extensions                    */
+    AF_UNIRANGE_REC(  0x1D6B,  0x1D77 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x1D79,  0x1D7F ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x1D80,  0x1D9A ),  /* Phonetic Extensions Supplement         */
+    AF_UNIRANGE_REC(  0x1DC0,  0x1DFF ),  /* Combining Diacritical Marks Supplement */
+    AF_UNIRANGE_REC(  0x1E00,  0x1EFF ),  /* Latin Extended Additional              */
+    AF_UNIRANGE_REC(  0x2000,  0x206F ),  /* General Punctuation                    */
+    AF_UNIRANGE_REC(  0x20A0,  0x20B8 ),  /* Currency Symbols ...                   */
+    AF_UNIRANGE_REC(  0x20BA,  0x20CF ),  /* ... except new Rupee sign              */
+    AF_UNIRANGE_REC(  0x2150,  0x218F ),  /* Number Forms                           */
+    AF_UNIRANGE_REC(  0x2C60,  0x2C7B ),  /* Latin Extended-C                       */
+    AF_UNIRANGE_REC(  0x2C7E,  0x2C7F ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0x2E00,  0x2E7F ),  /* Supplemental Punctuation               */
+    AF_UNIRANGE_REC(  0xA720,  0xA76F ),  /* Latin Extended-D                       */
+    AF_UNIRANGE_REC(  0xA771,  0xA7F7 ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xA7FA,  0xA7FF ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xAB30,  0xAB5B ),  /* Latin Extended-E                       */
+    AF_UNIRANGE_REC(  0xAB60,  0xAB6F ),  /* ... continued                          */
+    AF_UNIRANGE_REC(  0xFB00,  0xFB06 ),  /* Alphab. Present. Forms (Latin Ligs)    */
+    AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ),  /* Mathematical Alphanumeric Symbols      */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_latn_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x005E,  0x0060 ),
+    AF_UNIRANGE_REC(  0x007E,  0x007E ),
+    AF_UNIRANGE_REC(  0x00A8,  0x00A9 ),
+    AF_UNIRANGE_REC(  0x00AE,  0x00B0 ),
+    AF_UNIRANGE_REC(  0x00B4,  0x00B4 ),
+    AF_UNIRANGE_REC(  0x00B8,  0x00B8 ),
+    AF_UNIRANGE_REC(  0x00BC,  0x00BE ),
+    AF_UNIRANGE_REC(  0x02B9,  0x02DF ),
+    AF_UNIRANGE_REC(  0x02E5,  0x02FF ),
+    AF_UNIRANGE_REC(  0x0300,  0x036F ),
+    AF_UNIRANGE_REC(  0x1AB0,  0x1ABE ),
+    AF_UNIRANGE_REC(  0x1DC0,  0x1DFF ),
+    AF_UNIRANGE_REC(  0x2017,  0x2017 ),
+    AF_UNIRANGE_REC(  0x203E,  0x203E ),
+    AF_UNIRANGE_REC(  0xA788,  0xA788 ),
+    AF_UNIRANGE_REC(  0xA7F8,  0xA7FA ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_latb_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1D62,  0x1D6A ),  /* some small subscript letters   */
+    AF_UNIRANGE_REC(  0x2080,  0x209C ),  /* subscript digits and letters   */
+    AF_UNIRANGE_REC(  0x2C7C,  0x2C7C ),  /* latin subscript small letter j */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_latb_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_latp_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x00AA,  0x00AA ),  /* feminine ordinal indicator          */
+    AF_UNIRANGE_REC(  0x00B2,  0x00B3 ),  /* superscript two and three           */
+    AF_UNIRANGE_REC(  0x00B9,  0x00BA ),  /* superscript one, masc. ord. indic.  */
+    AF_UNIRANGE_REC(  0x02B0,  0x02B8 ),  /* some latin superscript mod. letters */
+    AF_UNIRANGE_REC(  0x02E0,  0x02E4 ),  /* some IPA modifier letters           */
+    AF_UNIRANGE_REC(  0x1D2C,  0x1D61 ),  /* latin superscript modifier letters  */
+    AF_UNIRANGE_REC(  0x1D78,  0x1D78 ),  /* modifier letter cyrillic en         */
+    AF_UNIRANGE_REC(  0x1D9B,  0x1DBF ),  /* more modifier letters               */
+    AF_UNIRANGE_REC(  0x2070,  0x207F ),  /* superscript digits and letters      */
+    AF_UNIRANGE_REC(  0x2C7D,  0x2C7D ),  /* modifier letter capital v           */
+    AF_UNIRANGE_REC(  0xA770,  0xA770 ),  /* modifier letter us                  */
+    AF_UNIRANGE_REC(  0xA7F8,  0xA7F9 ),  /* more modifier letters               */
+    AF_UNIRANGE_REC(  0xAB5C,  0xAB5F ),  /* more modifier letters               */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_latp_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_lisu_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA4D0,  0xA4FF ),    /* Lisu */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_lisu_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_mlym_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0D00UL,  0x0D7FUL ),  /* Malayalam */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0D00,  0x0D7F ),  /* Malayalam */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_orya_uniranges[] =
+  const AF_Script_UniRangeRec  af_mlym_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0B00UL,  0x0B7FUL ),  /* Oriya */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0D00,  0x0D01 ),
+    AF_UNIRANGE_REC(  0x0D3B,  0x0D3C ),
+    AF_UNIRANGE_REC(  0x0D4D,  0x0D4E ),
+    AF_UNIRANGE_REC(  0x0D62,  0x0D63 ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+
+  const AF_Script_UniRangeRec  af_mymr_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1000,  0x109F ),    /* Myanmar            */
+    AF_UNIRANGE_REC(  0xA9E0,  0xA9FF ),    /* Myanmar Extended-B */
+    AF_UNIRANGE_REC(  0xAA60,  0xAA7F ),    /* Myanmar Extended-A */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_mymr_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x102D,  0x1030 ),
+    AF_UNIRANGE_REC(  0x1032,  0x1037 ),
+    AF_UNIRANGE_REC(  0x103A,  0x103A ),
+    AF_UNIRANGE_REC(  0x103D,  0x103E ),
+    AF_UNIRANGE_REC(  0x1058,  0x1059 ),
+    AF_UNIRANGE_REC(  0x105E,  0x1060 ),
+    AF_UNIRANGE_REC(  0x1071,  0x1074 ),
+    AF_UNIRANGE_REC(  0x1082,  0x1082 ),
+    AF_UNIRANGE_REC(  0x1085,  0x1086 ),
+    AF_UNIRANGE_REC(  0x108D,  0x108D ),
+    AF_UNIRANGE_REC(  0xA9E5,  0xA9E5 ),
+    AF_UNIRANGE_REC(  0xAA7C,  0xAA7C ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_nkoo_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x07C0,  0x07FF ),    /* N'Ko */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_nkoo_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x07EB,  0x07F5 ),
+    AF_UNIRANGE_REC(  0x07FD,  0x07FD ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_none_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+  const AF_Script_UniRangeRec  af_none_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_olck_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1C50,  0x1C7F ),    /* Ol Chiki */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_olck_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_orkh_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10C00, 0x10C4F ),    /* Old Turkic */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_orkh_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_osge_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x104B0, 0x104FF ),    /* Osage */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_osge_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_osma_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10480, 0x104AF ),   /* Osmanya */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_osma_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_saur_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA880,  0xA8DF ),   /* Saurashtra */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_saur_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA880,  0xA881 ),
+    AF_UNIRANGE_REC(  0xA8B4,  0xA8C5 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_shaw_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0x10450, 0x1047F ),   /* Shavian */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_shaw_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_sinh_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0D80UL,  0x0DFFUL ),  /* Sinhala */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0D80,  0x0DFF ),  /* Sinhala */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+  const AF_Script_UniRangeRec  af_sinh_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0DCA,  0x0DCA ),
+    AF_UNIRANGE_REC(  0x0DD2,  0x0DD6 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_sund_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x1B80UL,  0x1BBFUL ),  /* Sundanese */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x1B80,  0x1BBF ), /* Sundanese            */
+    AF_UNIRANGE_REC(  0x1CC0,  0x1CCF ), /* Sundanese Supplement */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
-  const AF_Script_UniRangeRec  af_sylo_uniranges[] =
+  const AF_Script_UniRangeRec  af_sund_nonbase_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0xA800UL,  0xA82FUL ),  /* Syloti Nagri */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x1B80,  0x1B82 ),
+    AF_UNIRANGE_REC(  0x1BA1,  0x1BAD ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+
   const AF_Script_UniRangeRec  af_taml_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0B80UL,  0x0BFFUL ),  /* Tamil */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0B80,  0x0BFF ),  /* Tamil */
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
+  const AF_Script_UniRangeRec  af_taml_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0B82,  0x0B82 ),
+    AF_UNIRANGE_REC(  0x0BC0,  0x0BC2 ),
+    AF_UNIRANGE_REC(  0x0BCD,  0x0BCD ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_tavt_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xAA80,  0xAADF ),   /* Tai Viet */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_tavt_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xAAB0,  0xAAB0 ),
+    AF_UNIRANGE_REC(  0xAAB2,  0xAAB4 ),
+    AF_UNIRANGE_REC(  0xAAB7,  0xAAB8 ),
+    AF_UNIRANGE_REC(  0xAABE,  0xAABF ),
+    AF_UNIRANGE_REC(  0xAAC1,  0xAAC1 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_telu_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0C00,  0x0C7F ),  /* Telugu */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_telu_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0C00,  0x0C00 ),
+    AF_UNIRANGE_REC(  0x0C04,  0x0C04 ),
+    AF_UNIRANGE_REC(  0x0C3E,  0x0C40 ),
+    AF_UNIRANGE_REC(  0x0C46,  0x0C56 ),
+    AF_UNIRANGE_REC(  0x0C62,  0x0C63 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_thai_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0E00,  0x0E7F ),  /* Thai */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_thai_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0E31,  0x0E31 ),
+    AF_UNIRANGE_REC(  0x0E34,  0x0E3A ),
+    AF_UNIRANGE_REC(  0x0E47,  0x0E4E ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_tfng_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x2D30,  0x2D7F ),   /* Tifinagh */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_tfng_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_vaii_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA500,  0xA63F ),   /* Vai */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_vaii_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0, 0 )
+  };
+
+
+#ifdef AF_CONFIG_OPTION_INDIC
+
+  const AF_Script_UniRangeRec  af_limb_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1900,  0x194F ),  /* Limbu */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_limb_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x1920,  0x1922 ),
+    AF_UNIRANGE_REC(  0x1927,  0x1934 ),
+    AF_UNIRANGE_REC(  0x1937,  0x193B ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_orya_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0B00,  0x0B7F ),  /* Oriya */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_orya_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0B01,  0x0B02 ),
+    AF_UNIRANGE_REC(  0x0B3C,  0x0B3C ),
+    AF_UNIRANGE_REC(  0x0B3F,  0x0B3F ),
+    AF_UNIRANGE_REC(  0x0B41,  0x0B44 ),
+    AF_UNIRANGE_REC(  0x0B4D,  0x0B56 ),
+    AF_UNIRANGE_REC(  0x0B62,  0x0B63 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
+  const AF_Script_UniRangeRec  af_sylo_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA800,  0xA82F ),  /* Syloti Nagri */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_sylo_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0xA802,  0xA802 ),
+    AF_UNIRANGE_REC(  0xA806,  0xA806 ),
+    AF_UNIRANGE_REC(  0xA80B,  0xA80B ),
+    AF_UNIRANGE_REC(  0xA825,  0xA826 ),
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+
   const AF_Script_UniRangeRec  af_tibt_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x0F00UL,  0x0FFFUL ),  /* Tibetan */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x0F00,  0x0FFF ),  /* Tibetan */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_tibt_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0F18,  0x0F19 ),
+    AF_UNIRANGE_REC(  0x0F35,  0x0F35 ),
+    AF_UNIRANGE_REC(  0x0F37,  0x0F37 ),
+    AF_UNIRANGE_REC(  0x0F39,  0x0F39 ),
+    AF_UNIRANGE_REC(  0x0F3E,  0x0F3F ),
+    AF_UNIRANGE_REC(  0x0F71,  0x0F7E ),
+    AF_UNIRANGE_REC(  0x0F80,  0x0F84 ),
+    AF_UNIRANGE_REC(  0x0F86,  0x0F87 ),
+    AF_UNIRANGE_REC(  0x0F8D,  0x0FBC ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
 #endif /* !AF_CONFIG_OPTION_INDIC */
@@ -197,39 +985,47 @@
 
   const AF_Script_UniRangeRec  af_hani_uniranges[] =
   {
-    AF_UNIRANGE_REC(  0x1100UL,  0x11FFUL ),  /* Hangul Jamo                             */
-    AF_UNIRANGE_REC(  0x2E80UL,  0x2EFFUL ),  /* CJK Radicals Supplement                 */
-    AF_UNIRANGE_REC(  0x2F00UL,  0x2FDFUL ),  /* Kangxi Radicals                         */
-    AF_UNIRANGE_REC(  0x2FF0UL,  0x2FFFUL ),  /* Ideographic Description Characters      */
-    AF_UNIRANGE_REC(  0x3000UL,  0x303FUL ),  /* CJK Symbols and Punctuation             */
-    AF_UNIRANGE_REC(  0x3040UL,  0x309FUL ),  /* Hiragana                                */
-    AF_UNIRANGE_REC(  0x30A0UL,  0x30FFUL ),  /* Katakana                                */
-    AF_UNIRANGE_REC(  0x3100UL,  0x312FUL ),  /* Bopomofo                                */
-    AF_UNIRANGE_REC(  0x3130UL,  0x318FUL ),  /* Hangul Compatibility Jamo               */
-    AF_UNIRANGE_REC(  0x3190UL,  0x319FUL ),  /* Kanbun                                  */
-    AF_UNIRANGE_REC(  0x31A0UL,  0x31BFUL ),  /* Bopomofo Extended                       */
-    AF_UNIRANGE_REC(  0x31C0UL,  0x31EFUL ),  /* CJK Strokes                             */
-    AF_UNIRANGE_REC(  0x31F0UL,  0x31FFUL ),  /* Katakana Phonetic Extensions            */
-    AF_UNIRANGE_REC(  0x3200UL,  0x32FFUL ),  /* Enclosed CJK Letters and Months         */
-    AF_UNIRANGE_REC(  0x3300UL,  0x33FFUL ),  /* CJK Compatibility                       */
-    AF_UNIRANGE_REC(  0x3400UL,  0x4DBFUL ),  /* CJK Unified Ideographs Extension A      */
-    AF_UNIRANGE_REC(  0x4DC0UL,  0x4DFFUL ),  /* Yijing Hexagram Symbols                 */
-    AF_UNIRANGE_REC(  0x4E00UL,  0x9FFFUL ),  /* CJK Unified Ideographs                  */
-    AF_UNIRANGE_REC(  0xA960UL,  0xA97FUL ),  /* Hangul Jamo Extended-A                  */
-    AF_UNIRANGE_REC(  0xAC00UL,  0xD7AFUL ),  /* Hangul Syllables                        */
-    AF_UNIRANGE_REC(  0xD7B0UL,  0xD7FFUL ),  /* Hangul Jamo Extended-B                  */
-    AF_UNIRANGE_REC(  0xF900UL,  0xFAFFUL ),  /* CJK Compatibility Ideographs            */
-    AF_UNIRANGE_REC(  0xFE10UL,  0xFE1FUL ),  /* Vertical forms                          */
-    AF_UNIRANGE_REC(  0xFE30UL,  0xFE4FUL ),  /* CJK Compatibility Forms                 */
-    AF_UNIRANGE_REC(  0xFF00UL,  0xFFEFUL ),  /* Halfwidth and Fullwidth Forms           */
-    AF_UNIRANGE_REC( 0x1B000UL, 0x1B0FFUL ),  /* Kana Supplement                         */
-    AF_UNIRANGE_REC( 0x1D300UL, 0x1D35FUL ),  /* Tai Xuan Hing Symbols                   */
-    AF_UNIRANGE_REC( 0x1F200UL, 0x1F2FFUL ),  /* Enclosed Ideographic Supplement         */
-    AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ),  /* CJK Unified Ideographs Extension B      */
-    AF_UNIRANGE_REC( 0x2A700UL, 0x2B73FUL ),  /* CJK Unified Ideographs Extension C      */
-    AF_UNIRANGE_REC( 0x2B740UL, 0x2B81FUL ),  /* CJK Unified Ideographs Extension D      */
-    AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ),  /* CJK Compatibility Ideographs Supplement */
-    AF_UNIRANGE_REC(       0UL,       0UL )
+    AF_UNIRANGE_REC(  0x1100,  0x11FF ),  /* Hangul Jamo                             */
+    AF_UNIRANGE_REC(  0x2E80,  0x2EFF ),  /* CJK Radicals Supplement                 */
+    AF_UNIRANGE_REC(  0x2F00,  0x2FDF ),  /* Kangxi Radicals                         */
+    AF_UNIRANGE_REC(  0x2FF0,  0x2FFF ),  /* Ideographic Description Characters      */
+    AF_UNIRANGE_REC(  0x3000,  0x303F ),  /* CJK Symbols and Punctuation             */
+    AF_UNIRANGE_REC(  0x3040,  0x309F ),  /* Hiragana                                */
+    AF_UNIRANGE_REC(  0x30A0,  0x30FF ),  /* Katakana                                */
+    AF_UNIRANGE_REC(  0x3100,  0x312F ),  /* Bopomofo                                */
+    AF_UNIRANGE_REC(  0x3130,  0x318F ),  /* Hangul Compatibility Jamo               */
+    AF_UNIRANGE_REC(  0x3190,  0x319F ),  /* Kanbun                                  */
+    AF_UNIRANGE_REC(  0x31A0,  0x31BF ),  /* Bopomofo Extended                       */
+    AF_UNIRANGE_REC(  0x31C0,  0x31EF ),  /* CJK Strokes                             */
+    AF_UNIRANGE_REC(  0x31F0,  0x31FF ),  /* Katakana Phonetic Extensions            */
+    AF_UNIRANGE_REC(  0x3300,  0x33FF ),  /* CJK Compatibility                       */
+    AF_UNIRANGE_REC(  0x3400,  0x4DBF ),  /* CJK Unified Ideographs Extension A      */
+    AF_UNIRANGE_REC(  0x4DC0,  0x4DFF ),  /* Yijing Hexagram Symbols                 */
+    AF_UNIRANGE_REC(  0x4E00,  0x9FFF ),  /* CJK Unified Ideographs                  */
+    AF_UNIRANGE_REC(  0xA960,  0xA97F ),  /* Hangul Jamo Extended-A                  */
+    AF_UNIRANGE_REC(  0xAC00,  0xD7AF ),  /* Hangul Syllables                        */
+    AF_UNIRANGE_REC(  0xD7B0,  0xD7FF ),  /* Hangul Jamo Extended-B                  */
+    AF_UNIRANGE_REC(  0xF900,  0xFAFF ),  /* CJK Compatibility Ideographs            */
+    AF_UNIRANGE_REC(  0xFE10,  0xFE1F ),  /* Vertical forms                          */
+    AF_UNIRANGE_REC(  0xFE30,  0xFE4F ),  /* CJK Compatibility Forms                 */
+    AF_UNIRANGE_REC(  0xFF00,  0xFFEF ),  /* Halfwidth and Fullwidth Forms           */
+    AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ),  /* Kana Supplement                         */
+    AF_UNIRANGE_REC( 0x1B100, 0x1B12F ),  /* Kana Extended-A                         */
+    AF_UNIRANGE_REC( 0x1D300, 0x1D35F ),  /* Tai Xuan Hing Symbols                   */
+    AF_UNIRANGE_REC( 0x20000, 0x2A6DF ),  /* CJK Unified Ideographs Extension B      */
+    AF_UNIRANGE_REC( 0x2A700, 0x2B73F ),  /* CJK Unified Ideographs Extension C      */
+    AF_UNIRANGE_REC( 0x2B740, 0x2B81F ),  /* CJK Unified Ideographs Extension D      */
+    AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ),  /* CJK Unified Ideographs Extension E      */
+    AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ),  /* CJK Unified Ideographs Extension F      */
+    AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ),  /* CJK Compatibility Ideographs Supplement */
+    AF_UNIRANGE_REC(       0,       0 )
+  };
+
+  const AF_Script_UniRangeRec  af_hani_nonbase_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x302A,  0x302F ),
+    AF_UNIRANGE_REC(  0x3190,  0x319F ),
+    AF_UNIRANGE_REC(       0,       0 )
   };
 
 #endif /* !AF_CONFIG_OPTION_CJK */
diff --git a/src/autofit/afranges.h b/src/autofit/afranges.h
index 7c78ab0..ba3b5e7 100644
--- a/src/autofit/afranges.h
+++ b/src/autofit/afranges.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter Unicode script ranges (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFRANGES_H__
-#define __AFRANGES_H__
+#ifndef AFRANGES_H_
+#define AFRANGES_H_
 
 
 #include "aftypes.h"
@@ -26,16 +26,22 @@
 FT_BEGIN_HEADER
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 )                             \
+#define SCRIPT( s, S, d, h, H, ss )                                     \
           extern const AF_Script_UniRangeRec  af_ ## s ## _uniranges[];
 
 #include "afscript.h"
 
+#undef  SCRIPT
+#define SCRIPT( s, S, d, h, H, ss )                                             \
+          extern const AF_Script_UniRangeRec  af_ ## s ## _nonbase_uniranges[];
+
+#include "afscript.h"
+
  /* */
 
 FT_END_HEADER
 
-#endif /* __AFRANGES_H__ */
+#endif /* AFRANGES_H_ */
 
 
 /* END */
diff --git a/src/autofit/afscript.h b/src/autofit/afscript.h
index dfcc830..623a173 100644
--- a/src/autofit/afscript.h
+++ b/src/autofit/afscript.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter scripts (specification only).                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,114 +25,354 @@
   /* by a description string.  Then comes the corresponding HarfBuzz  */
   /* script name tag, followed by a string of standard characters (to */
   /* derive the standard width and height of stems).                  */
+  /*                                                                  */
+  /* Note that fallback scripts only have a default style, thus we    */
+  /* use `HB_SCRIPT_INVALID' as the HarfBuzz script name tag for      */
+  /* them.                                                            */
+
+  SCRIPT( adlm, ADLM,
+          "Adlam",
+          HB_SCRIPT_ADLAM,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x9E\xA4\x8C \xF0\x9E\xA4\xAE" ) /* 𞤌 𞤮 */
 
   SCRIPT( arab, ARAB,
           "Arabic",
           HB_SCRIPT_ARABIC,
-          0x644, 0x62D, 0x640 ) /* ل ح ـ */
+          HINTING_BOTTOM_TO_TOP,
+          "\xD9\x84 \xD8\xAD \xD9\x80" ) /* ل ح ـ */
+
+  SCRIPT( armn, ARMN,
+          "Armenian",
+          HB_SCRIPT_ARMENIAN,
+          HINTING_BOTTOM_TO_TOP,
+          "\xD5\xBD \xD5\x8D" ) /* ս Ս */
+
+  SCRIPT( avst, AVST,
+          "Avestan",
+          HB_SCRIPT_AVESTAN,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\xAC\x9A" ) /* 𐬚 */
+
+  SCRIPT( bamu, BAMU,
+          "Bamum",
+          HB_SCRIPT_BAMUM,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\x9B\x81 \xEA\x9B\xAF" ) /* ꛁ ꛯ */
+
+  /* there are no simple forms for letters; we thus use two digit shapes */
+  SCRIPT( beng, BENG,
+          "Bengali",
+          HB_SCRIPT_BENGALI,
+          HINTING_TOP_TO_BOTTOM,
+          "\xE0\xA7\xA6 \xE0\xA7\xAA" ) /* ০ ৪ */
+
+  SCRIPT( buhd, BUHD,
+          "Buhid",
+          HB_SCRIPT_BUHID,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x9D\x8B \xE1\x9D\x8F" ) /* ᝋ ᝏ */
+
+  SCRIPT( cakm, CAKM,
+          "Chakma",
+          HB_SCRIPT_CHAKMA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x91\x84\xA4 \xF0\x91\x84\x89 \xF0\x91\x84\x9B" ) /* 𑄤 𑄉 𑄛 */
+
+  SCRIPT( cans, CANS,
+          "Canadian Syllabics",
+          HB_SCRIPT_CANADIAN_SYLLABICS,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x91\x8C \xE1\x93\x9A" ) /* ᑌ ᓚ */
+
+  SCRIPT( cari, CARI,
+          "Carian",
+          HB_SCRIPT_CARIAN,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\x8A\xAB \xF0\x90\x8B\x89" ) /* 𐊫 𐋉 */
+
+  SCRIPT( cher, CHER,
+          "Cherokee",
+          HB_SCRIPT_CHEROKEE,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x8E\xA4 \xE1\x8F\x85 \xEA\xAE\x95" ) /* Ꭴ Ꮕ ꮕ */
+
+  SCRIPT( copt, COPT,
+          "Coptic",
+          HB_SCRIPT_COPTIC,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE2\xB2\x9E \xE2\xB2\x9F" ) /* Ⲟ ⲟ */
+
+  SCRIPT( cprt, CPRT,
+          "Cypriot",
+          HB_SCRIPT_CYPRIOT,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\xA0\x85 \xF0\x90\xA0\xA3" ) /* 𐠅 𐠣 */
 
   SCRIPT( cyrl, CYRL,
           "Cyrillic",
           HB_SCRIPT_CYRILLIC,
-          0x43E, 0x41E, 0x0 ) /* оО */
+          HINTING_BOTTOM_TO_TOP,
+          "\xD0\xBE \xD0\x9E" ) /* о О */
 
   SCRIPT( deva, DEVA,
           "Devanagari",
           HB_SCRIPT_DEVANAGARI,
-          0x920, 0x935, 0x91F ) /* ठ व ट */
+          HINTING_TOP_TO_BOTTOM,
+          "\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठ व ट */
+
+  SCRIPT( dsrt, DSRT,
+          "Deseret",
+          HB_SCRIPT_DESERET,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\x90\x84 \xF0\x90\x90\xAC" ) /* 𐐄 𐐬 */
+
+  SCRIPT( ethi, ETHI,
+          "Ethiopic",
+          HB_SCRIPT_ETHIOPIC,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x8B\x90" ) /* ዐ */
+
+  SCRIPT( geor, GEOR,
+          "Georgian (Mkhedruli)",
+          HB_SCRIPT_GEORGIAN,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x83\x98 \xE1\x83\x94 \xE1\x83\x90 \xE1\xB2\xBF" ) /* ი ე ა Ი */
+
+  SCRIPT( geok, GEOK,
+          "Georgian (Khutsuri)",
+          HB_SCRIPT_INVALID,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x82\xB6 \xE1\x82\xB1 \xE2\xB4\x99" ) /* Ⴖ Ⴑ ⴙ */
+
+  SCRIPT( glag, GLAG,
+          "Glagolitic",
+          HB_SCRIPT_GLAGOLITIC,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE2\xB0\x95 \xE2\xB1\x85" ) /* Ⱅ ⱅ */
+
+  SCRIPT( goth, GOTH,
+          "Gothic",
+          HB_SCRIPT_GOTHIC,
+          HINTING_TOP_TO_BOTTOM,
+          "\xF0\x90\x8C\xB4 \xF0\x90\x8C\xBE \xF0\x90\x8D\x83" ) /* 𐌴 𐌾 𐍃 */
 
   SCRIPT( grek, GREK,
           "Greek",
           HB_SCRIPT_GREEK,
-          0x3BF, 0x39F, 0x0 ) /* οΟ */
+          HINTING_BOTTOM_TO_TOP,
+          "\xCE\xBF \xCE\x9F" ) /* ο Ο */
+
+  SCRIPT( gujr, GUJR,
+          "Gujarati",
+          HB_SCRIPT_GUJARATI,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xAA\x9F \xE0\xAB\xA6" ) /* ટ ૦ */
+
+  SCRIPT( guru, GURU,
+          "Gurmukhi",
+          HB_SCRIPT_GURMUKHI,
+          HINTING_TOP_TO_BOTTOM,
+          "\xE0\xA8\xA0 \xE0\xA8\xB0 \xE0\xA9\xA6" ) /* ਠ ਰ ੦ */
 
   SCRIPT( hebr, HEBR,
           "Hebrew",
           HB_SCRIPT_HEBREW,
-          0x5DD, 0x0, 0x0 ) /* ם */
+          HINTING_BOTTOM_TO_TOP,
+          "\xD7\x9D" ) /* ם */
+
+  SCRIPT( kali, KALI,
+          "Kayah Li",
+          HB_SCRIPT_KAYAH_LI,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ꤍ ꤀ */
+
+  /* only digit zero has a simple shape in the Khmer script */
+  SCRIPT( khmr, KHMR,
+          "Khmer",
+          HB_SCRIPT_KHMER,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x9F\xA0" ) /* ០ */
+
+  SCRIPT( khms, KHMS,
+          "Khmer Symbols",
+          HB_SCRIPT_INVALID,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\xA7\xA1 \xE1\xA7\xAA" ) /* ᧡ ᧪ */
+
+  SCRIPT( knda, KNDA,
+          "Kannada",
+          HB_SCRIPT_KANNADA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */
+
+  /* only digit zero has a simple shape in the Lao script */
+  SCRIPT( lao, LAO,
+          "Lao",
+          HB_SCRIPT_LAO,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xBB\x90" ) /* ໐ */
 
   SCRIPT( latn, LATN,
           "Latin",
           HB_SCRIPT_LATIN,
-          'o', 'O', '0' )
+          HINTING_BOTTOM_TO_TOP,
+          "o O 0" )
+
+  SCRIPT( latb, LATB,
+          "Latin Subscript Fallback",
+          HB_SCRIPT_INVALID,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE2\x82\x92 \xE2\x82\x80" ) /* ₒ ₀ */
+
+  SCRIPT( latp, LATP,
+          "Latin Superscript Fallback",
+          HB_SCRIPT_INVALID,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* ᵒ ᴼ ⁰ */
+
+  SCRIPT( lisu, LISU,
+          "Lisu",
+          HB_SCRIPT_LISU,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\x93\xB3" ) /* ꓳ */
+
+  SCRIPT( mlym, MLYM,
+          "Malayalam",
+          HB_SCRIPT_MALAYALAM,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* ഠ റ */
+
+  SCRIPT( mymr, MYMR,
+          "Myanmar",
+          HB_SCRIPT_MYANMAR,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\x80\x9D \xE1\x80\x84 \xE1\x80\x82" ) /* ဝ င ဂ */
+
+  SCRIPT( nkoo, NKOO,
+          "N'Ko",
+          HB_SCRIPT_NKO,
+          HINTING_BOTTOM_TO_TOP,
+          "\xDF\x8B \xDF\x80" ) /* ߋ ߀ */
 
   SCRIPT( none, NONE,
           "no script",
           HB_SCRIPT_INVALID,
-          0x0, 0x0, 0x0 )
+          HINTING_BOTTOM_TO_TOP,
+          "" )
+
+  SCRIPT( olck, OLCK,
+          "Ol Chiki",
+          HB_SCRIPT_OL_CHIKI,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\xB1\x9B" ) /* ᱛ */
+
+  SCRIPT( orkh, ORKH,
+          "Old Turkic",
+          HB_SCRIPT_OLD_TURKIC,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\xB0\x97" ) /* 𐰗 */
+
+  SCRIPT( osge, OSGE,
+          "Osage",
+          HB_SCRIPT_OSAGE,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\x93\x82 \xF0\x90\x93\xAA" ) /* 𐓂 𐓪 */
+
+  SCRIPT( osma, OSMA,
+          "Osmanya",
+          HB_SCRIPT_OSMANYA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* 𐒆 𐒠 */
+
+  SCRIPT( saur, SAUR,
+          "Saurashtra",
+          HB_SCRIPT_SAURASHTRA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\xA2\x9D \xEA\xA3\x90" ) /* ꢝ ꣐ */
+
+  SCRIPT( shaw, SHAW,
+          "Shavian",
+          HB_SCRIPT_SHAVIAN,
+          HINTING_BOTTOM_TO_TOP,
+          "\xF0\x90\x91\xB4" ) /* 𐑴 */
+
+  SCRIPT( sinh, SINH,
+          "Sinhala",
+          HB_SCRIPT_SINHALA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB6\xA7" ) /* ට */
+
+  /* only digit zero has a simple (round) shape in the Sundanese script */
+  SCRIPT( sund, SUND,
+          "Sundanese",
+          HB_SCRIPT_SUNDANESE,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE1\xAE\xB0" ) /* ᮰ */
+
+  /* only digit zero has a simple (round) shape in the Tamil script */
+  SCRIPT( taml, TAML,
+          "Tamil",
+          HB_SCRIPT_TAMIL,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xAF\xA6" ) /* ௦ */
+
+  SCRIPT( tavt, TAVT,
+          "Tai Viet",
+          HB_SCRIPT_TAI_VIET,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\xAA\x92 \xEA\xAA\xAB" ) /* ꪒ ꪫ */
 
   /* there are no simple forms for letters; we thus use two digit shapes */
   SCRIPT( telu, TELU,
           "Telugu",
           HB_SCRIPT_TELUGU,
-          0xC66, 0xC67, 0x0 ) /* ౦ ౧ */
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౦ ౧ */
+
+  SCRIPT( tfng, TFNG,
+          "Tifinagh",
+          HB_SCRIPT_TIFINAGH,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE2\xB5\x94" ) /* ⵔ */
 
   SCRIPT( thai, THAI,
           "Thai",
           HB_SCRIPT_THAI,
-          0xE32, 0xE45, 0xE50 ) /* า ๅ ๐ */
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๐ */
+
+  SCRIPT( vaii, VAII,
+          "Vai",
+          HB_SCRIPT_VAI,
+          HINTING_BOTTOM_TO_TOP,
+          "\xEA\x98\x93 \xEA\x96\x9C \xEA\x96\xB4" ) /* ꘓ ꖜ ꖴ */
 
 #ifdef AF_CONFIG_OPTION_INDIC
 
-  SCRIPT( beng, BENG,
-          "Bengali",
-          HB_SCRIPT_BENGALI,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( gujr, GUJR,
-          "Gujarati",
-          HB_SCRIPT_GUJARATI,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( guru, GURU,
-          "Gurmukhi",
-          HB_SCRIPT_GURMUKHI,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( knda, KNDA,
-          "Kannada",
-          HB_SCRIPT_KANNADA,
-          'o', 0x0, 0x0 ) /* XXX */
-
   SCRIPT( limb, LIMB,
           "Limbu",
           HB_SCRIPT_LIMBU,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( mlym, MLYM,
-          "Malayalam",
-          HB_SCRIPT_MALAYALAM,
-          'o', 0x0, 0x0 ) /* XXX */
+          HINTING_BOTTOM_TO_TOP,
+          "o" ) /* XXX */
 
   SCRIPT( orya, ORYA,
           "Oriya",
           HB_SCRIPT_ORIYA,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( sinh, SINH,
-          "Sinhala",
-          HB_SCRIPT_SINHALA,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( sund, SUND,
-          "Sundanese",
-          HB_SCRIPT_SUNDANESE,
-          'o', 0x0, 0x0 ) /* XXX */
+          HINTING_BOTTOM_TO_TOP,
+          "o" ) /* XXX */
 
   SCRIPT( sylo, SYLO,
           "Syloti Nagri",
           HB_SCRIPT_SYLOTI_NAGRI,
-          'o', 0x0, 0x0 ) /* XXX */
-
-  SCRIPT( taml, TAML,
-          "Tamil",
-          HB_SCRIPT_TAMIL,
-          'o', 0x0, 0x0 ) /* XXX */
+          HINTING_BOTTOM_TO_TOP,
+          "o" ) /* XXX */
 
   SCRIPT( tibt, TIBT,
           "Tibetan",
           HB_SCRIPT_TIBETAN,
-          'o', 0x0, 0x0 ) /* XXX */
+          HINTING_BOTTOM_TO_TOP,
+          "o" ) /* XXX */
 
 #endif /* AF_CONFIG_OPTION_INDIC */
 
@@ -141,7 +381,8 @@
   SCRIPT( hani, HANI,
           "CJKV ideographs",
           HB_SCRIPT_HAN,
-          0x7530, 0x56D7, 0x0 ) /* 田囗 */
+          HINTING_BOTTOM_TO_TOP,
+          "\xE7\x94\xB0 \xE5\x9B\x97" ) /* 田 囗 */
 
 #endif /* AF_CONFIG_OPTION_CJK */
 
diff --git a/src/autofit/hbshim.c b/src/autofit/afshaper.c
similarity index 67%
rename from src/autofit/hbshim.c
rename to src/autofit/afshaper.c
index c9c1db0..f308281 100644
--- a/src/autofit/hbshim.c
+++ b/src/autofit/afshaper.c
@@ -1,10 +1,10 @@
 /***************************************************************************/
 /*                                                                         */
-/*  hbshim.c                                                               */
+/*  afshaper.c                                                             */
 /*                                                                         */
 /*    HarfBuzz interface for accessing OpenType features (body).           */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,9 +18,10 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_ADVANCES_H
 #include "afglobal.h"
 #include "aftypes.h"
-#include "hbshim.h"
+#include "afshaper.h"
 
 #ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
 
@@ -32,7 +33,7 @@
   /* messages during execution.                                            */
   /*                                                                       */
 #undef  FT_COMPONENT
-#define FT_COMPONENT  trace_afharfbuzz
+#define FT_COMPONENT  trace_afshaper
 
 
   /*
@@ -86,7 +87,7 @@
 
   /* load HarfBuzz script tags */
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 )  h,
+#define SCRIPT( s, S, d, h, H, ss )  h,
 
 
   static const hb_script_t  scripts[] =
@@ -96,16 +97,17 @@
 
 
   FT_Error
-  af_get_coverage( AF_FaceGlobals  globals,
-                   AF_StyleClass   style_class,
-                   FT_Byte*        gstyles )
+  af_shaper_get_coverage( AF_FaceGlobals  globals,
+                          AF_StyleClass   style_class,
+                          FT_UShort*      gstyles,
+                          FT_Bool         default_script )
   {
     hb_face_t*  face;
 
-    hb_set_t*  gsub_lookups;  /* GSUB lookups for a given script */
-    hb_set_t*  gsub_glyphs;   /* glyphs covered by GSUB lookups  */
-    hb_set_t*  gpos_lookups;  /* GPOS lookups for a given script */
-    hb_set_t*  gpos_glyphs;   /* glyphs covered by GPOS lookups  */
+    hb_set_t*  gsub_lookups = NULL; /* GSUB lookups for a given script */
+    hb_set_t*  gsub_glyphs  = NULL; /* glyphs covered by GSUB lookups  */
+    hb_set_t*  gpos_lookups = NULL; /* GPOS lookups for a given script */
+    hb_set_t*  gpos_glyphs  = NULL; /* glyphs covered by GPOS lookups  */
 
     hb_script_t      script;
     const hb_tag_t*  coverage_tags;
@@ -125,11 +127,6 @@
 
     face = hb_font_get_face( globals->hb_font );
 
-    gsub_lookups = hb_set_create();
-    gsub_glyphs  = hb_set_create();
-    gpos_lookups = hb_set_create();
-    gpos_glyphs  = hb_set_create();
-
     coverage_tags = coverages[style_class->coverage];
     script        = scripts[style_class->script];
 
@@ -143,8 +140,7 @@
     /* `hb_ot_tags_from_script' usually returns HB_OT_TAG_DEFAULT_SCRIPT */
     /* as the second tag.  We change that to HB_TAG_NONE except for the  */
     /* default script.                                                   */
-    if ( style_class->script == globals->module->default_script &&
-         style_class->coverage == AF_COVERAGE_DEFAULT           )
+    if ( default_script )
     {
       if ( script_tags[0] == HB_TAG_NONE )
         script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT;
@@ -158,10 +154,16 @@
     }
     else
     {
+      /* we use non-standard tags like `khms' for special purposes;       */
+      /* HarfBuzz maps them to `DFLT', which we don't want to handle here */
+      if ( script_tags[0] == HB_OT_TAG_DEFAULT_SCRIPT )
+        goto Exit;
+
       if ( script_tags[1] == HB_OT_TAG_DEFAULT_SCRIPT )
         script_tags[1] = HB_TAG_NONE;
     }
 
+    gsub_lookups = hb_set_create();
     hb_ot_layout_collect_lookups( face,
                                   HB_OT_TAG_GSUB,
                                   script_tags,
@@ -172,13 +174,6 @@
     if ( hb_set_is_empty( gsub_lookups ) )
       goto Exit; /* nothing to do */
 
-    hb_ot_layout_collect_lookups( face,
-                                  HB_OT_TAG_GPOS,
-                                  script_tags,
-                                  NULL,
-                                  coverage_tags,
-                                  gpos_lookups );
-
     FT_TRACE4(( "GSUB lookups (style `%s'):\n"
                 " ",
                 af_style_names[style_class->style] ));
@@ -187,6 +182,7 @@
     count = 0;
 #endif
 
+    gsub_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -214,10 +210,19 @@
                 " ",
                 af_style_names[style_class->style] ));
 
+    gpos_lookups = hb_set_create();
+    hb_ot_layout_collect_lookups( face,
+                                  HB_OT_TAG_GPOS,
+                                  script_tags,
+                                  NULL,
+                                  coverage_tags,
+                                  gpos_lookups );
+
 #ifdef FT_DEBUG_LEVEL_TRACE
     count = 0;
 #endif
 
+    gpos_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -363,7 +368,7 @@
         continue;
 
       if ( gstyles[idx] == AF_STYLE_UNASSIGNED )
-        gstyles[idx] = (FT_Byte)style_class->style;
+        gstyles[idx] = (FT_UShort)style_class->style;
 #ifdef FT_DEBUG_LEVEL_TRACE
       else
         FT_TRACE4(( "*" ));
@@ -418,88 +423,150 @@
   };
 
 
-  FT_Error
-  af_get_char_index( AF_StyleMetrics  metrics,
-                     FT_ULong         charcode,
-                     FT_ULong        *codepoint,
-                     FT_Long         *y_offset )
+  void*
+  af_shaper_buf_create( FT_Face  face )
   {
-    AF_StyleClass  style_class;
+    FT_UNUSED( face );
 
+    return (void*)hb_buffer_create();
+  }
+
+
+  void
+  af_shaper_buf_destroy( FT_Face  face,
+                         void*    buf )
+  {
+    FT_UNUSED( face );
+
+    hb_buffer_destroy( (hb_buffer_t*)buf );
+  }
+
+
+  const char*
+  af_shaper_get_cluster( const char*      p,
+                         AF_StyleMetrics  metrics,
+                         void*            buf_,
+                         unsigned int*    count )
+  {
+    AF_StyleClass        style_class;
     const hb_feature_t*  feature;
+    FT_Int               upem;
+    const char*          q;
+    int                  len;
 
-    FT_ULong  in_idx, out_idx;
+    hb_buffer_t*    buf = (hb_buffer_t*)buf_;
+    hb_font_t*      font;
+    hb_codepoint_t  dummy;
 
 
-    if ( !metrics )
-      return FT_THROW( Invalid_Argument );
-
-    in_idx = FT_Get_Char_Index( metrics->globals->face, charcode );
-
+    upem        = (FT_Int)metrics->globals->face->units_per_EM;
     style_class = metrics->style_class;
+    feature     = features[style_class->coverage];
 
-    feature = features[style_class->coverage];
+    font = metrics->globals->hb_font;
+
+    /* we shape at a size of units per EM; this means font units */
+    hb_font_set_scale( font, upem, upem );
+
+    while ( *p == ' ' )
+      p++;
+
+    /* count bytes up to next space (or end of buffer) */
+    q = p;
+    while ( !( *q == ' ' || *q == '\0' ) )
+      GET_UTF8_CHAR( dummy, q );
+    len = (int)( q - p );
+
+    /* feed character(s) to the HarfBuzz buffer */
+    hb_buffer_clear_contents( buf );
+    hb_buffer_add_utf8( buf, p, len, 0, len );
+
+    /* we let HarfBuzz guess the script and writing direction */
+    hb_buffer_guess_segment_properties( buf );
+
+    /* shape buffer, which means conversion from character codes to */
+    /* glyph indices, possibly applying a feature                   */
+    hb_shape( font, buf, feature, feature ? 1 : 0 );
 
     if ( feature )
     {
-      FT_Int  upem = (FT_Int)metrics->globals->face->units_per_EM;
+      hb_buffer_t*  hb_buf = metrics->globals->hb_buf;
 
-      hb_font_t*    font = metrics->globals->hb_font;
-      hb_buffer_t*  buf  = hb_buffer_create();
+      unsigned int      gcount;
+      hb_glyph_info_t*  ginfo;
 
-      uint32_t  c = (uint32_t)charcode;
-
-      hb_glyph_info_t*      ginfo;
-      hb_glyph_position_t*  gpos;
-      unsigned int          gcount;
+      unsigned int      hb_gcount;
+      hb_glyph_info_t*  hb_ginfo;
 
 
-      /* we shape at a size of units per EM; this means font units */
-      hb_font_set_scale( font, upem, upem );
+      /* we have to check whether applying a feature does actually change */
+      /* glyph indices; otherwise the affected glyph or glyphs aren't     */
+      /* available at all in the feature                                  */
 
-      /* XXX: is this sufficient for a single character of any script? */
-      hb_buffer_set_direction( buf, HB_DIRECTION_LTR );
-      hb_buffer_set_script( buf, scripts[style_class->script] );
+      hb_buffer_clear_contents( hb_buf );
+      hb_buffer_add_utf8( hb_buf, p, len, 0, len );
+      hb_buffer_guess_segment_properties( hb_buf );
+      hb_shape( font, hb_buf, NULL, 0 );
 
-      /* we add one character to `buf' ... */
-      hb_buffer_add_utf32( buf, &c, 1, 0, 1 );
+      ginfo    = hb_buffer_get_glyph_infos( buf, &gcount );
+      hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount );
 
-      /* ... and apply one feature */
-      hb_shape( font, buf, feature, 1 );
-
-      ginfo = hb_buffer_get_glyph_infos( buf, &gcount );
-      gpos  = hb_buffer_get_glyph_positions( buf, &gcount );
-
-      out_idx = ginfo[0].codepoint;
-
-      /* getting the same index indicates no substitution,         */
-      /* which means that the glyph isn't available in the feature */
-      if ( in_idx == out_idx )
+      if ( gcount == hb_gcount )
       {
-        *codepoint = 0;
-        *y_offset  = 0;
-      }
-      else
-      {
-        *codepoint = out_idx;
-        *y_offset  = gpos[0].y_offset;
-      }
+        unsigned int  i;
 
-      hb_buffer_destroy( buf );
+
+        for (i = 0; i < gcount; i++ )
+          if ( ginfo[i].codepoint != hb_ginfo[i].codepoint )
+            break;
+
+        if ( i == gcount )
+        {
+          /* both buffers have identical glyph indices */
+          hb_buffer_clear_contents( buf );
+        }
+      }
+    }
+
+    *count = hb_buffer_get_length( buf );
 
 #ifdef FT_DEBUG_LEVEL_TRACE
-      if ( gcount > 1 )
-        FT_TRACE1(( "af_get_char_index:"
-                    " input character mapped to multiple glyphs\n" ));
+    if ( feature && *count > 1 )
+      FT_TRACE1(( "af_shaper_get_cluster:"
+                  " input character mapped to multiple glyphs\n" ));
 #endif
-    }
-    else
-    {
-      *codepoint = in_idx;
-      *y_offset  = 0;
-    }
 
-    return FT_Err_Ok;
+    return q;
+  }
+
+
+  FT_ULong
+  af_shaper_get_elem( AF_StyleMetrics  metrics,
+                      void*            buf_,
+                      unsigned int     idx,
+                      FT_Long*         advance,
+                      FT_Long*         y_offset )
+  {
+    hb_buffer_t*          buf = (hb_buffer_t*)buf_;
+    hb_glyph_info_t*      ginfo;
+    hb_glyph_position_t*  gpos;
+    unsigned int          gcount;
+
+    FT_UNUSED( metrics );
+
+
+    ginfo = hb_buffer_get_glyph_infos( buf, &gcount );
+    gpos  = hb_buffer_get_glyph_positions( buf, &gcount );
+
+    if ( idx >= gcount )
+      return 0;
+
+    if ( advance )
+      *advance = gpos[idx].x_advance;
+    if ( y_offset )
+      *y_offset = gpos[idx].y_offset;
+
+    return ginfo[idx].codepoint;
   }
 
 
@@ -507,36 +574,106 @@
 
 
   FT_Error
-  af_get_coverage( AF_FaceGlobals  globals,
-                   AF_StyleClass   style_class,
-                   FT_Byte*        gstyles )
+  af_shaper_get_coverage( AF_FaceGlobals  globals,
+                          AF_StyleClass   style_class,
+                          FT_UShort*      gstyles,
+                          FT_Bool         default_script )
   {
     FT_UNUSED( globals );
     FT_UNUSED( style_class );
     FT_UNUSED( gstyles );
+    FT_UNUSED( default_script );
 
     return FT_Err_Ok;
   }
 
 
-  FT_Error
-  af_get_char_index( AF_StyleMetrics  metrics,
-                     FT_ULong         charcode,
-                     FT_ULong        *codepoint,
-                     FT_Long         *y_offset )
+  void*
+  af_shaper_buf_create( FT_Face  face )
   {
-    FT_Face  face;
+    FT_Error   error;
+    FT_Memory  memory = face->memory;
+    FT_ULong*  buf;
 
 
-    if ( !metrics )
-      return FT_THROW( Invalid_Argument );
+    FT_MEM_ALLOC( buf, sizeof ( FT_ULong ) );
 
-    face = metrics->globals->face;
+    return (void*)buf;
+  }
 
-    *codepoint = FT_Get_Char_Index( face, charcode );
-    *y_offset  = 0;
 
-    return FT_Err_Ok;
+  void
+  af_shaper_buf_destroy( FT_Face  face,
+                         void*    buf )
+  {
+    FT_Memory  memory = face->memory;
+
+
+    FT_FREE( buf );
+  }
+
+
+  const char*
+  af_shaper_get_cluster( const char*      p,
+                         AF_StyleMetrics  metrics,
+                         void*            buf_,
+                         unsigned int*    count )
+  {
+    FT_Face    face      = metrics->globals->face;
+    FT_ULong   ch, dummy = 0;
+    FT_ULong*  buf       = (FT_ULong*)buf_;
+
+
+    while ( *p == ' ' )
+      p++;
+
+    GET_UTF8_CHAR( ch, p );
+
+    /* since we don't have an engine to handle clusters, */
+    /* we scan the characters but return zero            */
+    while ( !( *p == ' ' || *p == '\0' ) )
+      GET_UTF8_CHAR( dummy, p );
+
+    if ( dummy )
+    {
+      *buf   = 0;
+      *count = 0;
+    }
+    else
+    {
+      *buf   = FT_Get_Char_Index( face, ch );
+      *count = 1;
+    }
+
+    return p;
+  }
+
+
+  FT_ULong
+  af_shaper_get_elem( AF_StyleMetrics  metrics,
+                      void*            buf_,
+                      unsigned int     idx,
+                      FT_Long*         advance,
+                      FT_Long*         y_offset )
+  {
+    FT_Face   face        = metrics->globals->face;
+    FT_ULong  glyph_index = *(FT_ULong*)buf_;
+
+    FT_UNUSED( idx );
+
+
+    if ( advance )
+      FT_Get_Advance( face,
+                      glyph_index,
+                      FT_LOAD_NO_SCALE         |
+                      FT_LOAD_NO_HINTING       |
+                      FT_LOAD_IGNORE_TRANSFORM,
+                      advance );
+
+    if ( y_offset )
+      *y_offset = 0;
+
+    return glyph_index;
   }
 
 
diff --git a/src/autofit/afshaper.h b/src/autofit/afshaper.h
new file mode 100644
index 0000000..7efd9f6
--- /dev/null
+++ b/src/autofit/afshaper.h
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afshaper.h                                                             */
+/*                                                                         */
+/*    HarfBuzz interface for accessing OpenType features (specification).  */
+/*                                                                         */
+/*  Copyright 2013-2018 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 AFSHAPER_H_
+#define AFSHAPER_H_
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ
+
+#include <hb.h>
+#include <hb-ot.h>
+#include <hb-ft.h>
+
+#endif
+
+
+FT_BEGIN_HEADER
+
+  FT_Error
+  af_shaper_get_coverage( AF_FaceGlobals  globals,
+                          AF_StyleClass   style_class,
+                          FT_UShort*      gstyles,
+                          FT_Bool         default_script );
+
+
+  void*
+  af_shaper_buf_create( FT_Face  face );
+
+  void
+  af_shaper_buf_destroy( FT_Face  face,
+                         void*    buf );
+
+  const char*
+  af_shaper_get_cluster( const char*      p,
+                         AF_StyleMetrics  metrics,
+                         void*            buf_,
+                         unsigned int*    count );
+
+  FT_ULong
+  af_shaper_get_elem( AF_StyleMetrics  metrics,
+                      void*            buf_,
+                      unsigned int     idx,
+                      FT_Long*         x_advance,
+                      FT_Long*         y_offset );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* AFSHAPER_H_ */
+
+
+/* END */
diff --git a/src/autofit/afstyles.h b/src/autofit/afstyles.h
index bfd5bb9..e2688b3 100644
--- a/src/autofit/afstyles.h
+++ b/src/autofit/afstyles.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter styles (specification only).                             */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,7 +27,9 @@
   /* coverage.                                                     */
   /*                                                               */
   /* Note that styles using `AF_COVERAGE_DEFAULT' should always    */
-  /* come after styles with other coverages.                       */
+  /* come after styles with other coverages.  Also note that       */
+  /* fallback scripts only use `AF_COVERAGE_DEFAULT' for its       */
+  /* style.                                                        */
   /*                                                               */
   /* Example:                                                      */
   /*                                                               */
@@ -50,10 +52,10 @@
 #undef  META_STYLE_LATIN
 #define META_STYLE_LATIN( s, S, ds )                     \
           STYLE_LATIN( s, S, c2cp, C2CP, ds,             \
-                       "petite capticals from capitals", \
+                       "petite capitals from capitals", \
                        PETITE_CAPITALS_FROM_CAPITALS )   \
           STYLE_LATIN( s, S, c2sc, C2SC, ds,             \
-                       "small capticals from capitals",  \
+                       "small capitals from capitals",  \
                        SMALL_CAPITALS_FROM_CAPITALS )    \
           STYLE_LATIN( s, S, ordn, ORDN, ds,             \
                        "ordinals",                       \
@@ -81,6 +83,13 @@
                        DEFAULT )
 
 
+  STYLE( adlm_dflt, ADLM_DFLT,
+         "Adlam default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_ADLM,
+         AF_BLUE_STRINGSET_ADLM,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( arab_dflt, ARAB_DFLT,
          "Arabic default style",
          AF_WRITING_SYSTEM_LATIN,
@@ -88,23 +97,206 @@
          AF_BLUE_STRINGSET_ARAB,
          AF_COVERAGE_DEFAULT )
 
+  STYLE( armn_dflt, ARMN_DFLT,
+         "Armenian default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_ARMN,
+         AF_BLUE_STRINGSET_ARMN,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( avst_dflt, AVST_DFLT,
+         "Avestan default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_AVST,
+         AF_BLUE_STRINGSET_AVST,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( bamu_dflt, BAMU_DFLT,
+         "Bamum default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_BAMU,
+         AF_BLUE_STRINGSET_BAMU,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( beng_dflt, BENG_DFLT,
+         "Bengali default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_BENG,
+         AF_BLUE_STRINGSET_BENG,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( buhd_dflt, BUHD_DFLT,
+         "Buhid default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_BUHD,
+         AF_BLUE_STRINGSET_BUHD,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( cakm_dflt, CAKM_DFLT,
+         "Chakma default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_CAKM,
+         AF_BLUE_STRINGSET_CAKM,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( cans_dflt, CANS_DFLT,
+         "Canadian Syllabics default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_CANS,
+         AF_BLUE_STRINGSET_CANS,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( cari_dflt, CARI_DFLT,
+         "Carian default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_CARI,
+         AF_BLUE_STRINGSET_CARI,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( cher_dflt, CHER_DFLT,
+         "Cherokee default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_CHER,
+         AF_BLUE_STRINGSET_CHER,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( copt_dflt, COPT_DFLT,
+         "Coptic default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_COPT,
+         AF_BLUE_STRINGSET_COPT,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( cprt_dflt, CPRT_DFLT,
+         "Cypriot default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_CPRT,
+         AF_BLUE_STRINGSET_CPRT,
+         AF_COVERAGE_DEFAULT )
+
   META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" )
 
+  STYLE( deva_dflt, DEVA_DFLT,
+         "Devanagari default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_DEVA,
+         AF_BLUE_STRINGSET_DEVA,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( dsrt_dflt, DSRT_DFLT,
+         "Deseret default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_DSRT,
+         AF_BLUE_STRINGSET_DSRT,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( ethi_dflt, ETHI_DFLT,
+         "Ethiopic default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_ETHI,
+         AF_BLUE_STRINGSET_ETHI,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( geor_dflt, GEOR_DFLT,
+         "Georgian (Mkhedruli) default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GEOR,
+         AF_BLUE_STRINGSET_GEOR,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( geok_dflt, GEOK_DFLT,
+         "Georgian (Khutsuri) default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GEOK,
+         AF_BLUE_STRINGSET_GEOK,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( glag_dflt, GLAG_DFLT,
+         "Glagolitic default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GLAG,
+         AF_BLUE_STRINGSET_GLAG,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( goth_dflt, GOTH_DFLT,
+         "Gothic default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GOTH,
+         AF_BLUE_STRINGSET_GOTH,
+         AF_COVERAGE_DEFAULT )
+
   META_STYLE_LATIN( grek, GREK, "Greek" )
 
+  STYLE( gujr_dflt, GUJR_DFLT,
+         "Gujarati default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GUJR,
+         AF_BLUE_STRINGSET_GUJR,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( guru_dflt, GURU_DFLT,
+         "Gurmukhi default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_GURU,
+         AF_BLUE_STRINGSET_GURU,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( hebr_dflt, HEBR_DFLT,
          "Hebrew default style",
          AF_WRITING_SYSTEM_LATIN,
          AF_SCRIPT_HEBR,
          AF_BLUE_STRINGSET_HEBR,
          AF_COVERAGE_DEFAULT )
+
+  STYLE( kali_dflt, KALI_DFLT,
+         "Kayah Li default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_KALI,
+         AF_BLUE_STRINGSET_KALI,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( khmr_dflt, KHMR_DFLT,
+         "Khmer default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_KHMR,
+         AF_BLUE_STRINGSET_KHMR,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( khms_dflt, KHMS_DFLT,
+         "Khmer Symbols default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_KHMS,
+         AF_BLUE_STRINGSET_KHMS,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( knda_dflt, KNDA_DFLT,
+         "Kannada default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_KNDA,
+         AF_BLUE_STRINGSET_KNDA,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( lao_dflt, LAO_DFLT,
+         "Lao default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_LAO,
+         AF_BLUE_STRINGSET_LAO,
+         AF_COVERAGE_DEFAULT )
+
   META_STYLE_LATIN( latn, LATN, "Latin" )
 
-  STYLE( deva_dflt, DEVA_DFLT,
-         "Devanagari default style",
+  STYLE( latb_dflt, LATB_DFLT,
+         "Latin subscript fallback default style",
          AF_WRITING_SYSTEM_LATIN,
-         AF_SCRIPT_DEVA,
-         AF_BLUE_STRINGSET_DEVA,
+         AF_SCRIPT_LATB,
+         AF_BLUE_STRINGSET_LATB,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( latp_dflt, LATP_DFLT,
+         "Latin superscript fallback default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_LATP,
+         AF_BLUE_STRINGSET_LATP,
          AF_COVERAGE_DEFAULT )
 
 #ifdef FT_OPTION_AUTOFIT2
@@ -116,11 +308,109 @@
          AF_COVERAGE_DEFAULT )
 #endif
 
+  STYLE( lisu_dflt, LISU_DFLT,
+         "Lisu default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_LISU,
+         AF_BLUE_STRINGSET_LISU,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( mlym_dflt, MLYM_DFLT,
+         "Malayalam default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_MLYM,
+         AF_BLUE_STRINGSET_MLYM,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( mymr_dflt, MYMR_DFLT,
+         "Myanmar default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_MYMR,
+         AF_BLUE_STRINGSET_MYMR,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( nkoo_dflt, NKOO_DFLT,
+         "N'Ko default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_NKOO,
+         AF_BLUE_STRINGSET_NKOO,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( none_dflt, NONE_DFLT,
          "no style",
          AF_WRITING_SYSTEM_DUMMY,
          AF_SCRIPT_NONE,
-         (AF_Blue_Stringset)0,
+         AF_BLUE_STRINGSET_NONE,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( olck_dflt, OLCK_DFLT,
+         "Ol Chiki default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_OLCK,
+         AF_BLUE_STRINGSET_OLCK,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( orkh_dflt, ORKH_DFLT,
+         "Old Turkic default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_ORKH,
+         AF_BLUE_STRINGSET_ORKH,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( osge_dflt, OSGE_DFLT,
+         "Osage default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_OSGE,
+         AF_BLUE_STRINGSET_OSGE,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( osma_dflt, OSMA_DFLT,
+         "Osmanya default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_OSMA,
+         AF_BLUE_STRINGSET_OSMA,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( saur_dflt, SAUR_DFLT,
+         "Saurashtra default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_SAUR,
+         AF_BLUE_STRINGSET_SAUR,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( shaw_dflt, SHAW_DFLT,
+         "Shavian default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_SHAW,
+         AF_BLUE_STRINGSET_SHAW,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( sinh_dflt, SINH_DFLT,
+         "Sinhala default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_SINH,
+         AF_BLUE_STRINGSET_SINH,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( sund_dflt, SUND_DFLT,
+         "Sundanese default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_SUND,
+         AF_BLUE_STRINGSET_SUND,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( taml_dflt, TAML_DFLT,
+         "Tamil default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_TAML,
+         AF_BLUE_STRINGSET_TAML,
+         AF_COVERAGE_DEFAULT )
+
+  STYLE( tavt_dflt, TAVT_DFLT,
+         "Tai Viet default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_TAVT,
+         AF_BLUE_STRINGSET_TAVT,
          AF_COVERAGE_DEFAULT )
 
   STYLE( telu_dflt, TELU_DFLT,
@@ -130,6 +420,13 @@
          AF_BLUE_STRINGSET_TELU,
          AF_COVERAGE_DEFAULT )
 
+  STYLE( tfng_dflt, TFNG_DFLT,
+         "Tifinagh default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_TFNG,
+         AF_BLUE_STRINGSET_TFNG,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( thai_dflt, THAI_DFLT,
          "Thai default style",
          AF_WRITING_SYSTEM_LATIN,
@@ -137,6 +434,13 @@
          AF_BLUE_STRINGSET_THAI,
          AF_COVERAGE_DEFAULT )
 
+  STYLE( vaii_dflt, VAII_DFLT,
+         "Vai default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_VAII,
+         AF_BLUE_STRINGSET_VAII,
+         AF_COVERAGE_DEFAULT )
+
 #ifdef AF_CONFIG_OPTION_INDIC
 
   /* no blue stringset support for the Indic writing system yet */
@@ -149,17 +453,9 @@
                  (AF_Blue_Stringset)0,    \
                  AF_COVERAGE_DEFAULT )
 
-  STYLE_DEFAULT_INDIC( beng, BENG, "Bengali" )
-  STYLE_DEFAULT_INDIC( gujr, GUJR, "Gujarati" )
-  STYLE_DEFAULT_INDIC( guru, GURU, "Gurmukhi" )
-  STYLE_DEFAULT_INDIC( knda, KNDA, "Kannada" )
   STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" )
-  STYLE_DEFAULT_INDIC( mlym, MLYM, "Malayalam" )
   STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" )
-  STYLE_DEFAULT_INDIC( sinh, SINH, "Sinhala" )
-  STYLE_DEFAULT_INDIC( sund, SUND, "Sundanese" )
   STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" )
-  STYLE_DEFAULT_INDIC( taml, TAML, "Tamil" )
   STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" )
 
 #endif /* AF_CONFIG_OPTION_INDIC */
diff --git a/src/autofit/aftypes.h b/src/autofit/aftypes.h
index 78e3fd7..6bd8c89 100644
--- a/src/autofit/aftypes.h
+++ b/src/autofit/aftypes.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter types (specification only).                              */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,15 +22,15 @@
    *  Its main feature is the ability to differentiate between different
    *  writing systems and scripts in order to apply specific rules.
    *
-   *  The code has also been compartmentized into several entities that
+   *  The code has also been compartmentalized into several entities that
    *  should make algorithmic experimentation easier than with the old
    *  code.
    *
    *************************************************************************/
 
 
-#ifndef __AFTYPES_H__
-#define __AFTYPES_H__
+#ifndef AFTYPES_H_
+#define AFTYPES_H_
 
 #include <ft2build.h>
 
@@ -41,6 +41,10 @@
 
 #include "afblue.h"
 
+#ifdef FT_DEBUG_AUTOFIT
+#include FT_CONFIG_STANDARD_LIBRARY_H
+#endif
+
 
 FT_BEGIN_HEADER
 
@@ -54,8 +58,6 @@
 
 #ifdef FT_DEBUG_AUTOFIT
 
-#include FT_CONFIG_STANDARD_LIBRARY_H
-
 extern int    _af_debug_disable_horz_hints;
 extern int    _af_debug_disable_vert_hints;
 extern int    _af_debug_disable_blue_hints;
@@ -74,9 +76,9 @@
 
   typedef struct  AF_WidthRec_
   {
-    FT_Pos  org;  /* original position/width in font units              */
-    FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
-    FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
+    FT_Pos  org;  /* original position/width in font units             */
+    FT_Pos  cur;  /* current/scaled position/width in device subpixels */
+    FT_Pos  fit;  /* current/fitted position/width in device subpixels */
 
   } AF_WidthRec, *AF_Width;
 
@@ -209,13 +211,19 @@
   typedef void
   (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics  metrics );
 
+  typedef void
+  (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics  metrics,
+                                        FT_Pos*          stdHW,
+                                        FT_Pos*          stdVW );
+
 
   typedef FT_Error
   (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints    hints,
                                      AF_StyleMetrics  metrics );
 
-  typedef void
-  (*AF_WritingSystem_ApplyHintsFunc)( AF_GlyphHints    hints,
+  typedef FT_Error
+  (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt          glyph_index,
+                                      AF_GlyphHints    hints,
                                       FT_Outline*      outline,
                                       AF_StyleMetrics  metrics );
 
@@ -247,7 +255,7 @@
    *    outline according to the results of the glyph analyzer.
    */
 
-#define __AFWRTSYS_H__  /* don't load header files */
+#define AFWRTSYS_H_  /* don't load header files */
 #undef  WRITING_SYSTEM
 #define WRITING_SYSTEM( ws, WS )    \
           AF_WRITING_SYSTEM_ ## WS,
@@ -262,7 +270,7 @@
 
   } AF_WritingSystem;
 
-#undef  __AFWRTSYS_H__
+#undef  AFWRTSYS_H_
 
 
   typedef struct  AF_WritingSystemClassRec_
@@ -273,6 +281,7 @@
     AF_WritingSystem_InitMetricsFunc   style_metrics_init;
     AF_WritingSystem_ScaleMetricsFunc  style_metrics_scale;
     AF_WritingSystem_DoneMetricsFunc   style_metrics_done;
+    AF_WritingSystem_GetStdWidthsFunc  style_metrics_getstdw;
 
     AF_WritingSystem_InitHintsFunc     style_hints_init;
     AF_WritingSystem_ApplyHintsFunc    style_hints_apply;
@@ -291,15 +300,16 @@
   /*************************************************************************/
 
   /*
-   *  Each script is associated with a set of Unicode ranges that gets used
-   *  to test whether the font face supports the script.
+   *  Each script is associated with two sets of Unicode ranges to test
+   *  whether the font face supports the script, and which non-base
+   *  characters the script contains.
    *
    *  We use four-letter script tags from the OpenType specification,
    *  extended by `NONE', which indicates `no script'.
    */
 
 #undef  SCRIPT
-#define SCRIPT( s, S, d, h, sc1, sc2, sc3 ) \
+#define SCRIPT( s, S, d, h, H, ss ) \
           AF_SCRIPT_ ## S,
 
   /* The list of known scripts. */
@@ -329,11 +339,13 @@
   {
     AF_Script  script;
 
-    AF_Script_UniRange  script_uni_ranges; /* last must be { 0, 0 }        */
+    /* last element in the ranges must be { 0, 0 } */
+    AF_Script_UniRange  script_uni_ranges;
+    AF_Script_UniRange  script_uni_nonbase_ranges;
 
-    FT_UInt32  standard_char1;             /* for default width and height */
-    FT_UInt32  standard_char2;             /* ditto                        */
-    FT_UInt32  standard_char3;             /* ditto                        */
+    FT_Bool  top_to_bottom_hinting;
+
+    const char*  standard_charstring;      /* for default width and height */
 
   } AF_ScriptClassRec;
 
@@ -469,6 +481,10 @@
   } AF_StyleMetricsRec;
 
 
+#define AF_HINTING_BOTTOM_TO_TOP  0
+#define AF_HINTING_TOP_TO_BOTTOM  1
+
+
   /* Declare and define vtables for classes */
 #ifndef FT_CONFIG_OPTION_PIC
 
@@ -483,6 +499,7 @@
           m_init,                                        \
           m_scale,                                       \
           m_done,                                        \
+          m_stdw,                                        \
           h_init,                                        \
           h_apply )                                      \
   FT_CALLBACK_TABLE_DEF                                  \
@@ -495,6 +512,7 @@
     m_init,                                              \
     m_scale,                                             \
     m_done,                                              \
+    m_stdw,                                              \
                                                          \
     h_init,                                              \
     h_apply                                              \
@@ -509,17 +527,17 @@
           script_class,                   \
           script,                         \
           ranges,                         \
-          std_char1,                      \
-          std_char2,                      \
-          std_char3 )                     \
+          nonbase_ranges,                 \
+          top_to_bottom,                  \
+          std_charstring )                \
   FT_CALLBACK_TABLE_DEF                   \
   const AF_ScriptClassRec  script_class = \
   {                                       \
     script,                               \
     ranges,                               \
-    std_char1,                            \
-    std_char2,                            \
-    std_char3                             \
+    nonbase_ranges,                       \
+    top_to_bottom,                        \
+    std_charstring,                       \
   };
 
 
@@ -557,21 +575,23 @@
           m_init,                                                         \
           m_scale,                                                        \
           m_done,                                                         \
+          m_stdw,                                                         \
           h_init,                                                         \
           h_apply )                                                       \
   FT_LOCAL_DEF( void )                                                    \
   FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec*  ac ) \
   {                                                                       \
-    ac->writing_system      = system;                                     \
+    ac->writing_system        = system;                                   \
                                                                           \
-    ac->style_metrics_size  = m_size;                                     \
+    ac->style_metrics_size    = m_size;                                   \
                                                                           \
-    ac->style_metrics_init  = m_init;                                     \
-    ac->style_metrics_scale = m_scale;                                    \
-    ac->style_metrics_done  = m_done;                                     \
+    ac->style_metrics_init    = m_init;                                   \
+    ac->style_metrics_scale   = m_scale;                                  \
+    ac->style_metrics_done    = m_done;                                   \
+    ac->style_metrics_getstdw = m_stdw;                                   \
                                                                           \
-    ac->style_hints_init    = h_init;                                     \
-    ac->style_hints_apply   = h_apply;                                    \
+    ac->style_hints_init      = h_init;                                   \
+    ac->style_hints_apply     = h_apply;                                  \
   }
 
 
@@ -583,17 +603,17 @@
           script_class,                                    \
           script_,                                         \
           ranges,                                          \
-          std_char1,                                       \
-          std_char2,                                       \
-          std_char3 )                                      \
+          nonbase_ranges,                                  \
+          top_to_bottom,                                   \
+          std_charstring )                                 \
   FT_LOCAL_DEF( void )                                     \
   FT_Init_Class_ ## script_class( AF_ScriptClassRec*  ac ) \
   {                                                        \
-    ac->script            = script_;                       \
-    ac->script_uni_ranges = ranges;                        \
-    ac->standard_char1    = std_char1;                     \
-    ac->standard_char2    = std_char2;                     \
-    ac->standard_char3    = std_char3;                     \
+    ac->script                    = script_;               \
+    ac->script_uni_ranges         = ranges;                \
+    ac->script_uni_nonbase_ranges = nonbase_ranges;        \
+    ac->top_to_bottom_hinting     = top_to_bottom;         \
+    ac->standard_charstring       = std_charstring;        \
   }
 
 
@@ -625,7 +645,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFTYPES_H__ */
+#endif /* AFTYPES_H_ */
 
 
 /* END */
diff --git a/src/autofit/afwarp.c b/src/autofit/afwarp.c
index 59af4f0..2a75ea7 100644
--- a/src/autofit/afwarp.c
+++ b/src/autofit/afwarp.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter warping algorithm (body).                                */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -98,7 +98,6 @@
       if ( xx1min + w < warper->x2min )
         xx1min = warper->x2min - w;
 
-      xx1max = warper->x1max;
       if ( xx1max + w > warper->x2max )
         xx1max = warper->x2max - w;
 
@@ -193,7 +192,7 @@
 
     warper->best_scale   = org_scale;
     warper->best_delta   = org_delta;
-    warper->best_score   = INT_MIN;
+    warper->best_score   = FT_INT_MIN;
     warper->best_distort = 0;
 
     axis         = &hints->axis[dim];
diff --git a/src/autofit/afwarp.h b/src/autofit/afwarp.h
index 5a6208a..520b1be 100644
--- a/src/autofit/afwarp.h
+++ b/src/autofit/afwarp.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter warping algorithm (specification).                       */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFWARP_H__
-#define __AFWARP_H__
+#ifndef AFWARP_H_
+#define AFWARP_H_
 
 #include "afhints.h"
 
@@ -25,7 +25,7 @@
 
 #define AF_WARPER_SCALE
 
-#define AF_WARPER_FLOOR( x )  ( (x) & ~TYPEOF( x )63 )
+#define AF_WARPER_FLOOR( x )  ( (x) & ~FT_TYPEOF( x )63 )
 #define AF_WARPER_CEIL( x )   AF_WARPER_FLOOR( (x) + 63 )
 
 
@@ -58,7 +58,7 @@
 FT_END_HEADER
 
 
-#endif /* __AFWARP_H__ */
+#endif /* AFWARP_H_ */
 
 
 /* END */
diff --git a/src/autofit/afwrtsys.h b/src/autofit/afwrtsys.h
index 4aa89d2..4675f32 100644
--- a/src/autofit/afwrtsys.h
+++ b/src/autofit/afwrtsys.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter writing systems (specification only).                    */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFWRTSYS_H__
-#define __AFWRTSYS_H__
+#ifndef AFWRTSYS_H_
+#define AFWRTSYS_H_
 
   /* Since preprocessor directives can't create other preprocessor */
   /* directives, we have to include the header files manually.     */
@@ -30,7 +30,7 @@
 #include "aflatin2.h"
 #endif
 
-#endif /* __AFWRTSYS_H__ */
+#endif /* AFWRTSYS_H_ */
 
 
   /* The following part can be included multiple times. */
diff --git a/src/autofit/autofit.c b/src/autofit/autofit.c
index b6ed4a0..c160516 100644
--- a/src/autofit/autofit.c
+++ b/src/autofit/autofit.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module (body).                                           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,29 +18,22 @@
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
-#include "afpic.c"
+
 #include "afangles.c"
 #include "afblue.c"
+#include "afcjk.c"
+#include "afdummy.c"
 #include "afglobal.c"
 #include "afhints.c"
-
-#include "afranges.c"
-
-#include "afdummy.c"
-#include "aflatin.c"
-#ifdef FT_OPTION_AUTOFIT2
-#include "aflatin2.c"
-#endif
-#include "afcjk.c"
 #include "afindic.c"
-
-#include "hbshim.c"
-
+#include "aflatin.c"
+#include "aflatin2.c"
 #include "afloader.c"
 #include "afmodule.c"
-
-#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afpic.c"
+#include "afranges.c"
+#include "afshaper.c"
 #include "afwarp.c"
-#endif
+
 
 /* END */
diff --git a/src/autofit/module.mk b/src/autofit/module.mk
index 3321438..ff05f83 100644
--- a/src/autofit/module.mk
+++ b/src/autofit/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/autofit/rules.mk b/src/autofit/rules.mk
index 6ef959f..75171b4 100644
--- a/src/autofit/rules.mk
+++ b/src/autofit/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2015 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -40,8 +40,8 @@
                  $(AUTOF_DIR)/afmodule.c \
                  $(AUTOF_DIR)/afpic.c    \
                  $(AUTOF_DIR)/afranges.c \
-                 $(AUTOF_DIR)/afwarp.c   \
-                 $(AUTOF_DIR)/hbshim.c
+                 $(AUTOF_DIR)/afshaper.c \
+                 $(AUTOF_DIR)/afwarp.c
 
 # AUTOF driver headers
 #
diff --git a/src/base/Jamfile b/src/base/Jamfile
index ce8114d..4994c1b 100644
--- a/src/base/Jamfile
+++ b/src/base/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/base Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -17,10 +17,23 @@
 
   if $(FT2_MULTI)
   {
-    _sources = ftadvanc ftcalc   ftdbgmem ftgloadr
-               ftobjs   ftoutln  ftrfork  ftsnames
-               ftstream fttrigon ftutil
-               basepic  ftpic
+    _sources = basepic
+               ftadvanc
+               ftcalc
+               ftdbgmem
+               ftfntfmt
+               ftgloadr
+               fthash
+               ftlcdfil
+               ftobjs
+               ftoutln
+               ftpic
+               ftpsprop
+               ftrfork
+               ftsnames
+               ftstream
+               fttrigon
+               ftutil
                ;
   }
   else
@@ -34,13 +47,29 @@
 # Add the optional/replaceable files.
 #
 {
-  local  _sources = bbox   bdf    bitmap debug  gasp
-                    glyph  gxval  init   lcdfil mm
-                    otval  pfr    stroke synth  system
-                    type1  winfnt xf86   patent
+  local  _sources = ftapi
+                    ftbbox
+                    ftbdf
+                    ftbitmap
+                    ftcid
+                    ftdebug
+                    ftfstype
+                    ftgasp
+                    ftglyph
+                    ftgxval
+                    ftinit
+                    ftmm
+                    ftotval
+                    ftpatent
+                    ftpfr
+                    ftstroke
+                    ftsynth
+                    ftsystem
+                    fttype1
+                    ftwinfnt
                     ;
 
-  Library  $(FT2_LIB) : ft$(_sources).c ;
+  Library  $(FT2_LIB) : $(_sources).c ;
 }
 
 # Add Macintosh-specific file to the library when necessary.
diff --git a/src/base/basepic.c b/src/base/basepic.c
index 9850ed9..bc80406 100644
--- a/src/base/basepic.c
+++ b/src/base/basepic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for base.            */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/basepic.h b/src/base/basepic.h
index 51ecf9e..492d1ed 100644
--- a/src/base/basepic.h
+++ b/src/base/basepic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for base.            */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,14 +16,13 @@
 /***************************************************************************/
 
 
-#ifndef __BASEPIC_H__
-#define __BASEPIC_H__
+#ifndef BASEPIC_H_
+#define BASEPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
+
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define FT_OUTLINE_GLYPH_CLASS_GET  &ft_outline_glyph_class
@@ -43,6 +42,8 @@
 #endif
 
 
+FT_BEGIN_HEADER
+
   typedef struct  BasePIC_
   {
     FT_Module_Class**  default_module_classes;
@@ -78,13 +79,13 @@
   FT_Error
   ft_base_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
   /* */
 
-FT_END_HEADER
-
-#endif /* __BASEPIC_H__ */
+#endif /* BASEPIC_H_ */
 
 
 /* END */
diff --git a/src/base/ftadvanc.c b/src/base/ftadvanc.c
index f12908f..230c84d 100644
--- a/src/base/ftadvanc.c
+++ b/src/base/ftadvanc.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Quick computation of advance widths (body).                          */
 /*                                                                         */
-/*  Copyright 2008-2015 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -36,7 +36,7 @@
     if ( flags & FT_LOAD_NO_SCALE )
       return FT_Err_Ok;
 
-    if ( face->size == NULL )
+    if ( !face->size )
       return FT_THROW( Invalid_Size_Handle );
 
     if ( flags & FT_LOAD_VERTICAL_LAYOUT )
@@ -60,8 +60,11 @@
    /*  - unscaled load                                             */
    /*  - unhinted load                                             */
    /*  - light-hinted load                                         */
+   /*  - if a variations font, it must have an `HVAR' or `VVAR'    */
+   /*    table (thus the old MM or GX fonts don't qualify; this    */
+   /*    gets checked by the driver-specific functions)            */
 
-#define LOAD_ADVANCE_FAST_CHECK( flags )                            \
+#define LOAD_ADVANCE_FAST_CHECK( face, flags )                      \
           ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \
             FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
 
@@ -87,7 +90,7 @@
       return FT_THROW( Invalid_Glyph_Index );
 
     func = face->driver->clazz->get_advances;
-    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
     {
       FT_Error  error;
 
@@ -113,9 +116,12 @@
                    FT_Int32   flags,
                    FT_Fixed  *padvances )
   {
+    FT_Error  error = FT_Err_Ok;
+
     FT_Face_GetAdvancesFunc  func;
-    FT_UInt                  num, end, nn;
-    FT_Error                 error = FT_Err_Ok;
+
+    FT_UInt  num, end, nn;
+    FT_Int   factor;
 
 
     if ( !face )
@@ -133,7 +139,7 @@
       return FT_Err_Ok;
 
     func = face->driver->clazz->get_advances;
-    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
     {
       error = func( face, start, count, flags, padvances );
       if ( !error )
@@ -149,16 +155,17 @@
       return FT_THROW( Unimplemented_Feature );
 
     flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+    factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024;
     for ( nn = 0; nn < count; nn++ )
     {
       error = FT_Load_Glyph( face, start + nn, flags );
       if ( error )
         break;
 
-      /* scale from 26.6 to 16.16 */
+      /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
       padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                      ? face->glyph->advance.y << 10
-                      : face->glyph->advance.x << 10;
+                      ? face->glyph->advance.y * factor
+                      : face->glyph->advance.x * factor;
     }
 
     return error;
diff --git a/src/base/ftapi.c b/src/base/ftapi.c
index f22a181..32d6e95 100644
--- a/src/base/ftapi.c
+++ b/src/base/ftapi.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType compatibility functions (body).                         */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -38,7 +38,7 @@
   /*************************************************************************/
   /*************************************************************************/
 
-  /* backwards compatibility API */
+  /* backward compatibility API */
 
   FT_BASE_DEF( void )
   FT_New_Memory_Stream( FT_Library  library,
diff --git a/src/base/ftbase.c b/src/base/ftbase.c
index 253dfb7..f914b9b 100644
--- a/src/base/ftbase.c
+++ b/src/base/ftbase.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Single object library component (body only).                         */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,25 +17,26 @@
 
 
 #include <ft2build.h>
-
 #define  FT_MAKE_OPTION_SINGLE_OBJECT
 
-#include "ftpic.c"
 #include "basepic.c"
 #include "ftadvanc.c"
 #include "ftcalc.c"
 #include "ftdbgmem.c"
+#include "ftfntfmt.c"
 #include "ftgloadr.c"
+#include "fthash.c"
+#include "ftlcdfil.c"
+#include "ftmac.c"
 #include "ftobjs.c"
 #include "ftoutln.c"
+#include "ftpic.c"
+#include "ftpsprop.c"
 #include "ftrfork.c"
 #include "ftsnames.c"
 #include "ftstream.c"
 #include "fttrigon.c"
 #include "ftutil.c"
 
-#ifdef FT_MACINTOSH
-#include "ftmac.c"
-#endif
 
 /* END */
diff --git a/src/base/ftbase.h b/src/base/ftbase.h
index cb57f96..7e8cfad 100644
--- a/src/base/ftbase.h
+++ b/src/base/ftbase.h
@@ -2,9 +2,9 @@
 /*                                                                         */
 /*  ftbase.h                                                               */
 /*                                                                         */
-/*    The FreeType private functions used in base module (specification).  */
+/*    Private functions used in the `base' module (specification).         */
 /*                                                                         */
-/*  Copyright 2008-2015 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTBASE_H__
-#define __FTBASE_H__
+#ifndef FTBASE_H_
+#define FTBASE_H_
 
 
 #include <ft2build.h>
@@ -27,6 +27,13 @@
 FT_BEGIN_HEADER
 
 
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
+  /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */
+  /* see https://support.microsoft.com/en-us/kb/130437                */
+#define FT_MAC_RFORK_MAX_LEN  0x00FFFFFFUL
+
+
   /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */
   /* font, and try to load a face specified by the face_index.            */
   FT_LOCAL( FT_Error )
@@ -60,10 +67,12 @@
   ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );
 #endif
 
+#endif /* FT_CONFIG_OPTION_MAC_FONTS */
+
 
 FT_END_HEADER
 
-#endif /* __FTBASE_H__ */
+#endif /* FTBASE_H_ */
 
 
 /* END */
diff --git a/src/base/ftbbox.c b/src/base/ftbbox.c
index 10df98d..151e85c 100644
--- a/src/base/ftbbox.c
+++ b/src/base/ftbbox.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType bbox computation (body).                                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -423,12 +423,15 @@
   }
 
 
-  FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
-    (FT_Outline_MoveTo_Func) BBox_Move_To,
-    (FT_Outline_LineTo_Func) BBox_Line_To,
-    (FT_Outline_ConicTo_Func)BBox_Conic_To,
-    (FT_Outline_CubicTo_Func)BBox_Cubic_To,
-    0, 0
+  FT_DEFINE_OUTLINE_FUNCS(
+    bbox_interface,
+
+    (FT_Outline_MoveTo_Func) BBox_Move_To,   /* move_to  */
+    (FT_Outline_LineTo_Func) BBox_Line_To,   /* line_to  */
+    (FT_Outline_ConicTo_Func)BBox_Conic_To,  /* conic_to */
+    (FT_Outline_CubicTo_Func)BBox_Cubic_To,  /* cubic_to */
+    0,                                       /* shift    */
+    0                                        /* delta    */
   )
 
 
@@ -457,6 +460,7 @@
     {
       abbox->xMin = abbox->xMax = 0;
       abbox->yMin = abbox->yMax = 0;
+
       return 0;
     }
 
@@ -468,10 +472,10 @@
 
     for ( n = 0; n < outline->n_points; n++ )
     {
-      FT_UPDATE_BBOX( vec, cbox);
+      FT_UPDATE_BBOX( vec, cbox );
 
       if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
-        FT_UPDATE_BBOX( vec, bbox);
+        FT_UPDATE_BBOX( vec, bbox );
 
       vec++;
     }
@@ -487,8 +491,10 @@
       TBBox_Rec  user;
 
 #ifdef FT_CONFIG_OPTION_PIC
-      FT_Outline_Funcs bbox_interface;
-      Init_Class_bbox_interface(&bbox_interface);
+      FT_Outline_Funcs  bbox_interface;
+
+
+      Init_Class_bbox_interface( &bbox_interface );
 #endif
 
       user.bbox = bbox;
diff --git a/src/base/ftbdf.c b/src/base/ftbdf.c
index aa72ddc..c4ea502 100644
--- a/src/base/ftbdf.c
+++ b/src/base/ftbdf.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing BDF-specific strings (body).              */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftbitmap.c b/src/base/ftbitmap.c
index a54572a..a974666 100644
--- a/src/base/ftbitmap.c
+++ b/src/base/ftbitmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility functions for bitmaps (body).                       */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -76,7 +76,7 @@
     source_pitch_sign = source->pitch < 0 ? -1 : 1;
     target_pitch_sign = target->pitch < 0 ? -1 : 1;
 
-    if ( source->buffer == NULL )
+    if ( !source->buffer )
     {
       *target = *source;
       if ( source_pitch_sign != target_pitch_sign )
@@ -153,38 +153,36 @@
                            FT_UInt     ypixels )
   {
     FT_Error        error;
-    int             pitch;
-    int             new_pitch;
+    unsigned int    pitch;
+    unsigned int    new_pitch;
     FT_UInt         bpp;
-    FT_UInt         i, width, height;
+    FT_UInt         width, height;
     unsigned char*  buffer = NULL;
 
 
     width  = bitmap->width;
     height = bitmap->rows;
-    pitch  = bitmap->pitch;
-    if ( pitch < 0 )
-      pitch = -pitch;
+    pitch  = (unsigned int)FT_ABS( bitmap->pitch );
 
     switch ( bitmap->pixel_mode )
     {
     case FT_PIXEL_MODE_MONO:
       bpp       = 1;
-      new_pitch = (int)( ( width + xpixels + 7 ) >> 3 );
+      new_pitch = ( width + xpixels + 7 ) >> 3;
       break;
     case FT_PIXEL_MODE_GRAY2:
       bpp       = 2;
-      new_pitch = (int)( ( width + xpixels + 3 ) >> 2 );
+      new_pitch = ( width + xpixels + 3 ) >> 2;
       break;
     case FT_PIXEL_MODE_GRAY4:
       bpp       = 4;
-      new_pitch = (int)( ( width + xpixels + 1 ) >> 1 );
+      new_pitch = ( width + xpixels + 1 ) >> 1;
       break;
     case FT_PIXEL_MODE_GRAY:
     case FT_PIXEL_MODE_LCD:
     case FT_PIXEL_MODE_LCD_V:
       bpp       = 8;
-      new_pitch = (int)( width + xpixels );
+      new_pitch = width + xpixels;
       break;
     default:
       return FT_THROW( Invalid_Glyph_Format );
@@ -194,7 +192,7 @@
     if ( ypixels == 0 && new_pitch <= pitch )
     {
       /* zero the padding */
-      FT_UInt  bit_width = (FT_UInt)pitch * 8;
+      FT_UInt  bit_width = pitch * 8;
       FT_UInt  bit_last  = ( width + xpixels ) * bpp;
 
 
@@ -226,7 +224,7 @@
     }
 
     /* otherwise allocate new buffer */
-    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+    if ( FT_QALLOC_MULT( buffer, bitmap->rows + ypixels, new_pitch ) )
       return error;
 
     /* new rows get added at the top of the bitmap, */
@@ -235,31 +233,60 @@
     {
       FT_UInt  len = ( width * bpp + 7 ) >> 3;
 
+      unsigned char*  in  = bitmap->buffer;
+      unsigned char*  out = buffer;
 
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * ( ypixels + i ),
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
+      unsigned char*  limit = bitmap->buffer + pitch * bitmap->rows;
+      unsigned int    delta = new_pitch - len;
+
+
+      FT_MEM_ZERO( out, new_pitch * ypixels );
+      out += new_pitch * ypixels;
+
+      while ( in < limit )
+      {
+        FT_MEM_COPY( out, in, len );
+        in  += pitch;
+        out += len;
+
+        /* we use FT_QALLOC_MULT, which doesn't zero out the buffer;      */
+        /* consequently, we have to manually zero out the remaining bytes */
+        FT_MEM_ZERO( out, delta );
+        out += delta;
+      }
     }
     else
     {
       FT_UInt  len = ( width * bpp + 7 ) >> 3;
 
+      unsigned char*  in  = bitmap->buffer;
+      unsigned char*  out = buffer;
 
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * i,
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
+      unsigned char*  limit = bitmap->buffer + pitch * bitmap->rows;
+      unsigned int    delta = new_pitch - len;
+
+
+      while ( in < limit )
+      {
+        FT_MEM_COPY( out, in, len );
+        in  += pitch;
+        out += len;
+
+        FT_MEM_ZERO( out, delta );
+        out += delta;
+      }
+
+      FT_MEM_ZERO( out, new_pitch * ypixels );
     }
 
     FT_FREE( bitmap->buffer );
     bitmap->buffer = buffer;
 
-    if ( bitmap->pitch < 0 )
-      new_pitch = -new_pitch;
-
     /* set pitch only, width and height are left untouched */
-    bitmap->pitch = new_pitch;
+    if ( bitmap->pitch < 0 )
+      bitmap->pitch = -(int)new_pitch;
+    else
+      bitmap->pitch = (int)new_pitch;
 
     return FT_Err_Ok;
   }
@@ -351,7 +378,7 @@
     }
 
     /* for each row */
-    for ( y = 0; y < bitmap->rows ; y++ )
+    for ( y = 0; y < bitmap->rows; y++ )
     {
       /*
        * Horizontally:
@@ -444,7 +471,7 @@
      * A gamma of 2.2 is fair to assume.  And then, we need to
      * undo the premultiplication too.
      *
-     *   http://accessibility.kde.org/hsl-adjusted.php
+     *   https://accessibility.kde.org/hsl-adjusted.php
      *
      * We do the computation with integers only, applying a gamma of 2.0.
      * We guarantee 32-bit arithmetic to avoid overflow but the resulting
@@ -534,8 +561,7 @@
              (FT_ULong)target->rows > FT_ULONG_MAX / (FT_ULong)target_pitch )
           return FT_THROW( Invalid_Argument );
 
-        if ( target->rows * (FT_ULong)target_pitch > old_size              &&
-             FT_QREALLOC( target->buffer,
+        if ( FT_QREALLOC( target->buffer,
                           old_size, target->rows * (FT_UInt)target_pitch ) )
           return error;
 
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
index dca0e1d..f4ff45f 100644
--- a/src/base/ftcalc.c
+++ b/src/base/ftcalc.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Arithmetic computations (body).                                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -68,14 +68,15 @@
 #define FT_COMPONENT  trace_calc
 
 
-  /* transfer sign leaving a positive number */
-#define FT_MOVE_SIGN( x, s ) \
-  FT_BEGIN_STMNT             \
-    if ( x < 0 )             \
-    {                        \
-      x = -x;                \
-      s = -s;                \
-    }                        \
+  /* transfer sign, leaving a positive number;                        */
+  /* we need an unsigned value to safely negate INT_MIN (or LONG_MIN) */
+#define FT_MOVE_SIGN( x, x_unsigned, s ) \
+  FT_BEGIN_STMNT                         \
+    if ( x < 0 )                         \
+    {                                    \
+      x_unsigned = 0U - (x_unsigned);    \
+      s          = -s;                   \
+    }                                    \
   FT_END_STMNT
 
   /* The following three functions are available regardless of whether */
@@ -86,8 +87,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_RoundFix( FT_Fixed  a )
   {
-    return a >= 0 ?   ( a + 0x8000L ) & ~0xFFFFL
-                  : -((-a + 0x8000L ) & ~0xFFFFL );
+    return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL;
   }
 
 
@@ -96,8 +96,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_CeilFix( FT_Fixed  a )
   {
-    return a >= 0 ?   ( a + 0xFFFFL ) & ~0xFFFFL
-                  : -((-a + 0xFFFFL ) & ~0xFFFFL );
+    return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL;
   }
 
 
@@ -106,8 +105,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_FloorFix( FT_Fixed  a )
   {
-    return a >= 0 ?   a & ~0xFFFFL
-                  : -((-a) & ~0xFFFFL );
+    return a & ~0xFFFFL;
   }
 
 #ifndef FT_MSB
@@ -182,20 +180,20 @@
     FT_Long    d_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
     c = (FT_UInt64)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     d = c > 0 ? ( a * b + ( c >> 1 ) ) / c
               : 0x7FFFFFFFUL;
 
     d_ = (FT_Long)d;
 
-    return s < 0 ? -d_ : d_;
+    return s < 0 ? NEG_LONG( d_ ) : d_;
   }
 
 
@@ -211,20 +209,20 @@
     FT_Long    d_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
     c = (FT_UInt64)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     d = c > 0 ? a * b / c
               : 0x7FFFFFFFUL;
 
     d_ = (FT_Long)d;
 
-    return s < 0 ? -d_ : d_;
+    return s < 0 ? NEG_LONG( d_ ) : d_;
   }
 
 
@@ -236,26 +234,14 @@
   {
 #ifdef FT_MULFIX_ASSEMBLER
 
-    return FT_MULFIX_ASSEMBLER( a_, b_ );
+    return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ );
 
 #else
 
-    FT_Int     s = 1;
-    FT_UInt64  a, b, c;
-    FT_Long    c_;
+    FT_Int64  ab = (FT_Int64)a_ * (FT_Int64)b_;
 
-
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
-    a = (FT_UInt64)a_;
-    b = (FT_UInt64)b_;
-
-    c = ( a * b + 0x8000UL ) >> 16;
-
-    c_ = (FT_Long)c;
-
-    return s < 0 ? -c_ : c_;
+    /* this requires arithmetic right shift of signed numbers */
+    return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 );
 
 #endif /* FT_MULFIX_ASSEMBLER */
   }
@@ -272,18 +258,18 @@
     FT_Long    q_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b
               : 0x7FFFFFFFUL;
 
     q_ = (FT_Long)q;
 
-    return s < 0 ? -q_ : q_;
+    return s < 0 ? NEG_LONG( q_ ) : q_;
   }
 
 
@@ -437,17 +423,14 @@
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    if ( a_ == 0 || b_ == c_ )
-      return a_;
-
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
     c = (FT_UInt32)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     if ( c == 0 )
       a = 0x7FFFFFFFUL;
 
@@ -467,13 +450,13 @@
       FT_Add64( &temp, &temp2, &temp );
 
       /* last attempt to ditch long division */
-      a = temp.hi == 0 ? temp.lo / c
-                       : ft_div64by32( temp.hi, temp.lo, c );
+      a = ( temp.hi == 0 ) ? temp.lo / c
+                           : ft_div64by32( temp.hi, temp.lo, c );
     }
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
   }
 
 
@@ -488,17 +471,14 @@
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    if ( a_ == 0 || b_ == c_ )
-      return a_;
-
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
     c = (FT_UInt32)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     if ( c == 0 )
       a = 0x7FFFFFFFUL;
 
@@ -513,13 +493,13 @@
       ft_multo64( a, b, &temp );
 
       /* last attempt to ditch long division */
-      a = temp.hi == 0 ? temp.lo / c
-                       : ft_div64by32( temp.hi, temp.lo, c );
+      a = ( temp.hi == 0 ) ? temp.lo / c
+                           : ft_div64by32( temp.hi, temp.lo, c );
     }
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
   }
 
 
@@ -546,9 +526,6 @@
     FT_UInt32  a, b;
 
 
-    if ( a_ == 0 || b_ == 0x10000L )
-      return a_;
-
     /*
      *  This is a clever way of converting a signed number `a' into its
      *  absolute value (stored back into `a') and its sign.  The sign is
@@ -599,15 +576,12 @@
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    if ( a_ == 0 || b_ == 0x10000L )
-      return a_;
-
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     if ( a + ( b >> 8 ) <= 8190UL )
       a = ( a * b + 0x8000UL ) >> 16;
     else
@@ -621,7 +595,7 @@
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
 
 #endif /* 0 */
 
@@ -641,12 +615,12 @@
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     if ( b == 0 )
     {
       /* check for division by 0 */
@@ -674,7 +648,7 @@
 
     q_ = (FT_Long)q;
 
-    return s < 0 ? -q_ : q_;
+    return s < 0 ? NEG_LONG( q_ ) : q_;
   }
 
 
@@ -693,13 +667,19 @@
     if ( !a || !b )
       return;
 
-    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );
-    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );
-    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );
-    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );
+    xx = ADD_LONG( FT_MulFix( a->xx, b->xx ),
+                   FT_MulFix( a->xy, b->yx ) );
+    xy = ADD_LONG( FT_MulFix( a->xx, b->xy ),
+                   FT_MulFix( a->xy, b->yy ) );
+    yx = ADD_LONG( FT_MulFix( a->yx, b->xx ),
+                   FT_MulFix( a->yy, b->yx ) );
+    yy = ADD_LONG( FT_MulFix( a->yx, b->xy ),
+                   FT_MulFix( a->yy, b->yy ) );
 
-    b->xx = xx;  b->xy = xy;
-    b->yx = yx;  b->yy = yy;
+    b->xx = xx;
+    b->xy = xy;
+    b->yx = yx;
+    b->yy = yy;
   }
 
 
@@ -749,13 +729,19 @@
     if ( !a || !b )
       return;
 
-    xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );
-    xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );
-    yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );
-    yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );
+    xx = ADD_LONG( FT_MulDiv( a->xx, b->xx, val ),
+                   FT_MulDiv( a->xy, b->yx, val ) );
+    xy = ADD_LONG( FT_MulDiv( a->xx, b->xy, val ),
+                   FT_MulDiv( a->xy, b->yy, val ) );
+    yx = ADD_LONG( FT_MulDiv( a->yx, b->xx, val ),
+                   FT_MulDiv( a->yy, b->yx, val ) );
+    yy = ADD_LONG( FT_MulDiv( a->yx, b->xy, val ),
+                   FT_MulDiv( a->yy, b->yy, val ) );
 
-    b->xx = xx;  b->xy = xy;
-    b->yx = yx;  b->yy = yy;
+    b->xx = xx;
+    b->xy = xy;
+    b->yx = yx;
+    b->yy = yy;
   }
 
 
@@ -774,17 +760,112 @@
     if ( !vector || !matrix )
       return;
 
-    xz = FT_MulDiv( vector->x, matrix->xx, val ) +
-         FT_MulDiv( vector->y, matrix->xy, val );
-
-    yz = FT_MulDiv( vector->x, matrix->yx, val ) +
-         FT_MulDiv( vector->y, matrix->yy, val );
+    xz = ADD_LONG( FT_MulDiv( vector->x, matrix->xx, val ),
+                   FT_MulDiv( vector->y, matrix->xy, val ) );
+    yz = ADD_LONG( FT_MulDiv( vector->x, matrix->yx, val ),
+                   FT_MulDiv( vector->y, matrix->yy, val ) );
 
     vector->x = xz;
     vector->y = yz;
   }
 
 
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_UInt32 )
+  FT_Vector_NormLen( FT_Vector*  vector )
+  {
+    FT_Int32   x_ = vector->x;
+    FT_Int32   y_ = vector->y;
+    FT_Int32   b, z;
+    FT_UInt32  x, y, u, v, l;
+    FT_Int     sx = 1, sy = 1, shift;
+
+
+    x = (FT_UInt32)x_;
+    y = (FT_UInt32)y_;
+
+    FT_MOVE_SIGN( x_, x, sx );
+    FT_MOVE_SIGN( y_, y, sy );
+
+    /* trivial cases */
+    if ( x == 0 )
+    {
+      if ( y > 0 )
+        vector->y = sy * 0x10000;
+      return y;
+    }
+    else if ( y == 0 )
+    {
+      if ( x > 0 )
+        vector->x = sx * 0x10000;
+      return x;
+    }
+
+    /* Estimate length and prenormalize by shifting so that */
+    /* the new approximate length is between 2/3 and 4/3.   */
+    /* The magic constant 0xAAAAAAAAUL (2/3 of 2^32) helps  */
+    /* achieve this in 16.16 fixed-point representation.    */
+    l = x > y ? x + ( y >> 1 )
+              : y + ( x >> 1 );
+
+    shift  = 31 - FT_MSB( l );
+    shift -= 15 + ( l >= ( 0xAAAAAAAAUL >> shift ) );
+
+    if ( shift > 0 )
+    {
+      x <<= shift;
+      y <<= shift;
+
+      /* re-estimate length for tiny vectors */
+      l = x > y ? x + ( y >> 1 )
+                : y + ( x >> 1 );
+    }
+    else
+    {
+      x >>= -shift;
+      y >>= -shift;
+      l >>= -shift;
+    }
+
+    /* lower linear approximation for reciprocal length minus one */
+    b = 0x10000 - (FT_Int32)l;
+
+    x_ = (FT_Int32)x;
+    y_ = (FT_Int32)y;
+
+    /* Newton's iterations */
+    do
+    {
+      u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) );
+      v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) );
+
+      /* Normalized squared length in the parentheses approaches 2^32. */
+      /* On two's complement systems, converting to signed gives the   */
+      /* difference with 2^32 even if the expression wraps around.     */
+      z = -(FT_Int32)( u * u + v * v ) / 0x200;
+      z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000;
+
+      b += z;
+
+    } while ( z > 0 );
+
+    vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u;
+    vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v;
+
+    /* Conversion to signed helps to recover from likely wrap around */
+    /* in calculating the prenormalized length, because it gives the */
+    /* correct difference with 2^32 on two's complement systems.     */
+    l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 );
+    if ( shift > 0 )
+      l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift;
+    else
+      l <<= -shift;
+
+    return l;
+  }
+
+
 #if 0
 
   /* documentation is in ftcalc.h */
@@ -832,52 +913,36 @@
                          FT_Pos  out_x,
                          FT_Pos  out_y )
   {
-    FT_Long  result; /* avoid overflow on 16-bit system */
-
-
-    /* deal with the trivial cases quickly */
-    if ( in_y == 0 )
-    {
-      if ( in_x >= 0 )
-        result = out_y;
-      else
-        result = -out_y;
-    }
-    else if ( in_x == 0 )
-    {
-      if ( in_y >= 0 )
-        result = -out_x;
-      else
-        result = out_x;
-    }
-    else if ( out_y == 0 )
-    {
-      if ( out_x >= 0 )
-        result = in_y;
-      else
-        result = -in_y;
-    }
-    else if ( out_x == 0 )
-    {
-      if ( out_y >= 0 )
-        result = -in_x;
-      else
-        result =  in_x;
-    }
-    else /* general case */
-    {
 #ifdef FT_LONG64
 
-      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+    FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
 
 
-      if ( delta == 0 )
-        result = 0;
-      else
-        result = 1 - 2 * ( delta < 0 );
+    return ( delta > 0 ) - ( delta < 0 );
 
 #else
 
+    FT_Int  result;
+
+
+    /* we silently ignore overflow errors, since such large values */
+    /* lead to even more (harmless) rendering errors later on      */
+    if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L &&
+         ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L )
+    {
+      FT_Long  z1 = MUL_LONG( in_x, out_y );
+      FT_Long  z2 = MUL_LONG( in_y, out_x );
+
+
+      if ( z1 > z2 )
+        result = +1;
+      else if ( z1 < z2 )
+        result = -1;
+      else
+        result = 0;
+    }
+    else /* products might overflow 32 bits */
+    {
       FT_Int64  z1, z2;
 
 
@@ -895,12 +960,12 @@
         result = -1;
       else
         result = 0;
-
-#endif
     }
 
     /* XXX: only the sign of return value, +1/0/-1 must be used */
-    return (FT_Int)result;
+    return result;
+
+#endif
   }
 
 
diff --git a/src/base/ftcid.c b/src/base/ftcid.c
index 0734881..f518464 100644
--- a/src/base/ftcid.c
+++ b/src/base/ftcid.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing CID font information.                     */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Derek Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftdbgmem.c b/src/base/ftdbgmem.c
index 6f20313..c33d8ac 100644
--- a/src/base/ftdbgmem.c
+++ b/src/base/ftdbgmem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Memory debugger (body).                                              */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -268,7 +268,7 @@
                       ft_mem_table_alloc(
                         table,
                         new_size * (FT_Long)sizeof ( FT_MemNode ) );
-      if ( new_buckets == NULL )
+      if ( !new_buckets )
         return;
 
       FT_ARRAY_ZERO( new_buckets, new_size );
@@ -309,7 +309,7 @@
 
 
     table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
-    if ( table == NULL )
+    if ( !table )
       goto Exit;
 
     FT_ZERO( table );
@@ -367,7 +367,8 @@
         {
           printf(
             "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
-            node->address, node->size,
+            (void*)node->address,
+            node->size,
             FT_FILENAME( node->source->file_name ),
             node->source->line_no );
 
@@ -462,10 +463,10 @@
               (FT_UInt32)( 5 * _ft_debug_lineno );
     pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
 
-    for ( ;; )
+    for (;;)
     {
       node = *pnode;
-      if ( node == NULL )
+      if ( !node )
         break;
 
       if ( node->file_name == _ft_debug_file   &&
@@ -476,7 +477,7 @@
     }
 
     node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
-    if ( node == NULL )
+    if ( !node )
       ft_mem_debug_panic(
         "not enough memory to perform memory debugging\n" );
 
@@ -544,7 +545,7 @@
 
       /* we need to create a new node in this table */
       node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
-      if ( node == NULL )
+      if ( !node )
         ft_mem_debug_panic( "not enough memory to run memory tests" );
 
       node->address = address;
@@ -716,7 +717,7 @@
     FT_MemTable  table = (FT_MemTable)memory->user;
 
 
-    if ( block == NULL )
+    if ( !block )
       ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
                           FT_FILENAME( _ft_debug_file ),
                           _ft_debug_lineno );
@@ -754,7 +755,7 @@
 
     /* the following is valid according to ANSI C */
 #if 0
-    if ( block == NULL || cur_size == 0 )
+    if ( !block || !cur_size )
       ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
                           file_name, line_no );
 #endif
@@ -798,7 +799,7 @@
       return NULL;
 
     new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size );
-    if ( new_block == NULL )
+    if ( !new_block )
       return NULL;
 
     ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
@@ -825,7 +826,7 @@
     FT_Int       result = 0;
 
 
-    if ( getenv( "FT2_DEBUG_MEMORY" ) )
+    if ( ft_getenv( "FT2_DEBUG_MEMORY" ) )
     {
       table = ft_mem_table_new( memory );
       if ( table )
@@ -838,10 +839,10 @@
         memory->realloc = ft_mem_debug_realloc;
         memory->free    = ft_mem_debug_free;
 
-        p = getenv( "FT2_ALLOC_TOTAL_MAX" );
-        if ( p != NULL )
+        p = ft_getenv( "FT2_ALLOC_TOTAL_MAX" );
+        if ( p )
         {
-          FT_Long   total_max = ft_atol( p );
+          FT_Long  total_max = ft_strtol( p, NULL, 10 );
 
 
           if ( total_max > 0 )
@@ -851,10 +852,10 @@
           }
         }
 
-        p = getenv( "FT2_ALLOC_COUNT_MAX" );
-        if ( p != NULL )
+        p = ft_getenv( "FT2_ALLOC_COUNT_MAX" );
+        if ( p )
         {
-          FT_Long  total_count = ft_atol( p );
+          FT_Long  total_count = ft_strtol( p, NULL, 10 );
 
 
           if ( total_count > 0 )
@@ -864,10 +865,10 @@
           }
         }
 
-        p = getenv( "FT2_KEEP_ALIVE" );
-        if ( p != NULL )
+        p = ft_getenv( "FT2_KEEP_ALIVE" );
+        if ( p )
         {
-          FT_Long  keep_alive = ft_atol( p );
+          FT_Long  keep_alive = ft_strtol( p, NULL, 10 );
 
 
           if ( keep_alive > 0 )
diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c
index 2cdb7c2..fe26309 100644
--- a/src/base/ftdebug.c
+++ b/src/base/ftdebug.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component (body).                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -152,8 +152,8 @@
   /* the memory and stream components which are set to 7 and 5,            */
   /* respectively.                                                         */
   /*                                                                       */
-  /* See the file <include/internal/fttrace.h> for details of the          */
-  /* available toggle names.                                               */
+  /* See the file `include/freetype/internal/fttrace.h' for details of     */
+  /* the available toggle names.                                           */
   /*                                                                       */
   /* The level must be between 0 and 7; 0 means quiet (except for serious  */
   /* runtime errors), and 7 means _very_ verbose.                          */
@@ -161,7 +161,7 @@
   FT_BASE_DEF( void )
   ft_debug_init( void )
   {
-    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+    const char*  ft2_debug = ft_getenv( "FT2_DEBUG" );
 
 
     if ( ft2_debug )
diff --git a/src/base/ftfntfmt.c b/src/base/ftfntfmt.c
index 98e7431..a2900ce 100644
--- a/src/base/ftfntfmt.c
+++ b/src/base/ftfntfmt.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for font formats (body).                       */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftfstype.c b/src/base/ftfstype.c
index cd3458f..e6cdf6e 100644
--- a/src/base/ftfstype.c
+++ b/src/base/ftfstype.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file to access FSType data (body).                  */
 /*                                                                         */
-/*  Copyright 2008-2015 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftgasp.c b/src/base/ftgasp.c
index bbd257c..4f80bba 100644
--- a/src/base/ftgasp.c
+++ b/src/base/ftgasp.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Access of TrueType's `gasp' table (body).                            */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftgloadr.c b/src/base/ftgloadr.c
index 7e28638..4720249 100644
--- a/src/base/ftgloadr.c
+++ b/src/base/ftgloadr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph loader (body).                                    */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c
index cb7fc37..6759aa2 100644
--- a/src/base/ftglyph.c
+++ b/src/base/ftglyph.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType convenience functions to handle glyphs (body).              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -125,23 +125,25 @@
     FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;
 
 
-    cbox->xMin = glyph->left << 6;
-    cbox->xMax = cbox->xMin + (FT_Pos)( glyph->bitmap.width << 6 );
-    cbox->yMax = glyph->top << 6;
-    cbox->yMin = cbox->yMax - (FT_Pos)( glyph->bitmap.rows << 6 );
+    cbox->xMin = glyph->left * 64;
+    cbox->xMax = cbox->xMin + (FT_Pos)( glyph->bitmap.width * 64 );
+    cbox->yMax = glyph->top * 64;
+    cbox->yMin = cbox->yMax - (FT_Pos)( glyph->bitmap.rows * 64 );
   }
 
 
-  FT_DEFINE_GLYPH(ft_bitmap_glyph_class,
+  FT_DEFINE_GLYPH(
+    ft_bitmap_glyph_class,
+
     sizeof ( FT_BitmapGlyphRec ),
     FT_GLYPH_FORMAT_BITMAP,
 
-    ft_bitmap_glyph_init,
-    ft_bitmap_glyph_done,
-    ft_bitmap_glyph_copy,
-    0,                          /* FT_Glyph_TransformFunc */
-    ft_bitmap_glyph_bbox,
-    0                           /* FT_Glyph_PrepareFunc   */
+    ft_bitmap_glyph_init,    /* FT_Glyph_InitFunc       glyph_init      */
+    ft_bitmap_glyph_done,    /* FT_Glyph_DoneFunc       glyph_done      */
+    ft_bitmap_glyph_copy,    /* FT_Glyph_CopyFunc       glyph_copy      */
+    NULL,                    /* FT_Glyph_TransformFunc  glyph_transform */
+    ft_bitmap_glyph_bbox,    /* FT_Glyph_GetBBoxFunc    glyph_bbox      */
+    NULL                     /* FT_Glyph_PrepareFunc    glyph_prepare   */
   )
 
 
@@ -260,16 +262,18 @@
   }
 
 
-  FT_DEFINE_GLYPH( ft_outline_glyph_class,
+  FT_DEFINE_GLYPH(
+    ft_outline_glyph_class,
+
     sizeof ( FT_OutlineGlyphRec ),
     FT_GLYPH_FORMAT_OUTLINE,
 
-    ft_outline_glyph_init,
-    ft_outline_glyph_done,
-    ft_outline_glyph_copy,
-    ft_outline_glyph_transform,
-    ft_outline_glyph_bbox,
-    ft_outline_glyph_prepare
+    ft_outline_glyph_init,      /* FT_Glyph_InitFunc       glyph_init      */
+    ft_outline_glyph_done,      /* FT_Glyph_DoneFunc       glyph_done      */
+    ft_outline_glyph_copy,      /* FT_Glyph_CopyFunc       glyph_copy      */
+    ft_outline_glyph_transform, /* FT_Glyph_TransformFunc  glyph_transform */
+    ft_outline_glyph_bbox,      /* FT_Glyph_GetBBoxFunc    glyph_bbox      */
+    ft_outline_glyph_prepare    /* FT_Glyph_PrepareFunc    glyph_prepare   */
   )
 
 
@@ -403,13 +407,29 @@
     if ( error )
       goto Exit;
 
-    /* copy advance while converting it to 16.16 format */
-    glyph->advance.x = slot->advance.x << 10;
-    glyph->advance.y = slot->advance.y << 10;
+    /* copy advance while converting 26.6 to 16.16 format */
+    if ( slot->advance.x >=  0x8000L * 64 ||
+         slot->advance.x <= -0x8000L * 64 )
+    {
+      FT_ERROR(( "FT_Get_Glyph: advance width too large\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit2;
+    }
+    if ( slot->advance.y >=  0x8000L * 64 ||
+         slot->advance.y <= -0x8000L * 64 )
+    {
+      FT_ERROR(( "FT_Get_Glyph: advance height too large\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit2;
+    }
+
+    glyph->advance.x = slot->advance.x * 1024;
+    glyph->advance.y = slot->advance.y * 1024;
 
     /* now import the image from the glyph slot */
     error = clazz->glyph_init( glyph, slot );
 
+  Exit2:
     /* if an error occurred, destroy the glyph */
     if ( error )
       FT_Done_Glyph( glyph );
@@ -542,8 +562,8 @@
     /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
     /* then calling FT_Render_Glyph_Internal()                            */
 
-    FT_MEM_ZERO( &dummy, sizeof ( dummy ) );
-    FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );
+    FT_ZERO( &dummy );
+    FT_ZERO( &dummy_internal );
     dummy.internal = &dummy_internal;
     dummy.library  = library;
     dummy.format   = clazz->glyph_format;
diff --git a/src/base/ftgxval.c b/src/base/ftgxval.c
index 58868f2..19e2d6a 100644
--- a/src/base/ftgxval.c
+++ b/src/base/ftgxval.c
@@ -2,9 +2,9 @@
 /*                                                                         */
 /*  ftgxval.c                                                              */
 /*                                                                         */
-/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */
+/*    FreeType API for validating TrueTypeGX/AAT tables (body).            */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K,                                           */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/base/fthash.c b/src/base/fthash.c
new file mode 100644
index 0000000..21bc8dd
--- /dev/null
+++ b/src/base/fthash.c
@@ -0,0 +1,339 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fthash.c                                                               */
+/*                                                                         */
+/*    Hashing functions (body).                                            */
+/*                                                                         */
+/***************************************************************************/
+
+/*
+ * Copyright 2000 Computing Research Labs, New Mexico State University
+ * Copyright 2001-2015
+ *   Francesco Zappa Nardelli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50     */
+  /*                                                                       */
+  /*  taken from Mark Leisher's xmbdfed package                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_HASH_H
+#include FT_INTERNAL_MEMORY_H
+
+
+#define INITIAL_HT_SIZE  241
+
+
+  static FT_ULong
+  hash_str_lookup( FT_Hashkey*  key )
+  {
+    const char*  kp  = key->str;
+    FT_ULong     res = 0;
+
+
+    /* Mocklisp hash function. */
+    while ( *kp )
+      res = ( res << 5 ) - res + (FT_ULong)*kp++;
+
+    return res;
+  }
+
+
+  static FT_ULong
+  hash_num_lookup( FT_Hashkey*  key )
+  {
+    FT_ULong  num = (FT_ULong)key->num;
+    FT_ULong  res;
+
+
+    /* Mocklisp hash function. */
+    res = num & 0xFF;
+    res = ( res << 5 ) - res + ( ( num >>  8 ) & 0xFF );
+    res = ( res << 5 ) - res + ( ( num >> 16 ) & 0xFF );
+    res = ( res << 5 ) - res + ( ( num >> 24 ) & 0xFF );
+
+    return res;
+  }
+
+
+  static FT_Bool
+  hash_str_compare( FT_Hashkey*  a,
+                    FT_Hashkey*  b )
+  {
+    if ( a->str[0] == b->str[0]           &&
+         ft_strcmp( a->str, b->str ) == 0 )
+      return 1;
+
+    return 0;
+  }
+
+
+  static FT_Bool
+  hash_num_compare( FT_Hashkey*  a,
+                    FT_Hashkey*  b )
+  {
+    if ( a->num == b->num )
+      return 1;
+
+    return 0;
+  }
+
+
+  static FT_Hashnode*
+  hash_bucket( FT_Hashkey  key,
+               FT_Hash     hash )
+  {
+    FT_ULong      res = 0;
+    FT_Hashnode*  bp  = hash->table;
+    FT_Hashnode*  ndp;
+
+
+    res = (hash->lookup)( &key );
+
+    ndp = bp + ( res % hash->size );
+    while ( *ndp )
+    {
+      if ( (hash->compare)( &(*ndp)->key, &key ) )
+        break;
+
+      ndp--;
+      if ( ndp < bp )
+        ndp = bp + ( hash->size - 1 );
+    }
+
+    return ndp;
+  }
+
+
+  static FT_Error
+  hash_rehash( FT_Hash    hash,
+               FT_Memory  memory )
+  {
+    FT_Hashnode*  obp = hash->table;
+    FT_Hashnode*  bp;
+    FT_Hashnode*  nbp;
+
+    FT_UInt   i, sz = hash->size;
+    FT_Error  error = FT_Err_Ok;
+
+
+    hash->size <<= 1;
+    hash->limit  = hash->size / 3;
+
+    if ( FT_NEW_ARRAY( hash->table, hash->size ) )
+      goto Exit;
+
+    for ( i = 0, bp = obp; i < sz; i++, bp++ )
+    {
+      if ( *bp )
+      {
+        nbp = hash_bucket( (*bp)->key, hash );
+        *nbp = *bp;
+      }
+    }
+
+    FT_FREE( obp );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  hash_init( FT_Hash    hash,
+             FT_Bool    is_num,
+             FT_Memory  memory )
+  {
+    FT_UInt   sz = INITIAL_HT_SIZE;
+    FT_Error  error;
+
+
+    hash->size  = sz;
+    hash->limit = sz / 3;
+    hash->used  = 0;
+
+    if ( is_num )
+    {
+      hash->lookup  = hash_num_lookup;
+      hash->compare = hash_num_compare;
+    }
+    else
+    {
+      hash->lookup  = hash_str_lookup;
+      hash->compare = hash_str_compare;
+    }
+
+    FT_MEM_NEW_ARRAY( hash->table, sz );
+
+    return error;
+  }
+
+
+  FT_Error
+  ft_hash_str_init( FT_Hash    hash,
+                    FT_Memory  memory )
+  {
+    return hash_init( hash, 0, memory );
+  }
+
+
+  FT_Error
+  ft_hash_num_init( FT_Hash    hash,
+                    FT_Memory  memory )
+  {
+    return hash_init( hash, 1, memory );
+  }
+
+
+  void
+  ft_hash_str_free( FT_Hash    hash,
+                    FT_Memory  memory )
+  {
+    if ( hash )
+    {
+      FT_UInt       sz = hash->size;
+      FT_Hashnode*  bp = hash->table;
+      FT_UInt       i;
+
+
+      for ( i = 0; i < sz; i++, bp++ )
+        FT_FREE( *bp );
+
+      FT_FREE( hash->table );
+    }
+  }
+
+
+  /* `ft_hash_num_free' is the same as `ft_hash_str_free' */
+
+
+  static FT_Error
+  hash_insert( FT_Hashkey  key,
+               size_t      data,
+               FT_Hash     hash,
+               FT_Memory   memory )
+  {
+    FT_Hashnode   nn;
+    FT_Hashnode*  bp    = hash_bucket( key, hash );
+    FT_Error      error = FT_Err_Ok;
+
+
+    nn = *bp;
+    if ( !nn )
+    {
+      if ( FT_NEW( nn ) )
+        goto Exit;
+      *bp = nn;
+
+      nn->key  = key;
+      nn->data = data;
+
+      if ( hash->used >= hash->limit )
+      {
+        error = hash_rehash( hash, memory );
+        if ( error )
+          goto Exit;
+      }
+
+      hash->used++;
+    }
+    else
+      nn->data = data;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_Error
+  ft_hash_str_insert( const char*  key,
+                      size_t       data,
+                      FT_Hash      hash,
+                      FT_Memory    memory )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.str = key;
+
+    return hash_insert( hk, data, hash, memory );
+  }
+
+
+  FT_Error
+  ft_hash_num_insert( FT_Int     num,
+                      size_t     data,
+                      FT_Hash    hash,
+                      FT_Memory  memory )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.num = num;
+
+    return hash_insert( hk, data, hash, memory );
+  }
+
+
+  static size_t*
+  hash_lookup( FT_Hashkey  key,
+               FT_Hash     hash )
+  {
+    FT_Hashnode*  np = hash_bucket( key, hash );
+
+
+    return (*np) ? &(*np)->data
+                 : NULL;
+  }
+
+
+  size_t*
+  ft_hash_str_lookup( const char*  key,
+                      FT_Hash      hash )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.str = key;
+
+    return hash_lookup( hk, hash );
+  }
+
+
+  size_t*
+  ft_hash_num_lookup( FT_Int   num,
+                      FT_Hash  hash )
+  {
+    FT_Hashkey  hk;
+
+
+    hk.num = num;
+
+    return hash_lookup( hk, hash );
+  }
+
+
+/* END */
diff --git a/src/base/ftinit.c b/src/base/ftinit.c
index cc95e6a..1fa4721 100644
--- a/src/base/ftinit.c
+++ b/src/base/ftinit.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType initialization layer (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,8 +23,8 @@
   /*  FT_Add_Default_Modules():                                            */
   /*     This function is used to add the set of default modules to a      */
   /*     fresh new library object.  The set is taken from the header file  */
-  /*     `config/ftmodule.h'.  See the document `FreeType 2.0 Build        */
-  /*     System' for more information.                                     */
+  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */
+  /*     Build System' for more information.                               */
   /*                                                                       */
   /*  FT_Init_FreeType():                                                  */
   /*     This function creates a system object for the current platform,   */
@@ -226,6 +226,94 @@
   }
 
 
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+
+#define MAX_LENGTH  128
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Default_Properties( FT_Library  library )
+  {
+    const char*  env;
+    const char*  p;
+    const char*  q;
+
+    char  module_name[MAX_LENGTH + 1];
+    char  property_name[MAX_LENGTH + 1];
+    char  property_value[MAX_LENGTH + 1];
+
+    int  i;
+
+
+    env = ft_getenv( "FREETYPE_PROPERTIES" );
+    if ( !env )
+      return;
+
+    for ( p = env; *p; p++ )
+    {
+      /* skip leading whitespace and separators */
+      if ( *p == ' ' || *p == '\t' )
+        continue;
+
+      /* read module name, followed by `:' */
+      q = p;
+      for ( i = 0; i < MAX_LENGTH; i++ )
+      {
+        if ( !*p || *p == ':' )
+          break;
+        module_name[i] = *p++;
+      }
+      module_name[i] = '\0';
+
+      if ( !*p || *p != ':' || p == q )
+        break;
+
+      /* read property name, followed by `=' */
+      q = ++p;
+      for ( i = 0; i < MAX_LENGTH; i++ )
+      {
+        if ( !*p || *p == '=' )
+          break;
+        property_name[i] = *p++;
+      }
+      property_name[i] = '\0';
+
+      if ( !*p || *p != '=' || p == q )
+        break;
+
+      /* read property value, followed by whitespace (if any) */
+      q = ++p;
+      for ( i = 0; i < MAX_LENGTH; i++ )
+      {
+        if ( !*p || *p == ' ' || *p == '\t' )
+          break;
+        property_value[i] = *p++;
+      }
+      property_value[i] = '\0';
+
+      if ( !( *p == '\0' || *p == ' ' || *p == '\t' ) || p == q )
+        break;
+
+      /* we completely ignore errors */
+      ft_property_string_set( library,
+                              module_name,
+                              property_name,
+                              property_value );
+    }
+  }
+
+#else
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Default_Properties( FT_Library  library )
+  {
+    FT_UNUSED( library );
+  }
+
+#endif
+
+
   /* documentation is in freetype.h */
 
   FT_EXPORT_DEF( FT_Error )
@@ -256,6 +344,8 @@
     else
       FT_Add_Default_Modules( *alibrary );
 
+    FT_Set_Default_Properties( *alibrary );
+
     return error;
   }
 
diff --git a/src/base/ftlcdfil.c b/src/base/ftlcdfil.c
index ff6f7e9..8d314df 100644
--- a/src/base/ftlcdfil.c
+++ b/src/base/ftlcdfil.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,142 +29,140 @@
 /* define USE_LEGACY to implement the legacy filter */
 #define  USE_LEGACY
 
-  /* FIR filter used by the default and light filters */
-  static void
-  _ft_lcd_filter_fir( FT_Bitmap*      bitmap,
-                      FT_Render_Mode  mode,
-                      FT_Library      library )
-  {
-    FT_Byte*  weights = library->lcd_weights;
-    FT_UInt   width   = (FT_UInt)bitmap->width;
-    FT_UInt   height  = (FT_UInt)bitmap->rows;
+#define FT_SHIFTCLAMP( x )  ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
 
 
+  /* add padding according to filter weights */
+  FT_BASE_DEF (void)
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot )
+  {
+    FT_Byte*                 lcd_weights;
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;
+
+
+    /* Per-face LCD filtering takes priority if set up. */
+    if ( slot->face && slot->face->internal->lcd_filter_func )
+    {
+      lcd_weights     = slot->face->internal->lcd_weights;
+      lcd_filter_func = slot->face->internal->lcd_filter_func;
+    }
+    else
+    {
+      lcd_weights     = slot->library->lcd_weights;
+      lcd_filter_func = slot->library->lcd_filter_func;
+    }
+
+    if ( lcd_filter_func == ft_lcd_filter_fir )
+    {
+      *Min -= lcd_weights[0] ? 43 :
+              lcd_weights[1] ? 22 : 0;
+      *Max += lcd_weights[4] ? 43 :
+              lcd_weights[3] ? 22 : 0;
+    }
+  }
+
+
+  /* FIR filter used by the default and light filters */
+  FT_BASE_DEF( void )
+  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
+                     FT_Render_Mode       mode,
+                     FT_LcdFiveTapFilter  weights )
+  {
+    FT_UInt   width  = (FT_UInt)bitmap->width;
+    FT_UInt   height = (FT_UInt)bitmap->rows;
+    FT_Int    pitch  = bitmap->pitch;
+    FT_Byte*  origin = bitmap->buffer;
+
+
+    /* take care of bitmap flow */
+    if ( pitch > 0 && height > 0 )
+      origin += pitch * (FT_Int)( height - 1 );
+
     /* horizontal in-place FIR filter */
-    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+    if ( mode == FT_RENDER_MODE_LCD && width >= 2 )
     {
-      FT_Byte*  line = bitmap->buffer;
+      FT_Byte*  line = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
+      /* `fir' must be at least 32 bit wide, since the sum of */
+      /* the values in `weights' can exceed 0xFF              */
 
-      /* `fir' and `pix' must be at least 32 bit wide, since the sum of */
-      /* the values in `weights' can exceed 0xFF                        */
-
-      for ( ; height > 0; height--, line += bitmap->pitch )
+      for ( ; height > 0; height--, line -= pitch )
       {
-        FT_UInt  fir[4];        /* below, `pix' is used as the 5th element */
-        FT_UInt  val1, xx;
+        FT_UInt  fir[5];
+        FT_UInt  val, xx;
 
 
-        val1   = line[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
+        val    = line[0];
+        fir[2] = weights[2] * val;
+        fir[3] = weights[3] * val;
+        fir[4] = weights[4] * val;
 
-        val1    = line[1];
-        fir[0] += weights[1] * val1;
-        fir[1] += weights[2] * val1;
-        fir[2] += weights[3] * val1;
-        fir[3] += weights[4] * val1;
+        val    = line[1];
+        fir[1] = fir[2] + weights[1] * val;
+        fir[2] = fir[3] + weights[2] * val;
+        fir[3] = fir[4] + weights[3] * val;
+        fir[4] =          weights[4] * val;
 
         for ( xx = 2; xx < width; xx++ )
         {
-          FT_UInt  val, pix;
-
-
           val    = line[xx];
-          pix    = fir[0] + weights[0] * val;
-          fir[0] = fir[1] + weights[1] * val;
-          fir[1] = fir[2] + weights[2] * val;
-          fir[2] = fir[3] + weights[3] * val;
-          fir[3] =          weights[4] * val;
+          fir[0] = fir[1] + weights[0] * val;
+          fir[1] = fir[2] + weights[1] * val;
+          fir[2] = fir[3] + weights[2] * val;
+          fir[3] = fir[4] + weights[3] * val;
+          fir[4] =          weights[4] * val;
 
-          pix        >>= 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 2] = (FT_Byte)pix;
+          line[xx - 2] = FT_SHIFTCLAMP( fir[0] );
         }
 
-        {
-          FT_UInt  pix;
-
-
-          pix          = fir[0] >> 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 2] = (FT_Byte)pix;
-
-          pix          = fir[1] >> 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 1] = (FT_Byte)pix;
-        }
+        line[xx - 2] = FT_SHIFTCLAMP( fir[1] );
+        line[xx - 1] = FT_SHIFTCLAMP( fir[2] );
       }
     }
 
     /* vertical in-place FIR filter */
-    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 2 )
     {
-      FT_Byte*  column = bitmap->buffer;
-      FT_Int    pitch  = bitmap->pitch;
+      FT_Byte*  column = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
       for ( ; width > 0; width--, column++ )
       {
         FT_Byte*  col = column;
-        FT_UInt   fir[4];       /* below, `pix' is used as the 5th element */
-        FT_UInt   val1, yy;
+        FT_UInt   fir[5];
+        FT_UInt   val, yy;
 
 
-        val1   = col[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
-        col   += pitch;
+        val    = col[0];
+        fir[2] = weights[2] * val;
+        fir[3] = weights[3] * val;
+        fir[4] = weights[4] * val;
+        col   -= pitch;
 
-        val1    = col[0];
-        fir[0] += weights[1] * val1;
-        fir[1] += weights[2] * val1;
-        fir[2] += weights[3] * val1;
-        fir[3] += weights[4] * val1;
-        col    += pitch;
+        val    = col[0];
+        fir[1] = fir[2] + weights[1] * val;
+        fir[2] = fir[3] + weights[2] * val;
+        fir[3] = fir[4] + weights[3] * val;
+        fir[4] =          weights[4] * val;
+        col   -= pitch;
 
-        for ( yy = 2; yy < height; yy++ )
+        for ( yy = 2; yy < height; yy++, col -= pitch )
         {
-          FT_UInt  val, pix;
-
-
           val    = col[0];
-          pix    = fir[0] + weights[0] * val;
-          fir[0] = fir[1] + weights[1] * val;
-          fir[1] = fir[2] + weights[2] * val;
-          fir[2] = fir[3] + weights[3] * val;
-          fir[3] =          weights[4] * val;
+          fir[0] = fir[1] + weights[0] * val;
+          fir[1] = fir[2] + weights[1] * val;
+          fir[2] = fir[3] + weights[2] * val;
+          fir[3] = fir[4] + weights[3] * val;
+          fir[4] =          weights[4] * val;
 
-          pix           >>= 8;
-          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-2 * pitch] = (FT_Byte)pix;
-          col            += pitch;
+          col[pitch * 2]  = FT_SHIFTCLAMP( fir[0] );
         }
 
-        {
-          FT_UInt  pix;
-
-
-          pix             = fir[0] >> 8;
-          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-2 * pitch] = (FT_Byte)pix;
-
-          pix         = fir[1] >> 8;
-          pix        |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-pitch] = (FT_Byte)pix;
-        }
+        col[pitch * 2]  = FT_SHIFTCLAMP( fir[1] );
+        col[pitch]      = FT_SHIFTCLAMP( fir[2] );
       }
     }
   }
@@ -176,11 +174,12 @@
   static void
   _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
                          FT_Render_Mode  mode,
-                         FT_Library      library )
+                         FT_Byte*        weights )
   {
-    FT_UInt  width  = (FT_UInt)bitmap->width;
-    FT_UInt  height = (FT_UInt)bitmap->rows;
-    FT_Int   pitch  = bitmap->pitch;
+    FT_UInt   width  = (FT_UInt)bitmap->width;
+    FT_UInt   height = (FT_UInt)bitmap->rows;
+    FT_Int    pitch  = bitmap->pitch;
+    FT_Byte*  origin = bitmap->buffer;
 
     static const unsigned int  filters[3][3] =
     {
@@ -189,36 +188,34 @@
       { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
     };
 
-    FT_UNUSED( library );
+    FT_UNUSED( weights );
 
 
+    /* take care of bitmap flow */
+    if ( pitch > 0 && height > 0 )
+      origin += pitch * (FT_Int)( height - 1 );
+
     /* horizontal in-place intra-pixel filter */
     if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
     {
-      FT_Byte*  line = bitmap->buffer;
+      FT_Byte*  line = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
-      for ( ; height > 0; height--, line += pitch )
+      for ( ; height > 0; height--, line -= pitch )
       {
         FT_UInt  xx;
 
 
         for ( xx = 0; xx < width; xx += 3 )
         {
-          FT_UInt  r = 0;
-          FT_UInt  g = 0;
-          FT_UInt  b = 0;
+          FT_UInt  r, g, b;
           FT_UInt  p;
 
 
           p  = line[xx];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
+          r  = filters[0][0] * p;
+          g  = filters[0][1] * p;
+          b  = filters[0][2] * p;
 
           p  = line[xx + 1];
           r += filters[1][0] * p;
@@ -238,31 +235,24 @@
     }
     else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
     {
-      FT_Byte*  column = bitmap->buffer;
+      FT_Byte*  column = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
       for ( ; width > 0; width--, column++ )
       {
-        FT_Byte*  col     = column;
-        FT_Byte*  col_end = col + (FT_Int)height * pitch;
+        FT_Byte*  col = column - 2 * pitch;
 
 
-        for ( ; col < col_end; col += 3 * pitch )
+        for ( ; height > 0; height -= 3, col -= 3 * pitch )
         {
-          FT_UInt  r = 0;
-          FT_UInt  g = 0;
-          FT_UInt  b = 0;
+          FT_UInt  r, g, b;
           FT_UInt  p;
 
 
           p  = col[0];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
+          r  = filters[0][0] * p;
+          g  = filters[0][1] * p;
+          b  = filters[0][2] * p;
 
           p  = col[pitch];
           r += filters[1][0] * p;
@@ -276,7 +266,7 @@
 
           col[0]         = (FT_Byte)( r / 65536 );
           col[pitch]     = (FT_Byte)( g / 65536 );
-          col[2 * pitch] = (FT_Byte)( b / 65536 );
+          col[pitch * 2] = (FT_Byte)( b / 65536 );
         }
       }
     }
@@ -295,7 +285,8 @@
     if ( !weights )
       return FT_THROW( Invalid_Argument );
 
-    ft_memcpy( library->lcd_weights, weights, 5 );
+    ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS );
+    library->lcd_filter_func = ft_lcd_filter_fir;
 
     return FT_Err_Ok;
   }
@@ -305,12 +296,10 @@
   FT_Library_SetLcdFilter( FT_Library    library,
                            FT_LcdFilter  filter )
   {
-    static const FT_Byte  light_filter[5] =
-                            { 0x00, 0x55, 0x56, 0x55, 0x00 };
-    /* the values here sum up to a value larger than 256, */
-    /* providing a cheap gamma correction                 */
-    static const FT_Byte  default_filter[5] =
-                            { 0x10, 0x40, 0x70, 0x40, 0x10 };
+    static const FT_LcdFiveTapFilter  default_weights =
+                   { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
+    static const FT_LcdFiveTapFilter  light_weights =
+                   { 0x00, 0x55, 0x56, 0x55, 0x00 };
 
 
     if ( !library )
@@ -320,42 +309,27 @@
     {
     case FT_LCD_FILTER_NONE:
       library->lcd_filter_func = NULL;
-      library->lcd_extra       = 0;
       break;
 
     case FT_LCD_FILTER_DEFAULT:
-#if defined( FT_FORCE_LEGACY_LCD_FILTER )
-
-      library->lcd_filter_func = _ft_lcd_filter_legacy;
-      library->lcd_extra       = 0;
-
-#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
-
-      ft_memcpy( library->lcd_weights, light_filter, 5 );
-      library->lcd_filter_func = _ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
-
-#else
-
-      ft_memcpy( library->lcd_weights, default_filter, 5 );
-      library->lcd_filter_func = _ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
-
-#endif
-
+      ft_memcpy( library->lcd_weights,
+                 default_weights,
+                 FT_LCD_FILTER_FIVE_TAPS );
+      library->lcd_filter_func = ft_lcd_filter_fir;
       break;
 
     case FT_LCD_FILTER_LIGHT:
-      ft_memcpy( library->lcd_weights, light_filter, 5 );
-      library->lcd_filter_func = _ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
+      ft_memcpy( library->lcd_weights,
+                 light_weights,
+                 FT_LCD_FILTER_FIVE_TAPS );
+      library->lcd_filter_func = ft_lcd_filter_fir;
       break;
 
 #ifdef USE_LEGACY
 
     case FT_LCD_FILTER_LEGACY:
+    case FT_LCD_FILTER_LEGACY1:
       library->lcd_filter_func = _ft_lcd_filter_legacy;
-      library->lcd_extra       = 0;
       break;
 
 #endif
@@ -364,13 +338,24 @@
       return FT_THROW( Invalid_Argument );
     }
 
-    library->lcd_filter = filter;
-
     return FT_Err_Ok;
   }
 
 #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
+  /* add padding according to accommodate outline shifts */
+  FT_BASE_DEF (void)
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot )
+  {
+    FT_UNUSED( slot );
+
+    *Min -= 21;
+    *Max += 21;
+  }
+
+
   FT_EXPORT_DEF( FT_Error )
   FT_Library_SetLcdFilterWeights( FT_Library      library,
                                   unsigned char  *weights )
diff --git a/src/base/ftmac.c b/src/base/ftmac.c
index 446a23a..fd4c0cc 100644
--- a/src/base/ftmac.c
+++ b/src/base/ftmac.c
@@ -8,7 +8,7 @@
 /*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */
 /*  classic platforms built by MPW.                                        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -71,6 +71,9 @@
 #include FT_INTERNAL_STREAM_H
 #include "ftbase.h"
 
+
+#ifdef FT_MACINTOSH
+
   /* This is for Mac OS X.  Without redefinition, OS_INLINE */
   /* expands to `static inline' which doesn't survive the   */
   /* -ansi compilation flag of GCC.                         */
@@ -118,8 +121,6 @@
 #endif
 
 
-#ifdef FT_MACINTOSH
-
   /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
   FT_EXPORT_DEF( FT_Error )
   FT_GetFile_From_Mac_Name( const char*  fontName,
@@ -228,7 +229,7 @@
 
 
     if ( !fontName || !face_index )
-      return FT_THROW( Invalid_Argument) ;
+      return FT_THROW( Invalid_Argument);
 
     err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
     if ( err )
@@ -605,7 +606,7 @@
     for (;;)
     {
       post_data = Get1Resource( TTAG_POST, res_id++ );
-      if ( post_data == NULL )
+      if ( !post_data )
         break;  /* we are done */
 
       code = (*post_data)[0];
@@ -618,11 +619,11 @@
           total_size += 6; /* code + 4 bytes chunk length */
       }
 
-      total_size += GetHandleSize( post_data ) - 2;
+      total_size += (FT_ULong)GetHandleSize( post_data ) - 2;
       last_code = code;
 
-      /* detect integer overflows */
-      if ( total_size < old_total_size )
+      /* detect resource fork overflow */
+      if ( FT_MAC_RFORK_MAX_LEN < total_size )
       {
         error = FT_THROW( Array_Too_Large );
         goto Error;
@@ -644,7 +645,7 @@
     for (;;)
     {
       post_data = Get1Resource( TTAG_POST, res_id++ );
-      if ( post_data == NULL )
+      if ( !post_data )
         break;  /* we are done */
 
       post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
@@ -655,7 +656,7 @@
         if ( last_code != -1 )
         {
           /* we are done adding a chunk, fill in the size field */
-          if ( size_p != NULL )
+          if ( size_p )
           {
             *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
             *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
@@ -743,10 +744,15 @@
 
 
     sfnt = GetResource( TTAG_sfnt, sfnt_id );
-    if ( sfnt == NULL )
+    if ( !sfnt )
       return FT_THROW( Invalid_Handle );
 
     sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+
+    /* detect resource fork overflow */
+    if ( FT_MAC_RFORK_MAX_LEN < sfnt_size )
+      return FT_THROW( Array_Too_Large );
+
     if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
     {
       ReleaseResource( sfnt );
@@ -816,7 +822,7 @@
       return FT_THROW( Cannot_Open_Resource );
 
     num_faces_in_res = 0;
-    for ( res_index = 1; ; ++res_index )
+    for ( res_index = 1; ; res_index++ )
     {
       short  num_faces_in_fond;
 
@@ -937,13 +943,14 @@
     /* if it works, fine.                                           */
 
     error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
-    if ( error == 0 )
-      return error;
+    if ( error )
+    {
+      /* let it fall through to normal loader (.ttf, .otf, etc.); */
+      /* we signal this by returning no error and no FT_Face      */
+      *aface = NULL;
+    }
 
-    /* let it fall through to normal loader (.ttf, .otf, etc.); */
-    /* we signal this by returning no error and no FT_Face      */
-    *aface = NULL;
-    return 0;
+    return FT_Err_Ok;
   }
 
 
@@ -977,12 +984,13 @@
     /* try resourcefork based font: LWFN, FFIL */
     error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
                                        face_index, aface );
-    if ( error != 0 || *aface != NULL )
+    if ( error || *aface )
       return error;
 
     /* let it fall through to normal loader (.ttf, .otf, etc.) */
     args.flags    = FT_OPEN_PATHNAME;
     args.pathname = (char*)pathname;
+
     return FT_Open_Face( library, &args, face_index, aface );
   }
 
@@ -997,7 +1005,7 @@
   /*    accepts an FSRef instead of a path.                                */
   /*                                                                       */
   /* This function is deprecated because Carbon data types (FSRef)         */
-  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  /* are not cross-platform, and thus not suitable for the FreeType API.   */
   FT_EXPORT_DEF( FT_Error )
   FT_New_Face_From_FSRef( FT_Library    library,
                           const FSRef*  ref,
@@ -1022,7 +1030,7 @@
       error = FT_THROW( Cannot_Open_Resource );
 
     error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
-    if ( error != 0 || *aface != NULL )
+    if ( error || *aface )
       return error;
 
     /* fallback to datafork font */
@@ -1069,7 +1077,12 @@
 #endif
   }
 
-#endif /* FT_MACINTOSH */
+#else /* !FT_MACINTOSH */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _ft_mac_dummy;
+
+#endif /* !FT_MACINTOSH */
 
 
 /* END */
diff --git a/src/base/ftmm.c b/src/base/ftmm.c
index 7c012aa..800441b 100644
--- a/src/base/ftmm.c
+++ b/src/base/ftmm.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Multiple Master font support (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,7 @@
 #include FT_MULTIPLE_MASTERS_H
 #include FT_INTERNAL_OBJECTS_H
 #include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 
 
   /*************************************************************************/
@@ -62,6 +63,34 @@
   }
 
 
+  static FT_Error
+  ft_face_get_mvar_service( FT_Face                        face,
+                            FT_Service_MetricsVariations  *aservice )
+  {
+    FT_Error  error;
+
+
+    *aservice = NULL;
+
+    if ( !face )
+      return FT_THROW( Invalid_Face_Handle );
+
+    error = FT_ERR( Invalid_Argument );
+
+    if ( FT_HAS_MULTIPLE_MASTERS( face ) )
+    {
+      FT_FACE_LOOKUP_SERVICE( face,
+                              *aservice,
+                              METRICS_VARIATIONS );
+
+      if ( *aservice )
+        error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
   /* documentation is in ftmm.h */
 
   FT_EXPORT_DEF( FT_Error )
@@ -119,6 +148,25 @@
   /* documentation is in ftmm.h */
 
   FT_EXPORT_DEF( FT_Error )
+  FT_Done_MM_Var( FT_Library  library,
+                  FT_MM_Var*  amaster )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    memory = library->memory;
+    FT_FREE( amaster );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
   FT_Set_MM_Design_Coordinates( FT_Face   face,
                                 FT_UInt   num_coords,
                                 FT_Long*  coords )
@@ -129,7 +177,7 @@
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
     error = ft_face_get_mm_service( face, &service );
@@ -140,6 +188,13 @@
         error = service->set_mm_design( face, num_coords, coords );
     }
 
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
+    }
+
     return error;
   }
 
@@ -151,6 +206,54 @@
                                  FT_UInt    num_coords,
                                  FT_Fixed*  coords )
   {
+    FT_Error                      error;
+    FT_Service_MultiMasters       service_mm   = NULL;
+    FT_Service_MetricsVariations  service_mvar = NULL;
+
+
+    /* check of `face' delayed to `ft_face_get_mm_service' */
+
+    if ( num_coords && !coords )
+      return FT_THROW( Invalid_Argument );
+
+    error = ft_face_get_mm_service( face, &service_mm );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service_mm->set_var_design )
+        error = service_mm->set_var_design( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
+    }
+
+    if ( !error )
+    {
+      (void)ft_face_get_mvar_service( face, &service_mvar );
+
+      if ( service_mvar && service_mvar->metrics_adjust )
+        service_mvar->metrics_adjust( face );
+    }
+
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords )
+  {
     FT_Error                 error;
     FT_Service_MultiMasters  service;
 
@@ -164,8 +267,8 @@
     if ( !error )
     {
       error = FT_ERR( Invalid_Argument );
-      if ( service->set_var_design )
-        error = service->set_var_design( face, num_coords, coords );
+      if ( service->get_var_design )
+        error = service->get_var_design( face, num_coords, coords );
     }
 
     return error;
@@ -179,21 +282,41 @@
                                FT_UInt    num_coords,
                                FT_Fixed*  coords )
   {
-    FT_Error                 error;
-    FT_Service_MultiMasters  service;
+    FT_Error                      error;
+    FT_Service_MultiMasters       service_mm   = NULL;
+    FT_Service_MetricsVariations  service_mvar = NULL;
 
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
-    error = ft_face_get_mm_service( face, &service );
+    error = ft_face_get_mm_service( face, &service_mm );
     if ( !error )
     {
       error = FT_ERR( Invalid_Argument );
-      if ( service->set_mm_blend )
-         error = service->set_mm_blend( face, num_coords, coords );
+      if ( service_mm->set_mm_blend )
+        error = service_mm->set_mm_blend( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
+    }
+
+    if ( !error )
+    {
+      (void)ft_face_get_mvar_service( face, &service_mvar );
+
+      if ( service_mvar && service_mvar->metrics_adjust )
+        service_mvar->metrics_adjust( face );
+    }
+
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
     }
 
     return error;
@@ -210,6 +333,54 @@
                                 FT_UInt    num_coords,
                                 FT_Fixed*  coords )
   {
+    FT_Error                      error;
+    FT_Service_MultiMasters       service_mm   = NULL;
+    FT_Service_MetricsVariations  service_mvar = NULL;
+
+
+    /* check of `face' delayed to `ft_face_get_mm_service' */
+
+    if ( num_coords && !coords )
+      return FT_THROW( Invalid_Argument );
+
+    error = ft_face_get_mm_service( face, &service_mm );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service_mm->set_mm_blend )
+        error = service_mm->set_mm_blend( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
+    }
+
+    if ( !error )
+    {
+      (void)ft_face_get_mvar_service( face, &service_mvar );
+
+      if ( service_mvar && service_mvar->metrics_adjust )
+        service_mvar->metrics_adjust( face );
+    }
+
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords )
+  {
     FT_Error                 error;
     FT_Service_MultiMasters  service;
 
@@ -223,8 +394,111 @@
     if ( !error )
     {
       error = FT_ERR( Invalid_Argument );
-      if ( service->set_mm_blend )
-         error = service->set_mm_blend( face, num_coords, coords );
+      if ( service->get_mm_blend )
+        error = service->get_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  /* This is exactly the same as the previous function.  It exists for */
+  /* orthogonality.                                                    */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    /* check of `face' delayed to `ft_face_get_mm_service' */
+
+    if ( !coords )
+      return FT_THROW( Invalid_Argument );
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service->get_mm_blend )
+        error = service->get_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Var_Axis_Flags( FT_MM_Var*  master,
+                         FT_UInt     axis_index,
+                         FT_UInt*    flags )
+  {
+    FT_UShort*  axis_flags;
+
+
+    if ( !master || !flags )
+      return FT_THROW( Invalid_Argument );
+
+    if ( axis_index >= master->num_axis )
+      return FT_THROW( Invalid_Argument );
+
+    /* the axis flags array immediately follows the data of `master' */
+    axis_flags = (FT_UShort*)&( master[1] );
+    *flags     = axis_flags[axis_index];
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Named_Instance( FT_Face  face,
+                         FT_UInt  instance_index )
+  {
+    FT_Error  error;
+
+    FT_Service_MultiMasters       service_mm   = NULL;
+    FT_Service_MetricsVariations  service_mvar = NULL;
+
+
+    /* check of `face' delayed to `ft_face_get_mm_service' */
+
+    error = ft_face_get_mm_service( face, &service_mm );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service_mm->set_instance )
+        error = service_mm->set_instance( face, instance_index );
+    }
+
+    if ( !error )
+    {
+      (void)ft_face_get_mvar_service( face, &service_mvar );
+
+      if ( service_mvar && service_mvar->metrics_adjust )
+        service_mvar->metrics_adjust( face );
+    }
+
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
+    }
+
+    if ( !error )
+    {
+      face->face_index  = ( instance_index << 16 )        |
+                          ( face->face_index & 0xFFFFL );
+      face->face_flags &= ~FT_FACE_FLAG_VARIATION;
     }
 
     return error;
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 9c3332c..8d07e35 100644
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (body).                            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,12 +19,16 @@
 #include <ft2build.h>
 #include FT_LIST_H
 #include FT_OUTLINE_H
+#include FT_FONT_FORMATS_H
+
 #include FT_INTERNAL_VALIDATE_H
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_RFORK_H
 #include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H    /* for SFNT_Load_Table_Func */
+#include FT_INTERNAL_SFNT_H            /* for SFNT_Load_Table_Func */
+#include FT_INTERNAL_POSTSCRIPT_AUX_H  /* for PS_Driver            */
+
 #include FT_TRUETYPE_TABLES_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_TRUETYPE_IDS_H
@@ -37,6 +41,8 @@
 #include FT_SERVICE_KERNING_H
 #include FT_SERVICE_TRUETYPE_ENGINE_H
 
+#include FT_DRIVER_H
+
 #ifdef FT_CONFIG_OPTION_MAC_FONTS
 #include "ftbase.h"
 #endif
@@ -55,7 +61,18 @@
 #pragma warning( disable : 4244 )
 #endif /* _MSC_VER */
 
-  /* it's easiest to include `md5.c' directly */
+  /* It's easiest to include `md5.c' directly.  However, since OpenSSL */
+  /* also provides the same functions, there might be conflicts if     */
+  /* both FreeType and OpenSSL are built as static libraries.  For     */
+  /* this reason, we put the MD5 stuff into the `FT_' namespace.       */
+#define MD5_u32plus  FT_MD5_u32plus
+#define MD5_CTX      FT_MD5_CTX
+#define MD5_Init     FT_MD5_Init
+#define MD5_Update   FT_MD5_Update
+#define MD5_Final    FT_MD5_Final
+
+#undef  HAVE_OPENSSL
+
 #include "md5.c"
 
 #if defined( _MSC_VER )
@@ -68,6 +85,15 @@
 #define GRID_FIT_METRICS
 
 
+  /* forward declaration */
+  static FT_Error
+  ft_open_face_internal( FT_Library           library,
+                         const FT_Open_Args*  args,
+                         FT_Long              face_index,
+                         FT_Face             *aface,
+                         FT_Bool              test_mac_fonts );
+
+
   FT_BASE_DEF( FT_Pointer )
   ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
                           const char*     service_id )
@@ -305,6 +331,138 @@
 
 
   FT_BASE_DEF( void )
+  ft_glyphslot_preset_bitmap( FT_GlyphSlot      slot,
+                              FT_Render_Mode    mode,
+                              const FT_Vector*  origin )
+  {
+    FT_Outline*  outline = &slot->outline;
+    FT_Bitmap*   bitmap  = &slot->bitmap;
+
+    FT_Pixel_Mode  pixel_mode;
+
+    FT_BBox  cbox;
+    FT_Pos   x_shift = 0;
+    FT_Pos   y_shift = 0;
+    FT_Pos   x_left, y_top;
+    FT_Pos   width, height, pitch;
+
+
+    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+      return;
+
+    if ( origin )
+    {
+      x_shift = origin->x;
+      y_shift = origin->y;
+    }
+
+    /* compute the control box, and grid-fit it, */
+    /* taking into account the origin shift      */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    cbox.xMin += x_shift;
+    cbox.yMin += y_shift;
+    cbox.xMax += x_shift;
+    cbox.yMax += y_shift;
+
+    switch ( mode )
+    {
+    case FT_RENDER_MODE_MONO:
+      pixel_mode = FT_PIXEL_MODE_MONO;
+#if 1
+      /* undocumented but confirmed: bbox values get rounded    */
+      /* unless the rounded box can collapse for a narrow glyph */
+      if ( cbox.xMax - cbox.xMin < 64 )
+      {
+        cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+        cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      }
+      else
+      {
+        cbox.xMin = FT_PIX_ROUND_LONG( cbox.xMin );
+        cbox.xMax = FT_PIX_ROUND_LONG( cbox.xMax );
+      }
+
+      if ( cbox.yMax - cbox.yMin < 64 )
+      {
+        cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+        cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+      }
+      else
+      {
+        cbox.yMin = FT_PIX_ROUND_LONG( cbox.yMin );
+        cbox.yMax = FT_PIX_ROUND_LONG( cbox.yMax );
+      }
+#else
+      cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+      cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+      cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+#endif
+      break;
+
+    case FT_RENDER_MODE_LCD:
+      pixel_mode = FT_PIXEL_MODE_LCD;
+      ft_lcd_padding( &cbox.xMin, &cbox.xMax, slot );
+      goto Round;
+
+    case FT_RENDER_MODE_LCD_V:
+      pixel_mode = FT_PIXEL_MODE_LCD_V;
+      ft_lcd_padding( &cbox.yMin, &cbox.yMax, slot );
+      goto Round;
+
+    case FT_RENDER_MODE_NORMAL:
+    case FT_RENDER_MODE_LIGHT:
+    default:
+      pixel_mode = FT_PIXEL_MODE_GRAY;
+    Round:
+      cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+      cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+      cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+    }
+
+    x_shift = SUB_LONG( x_shift, cbox.xMin );
+    y_shift = SUB_LONG( y_shift, cbox.yMin );
+
+    x_left = cbox.xMin >> 6;
+    y_top  = cbox.yMax >> 6;
+
+    width  = ( (FT_ULong)cbox.xMax - (FT_ULong)cbox.xMin ) >> 6;
+    height = ( (FT_ULong)cbox.yMax - (FT_ULong)cbox.yMin ) >> 6;
+
+    switch ( pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      pitch = ( ( width + 15 ) >> 4 ) << 1;
+      break;
+
+    case FT_PIXEL_MODE_LCD:
+      width *= 3;
+      pitch  = FT_PAD_CEIL( width, 4 );
+      break;
+
+    case FT_PIXEL_MODE_LCD_V:
+      height *= 3;
+      /* fall through */
+
+    case FT_PIXEL_MODE_GRAY:
+    default:
+      pitch = width;
+    }
+
+    slot->bitmap_left = (FT_Int)x_left;
+    slot->bitmap_top  = (FT_Int)y_top;
+
+    bitmap->pixel_mode = (unsigned char)pixel_mode;
+    bitmap->num_grays  = 256;
+    bitmap->width      = (unsigned int)width;
+    bitmap->rows       = (unsigned int)height;
+    bitmap->pitch      = pitch;
+  }
+
+
+  FT_BASE_DEF( void )
   ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
                            FT_Byte*      buffer )
   {
@@ -442,7 +600,8 @@
 
 
   Exit:
-    FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
+    FT_TRACE4(( "FT_New_GlyphSlot: Return 0x%x\n", error ));
+
     return error;
   }
 
@@ -555,34 +714,42 @@
     if ( vertical )
     {
       metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+      metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY );
 
-      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
-      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+      right  = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingX,
+                                           metrics->width ) );
+      bottom = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingY,
+                                           metrics->height ) );
 
       metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
       metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
 
-      metrics->width  = right - metrics->vertBearingX;
-      metrics->height = bottom - metrics->vertBearingY;
+      metrics->width  = SUB_LONG( right,
+                                  metrics->vertBearingX );
+      metrics->height = SUB_LONG( bottom,
+                                  metrics->vertBearingY );
     }
     else
     {
       metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
       metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
 
-      right  = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );
-      bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );
+      right  = FT_PIX_CEIL_LONG( ADD_LONG( metrics->horiBearingX,
+                                           metrics->width ) );
+      bottom = FT_PIX_FLOOR( SUB_LONG( metrics->horiBearingY,
+                                       metrics->height ) );
 
       metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+      metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY );
 
-      metrics->width  = right - metrics->horiBearingX;
-      metrics->height = metrics->horiBearingY - bottom;
+      metrics->width  = SUB_LONG( right,
+                                  metrics->horiBearingX );
+      metrics->height = SUB_LONG( metrics->horiBearingY,
+                                  bottom );
     }
 
-    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
-    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+    metrics->horiAdvance = FT_PIX_ROUND_LONG( metrics->horiAdvance );
+    metrics->vertAdvance = FT_PIX_ROUND_LONG( metrics->vertAdvance );
   }
 #endif /* GRID_FIT_METRICS */
 
@@ -630,13 +797,20 @@
       load_flags &= ~FT_LOAD_RENDER;
     }
 
+    if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY )
+      load_flags &= ~FT_LOAD_RENDER;
+
     /*
      * Determine whether we need to auto-hint or not.
      * The general rules are:
      *
-     * - Do only auto-hinting if we have a hinter module, a scalable font
-     *   format dealing with outlines, and no transforms except simple
-     *   slants and/or rotations by integer multiples of 90 degrees.
+     * - Do only auto-hinting if we have
+     *
+     *   - a hinter module,
+     *   - a scalable font format dealing with outlines,
+     *   - not a tricky font, and
+     *   - no transforms except simple slants and/or rotations by
+     *     integer multiples of 90 degrees.
      *
      * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
      *   have a native font hinter.
@@ -666,8 +840,15 @@
       else
       {
         FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+        FT_Bool         is_light_type1;
 
 
+        /* only the new Adobe engine (for both CFF and Type 1) is `light'; */
+        /* we use `strstr' to catch both `Type 1' and `CID Type 1'         */
+        is_light_type1 =
+          ft_strstr( FT_Get_Font_Format( face ), "Type 1" ) != NULL   &&
+          ((PS_Driver)driver)->hinting_engine == FT_HINTING_ADOBE;
+
         /* the check for `num_locations' assures that we actually    */
         /* test for instructions in a TTF and not in a CFF-based OTF */
         /*                                                           */
@@ -675,8 +856,9 @@
         /* check the size of the `fpgm' and `prep' tables, too --    */
         /* the assumption is that there don't exist real TTFs where  */
         /* both `fpgm' and `prep' tables are missing                 */
-        if ( mode == FT_RENDER_MODE_LIGHT                       ||
-             face->internal->ignore_unpatented_hinter           ||
+        if ( ( mode == FT_RENDER_MODE_LIGHT           &&
+               ( !FT_DRIVER_HINTS_LIGHTLY( driver ) &&
+                 !is_light_type1                    ) )         ||
              ( FT_IS_SFNT( face )                             &&
                ttface->num_locations                          &&
                ttface->max_profile.maxSizeOfInstructions == 0 &&
@@ -696,8 +878,8 @@
       /* XXX: This is really a temporary hack that should disappear */
       /*      promptly with FreeType 2.1!                           */
       /*                                                            */
-      if ( FT_HAS_FIXED_SIZES( face )             &&
-          ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+      if ( FT_HAS_FIXED_SIZES( face )              &&
+           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
       {
         error = driver->clazz->load_glyph( slot, face->size,
                                            glyph_index,
@@ -765,7 +947,7 @@
 
     /* compute the linear advance in 16.16 pixels */
     if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
-         ( FT_IS_SCALABLE( face ) )                  )
+         FT_IS_SCALABLE( face )                      )
     {
       FT_Size_Metrics*  metrics = &face->size->metrics;
 
@@ -813,28 +995,37 @@
       }
     }
 
-    FT_TRACE5(( "  x advance: %d\n" , slot->advance.x ));
-    FT_TRACE5(( "  y advance: %d\n" , slot->advance.y ));
-
-    FT_TRACE5(( "  linear x advance: %d\n" , slot->linearHoriAdvance ));
-    FT_TRACE5(( "  linear y advance: %d\n" , slot->linearVertAdvance ));
-
-    /* do we need to render the image now? */
+    /* do we need to render the image or preset the bitmap now? */
     if ( !error                                    &&
+         ( load_flags & FT_LOAD_NO_SCALE ) == 0    &&
          slot->format != FT_GLYPH_FORMAT_BITMAP    &&
-         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
-         load_flags & FT_LOAD_RENDER )
+         slot->format != FT_GLYPH_FORMAT_COMPOSITE )
     {
       FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
 
 
-      if ( mode == FT_RENDER_MODE_NORMAL      &&
-           (load_flags & FT_LOAD_MONOCHROME ) )
+      if ( mode == FT_RENDER_MODE_NORMAL   &&
+           load_flags & FT_LOAD_MONOCHROME )
         mode = FT_RENDER_MODE_MONO;
 
-      error = FT_Render_Glyph( slot, mode );
+      if ( load_flags & FT_LOAD_RENDER )
+        error = FT_Render_Glyph( slot, mode );
+      else
+        ft_glyphslot_preset_bitmap( slot, mode, NULL );
     }
 
+    FT_TRACE5(( "FT_Load_Glyph: index %d, flags %x\n",
+                glyph_index, load_flags               ));
+    FT_TRACE5(( "  x advance: %f\n", slot->advance.x / 64.0 ));
+    FT_TRACE5(( "  y advance: %f\n", slot->advance.y / 64.0 ));
+    FT_TRACE5(( "  linear x advance: %f\n",
+                slot->linearHoriAdvance / 65536.0 ));
+    FT_TRACE5(( "  linear y advance: %f\n",
+                slot->linearVertAdvance / 65536.0 ));
+    FT_TRACE5(( "  bitmap %dx%d, mode %d\n",
+                slot->bitmap.width, slot->bitmap.rows,
+                slot->bitmap.pixel_mode               ));
+
   Exit:
     return error;
   }
@@ -1091,7 +1282,7 @@
 
     end = first + face->num_charmaps;  /* points after the last one */
 
-    for ( cur = first; cur < end; ++cur )
+    for ( cur = first; cur < end; cur++ )
     {
       if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&
            cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
@@ -1162,6 +1353,8 @@
     }
 #endif
 
+    face->internal->random_seed = -1;
+
     if ( clazz->init_face )
       error = clazz->init_face( *astream,
                                 face,
@@ -1226,7 +1419,7 @@
     args.pathname = (char*)pathname;
     args.stream   = NULL;
 
-    return FT_Open_Face( library, &args, face_index, aface );
+    return ft_open_face_internal( library, &args, face_index, aface, 1 );
   }
 
 #endif
@@ -1253,7 +1446,7 @@
     args.memory_size = file_size;
     args.stream      = NULL;
 
-    return FT_Open_Face( library, &args, face_index, aface );
+    return ft_open_face_internal( library, &args, face_index, aface, 1 );
   }
 
 
@@ -1288,7 +1481,7 @@
 
   /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
   /* It frees the memory it uses.                                  */
-  /* From ftmac.c.                                                 */
+  /* From `ftmac.c'.                                               */
   static void
   memory_stream_close( FT_Stream  stream )
   {
@@ -1304,7 +1497,7 @@
 
 
   /* Create a new memory stream from a buffer and a size. */
-  /* From ftmac.c.                                        */
+  /* From `ftmac.c'.                                      */
   static FT_Error
   new_memory_stream( FT_Library           library,
                      FT_Byte*             base,
@@ -1324,7 +1517,7 @@
       return FT_THROW( Invalid_Argument );
 
     *astream = NULL;
-    memory = library->memory;
+    memory   = library->memory;
     if ( FT_NEW( stream ) )
       goto Exit;
 
@@ -1340,7 +1533,7 @@
 
 
   /* Create a new FT_Face given a buffer and a driver name. */
-  /* from ftmac.c */
+  /* From `ftmac.c'.                                        */
   FT_LOCAL_DEF( FT_Error )
   open_face_from_buffer( FT_Library   library,
                          FT_Byte*     base,
@@ -1366,27 +1559,27 @@
       return error;
     }
 
-    args.flags = FT_OPEN_STREAM;
+    args.flags  = FT_OPEN_STREAM;
     args.stream = stream;
     if ( driver_name )
     {
-      args.flags = args.flags | FT_OPEN_DRIVER;
+      args.flags  = args.flags | FT_OPEN_DRIVER;
       args.driver = FT_Get_Module( library, driver_name );
     }
 
 #ifdef FT_MACINTOSH
-    /* At this point, face_index has served its purpose;      */
+    /* At this point, the face index has served its purpose;  */
     /* whoever calls this function has already used it to     */
     /* locate the correct font data.  We should not propagate */
     /* this index to FT_Open_Face() (unless it is negative).  */
 
     if ( face_index > 0 )
-      face_index = 0;
+      face_index &= 0x7FFF0000L; /* retain GX data */
 #endif
 
-    error = FT_Open_Face( library, &args, face_index, aface );
+    error = ft_open_face_internal( library, &args, face_index, aface, 0 );
 
-    if ( error == FT_Err_Ok )
+    if ( !error )
       (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
     else
 #ifdef FT_MACINTOSH
@@ -1407,7 +1600,7 @@
 
   /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */
   /* format too.  Here, since we can't expect that the TrueType font */
-  /* driver is loaded unconditially, we must parse the font by       */
+  /* driver is loaded unconditionally, we must parse the font by     */
   /* ourselves.  We are only interested in the name of the table and */
   /* the offset.                                                     */
 
@@ -1472,6 +1665,7 @@
       if ( face_index >= 0 && pstable_index == face_index )
         return FT_Err_Ok;
     }
+
     return FT_THROW( Table_Missing );
   }
 
@@ -1495,6 +1689,10 @@
     FT_UNUSED( params );
 
 
+    /* ignore GX stuff */
+    if ( face_index > 0 )
+      face_index &= 0xFFFFL;
+
     pos = FT_STREAM_POS();
 
     error = ft_lookup_PS_in_sfnt_stream( stream,
@@ -1505,7 +1703,21 @@
     if ( error )
       goto Exit;
 
-    if ( FT_Stream_Seek( stream, pos + offset ) )
+    if ( offset > stream->size )
+    {
+      FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table offset\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+    else if ( length > stream->size - offset )
+    {
+      FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table length\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    error = FT_Stream_Seek( stream, pos + offset );
+    if ( error )
       goto Exit;
 
     if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )
@@ -1513,7 +1725,10 @@
 
     error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );
     if ( error )
+    {
+      FT_FREE( sfnt_ps );
       goto Exit;
+    }
 
     error = open_face_from_buffer( library,
                                    sfnt_ps,
@@ -1556,6 +1771,7 @@
   {
     FT_Error   error  = FT_ERR( Cannot_Open_Resource );
     FT_Memory  memory = library->memory;
+
     FT_Byte*   pfb_data = NULL;
     int        i, type, flags;
     FT_ULong   len;
@@ -1571,23 +1787,28 @@
     /* Find the length of all the POST resources, concatenated.  Assume */
     /* worst case (each resource in its own section).                   */
     pfb_len = 0;
-    for ( i = 0; i < resource_cnt; ++i )
+    for ( i = 0; i < resource_cnt; i++ )
     {
       error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] );
       if ( error )
         goto Exit;
-      if ( FT_READ_ULONG( temp ) )
+      if ( FT_READ_ULONG( temp ) )  /* actually LONG */
         goto Exit;
 
       /* FT2 allocator takes signed long buffer length,
        * too large value causing overflow should be checked
        */
-      FT_TRACE4(( "                 POST fragment #%d: length=0x%08x\n",
-                  i, temp));
-      if ( 0x7FFFFFFFUL < temp || pfb_len + temp + 6 < pfb_len )
+      FT_TRACE4(( "                 POST fragment #%d: length=0x%08x"
+                  " total pfb_len=0x%08x\n",
+                  i, temp, pfb_len + temp + 6 ));
+
+      if ( FT_MAC_RFORK_MAX_LEN < temp               ||
+           FT_MAC_RFORK_MAX_LEN - temp < pfb_len + 6 )
       {
-        FT_TRACE2(( "             too long fragment length makes"
-                    " pfb_len confused: temp=0x%08x\n", temp ));
+        FT_TRACE2(( "             MacOS resource length cannot exceed"
+                    " 0x%08x\n",
+                    FT_MAC_RFORK_MAX_LEN ));
+
         error = FT_THROW( Invalid_Offset );
         goto Exit;
       }
@@ -1595,15 +1816,20 @@
       pfb_len += temp + 6;
     }
 
-    FT_TRACE2(( "             total buffer size to concatenate %d"
-                " POST fragments: 0x%08x\n",
-                 resource_cnt, pfb_len + 2));
-    if ( pfb_len + 2 < 6 ) {
+    FT_TRACE2(( "             total buffer size to concatenate"
+                " %d POST fragments: 0x%08x\n",
+                 resource_cnt, pfb_len + 2 ));
+
+    if ( pfb_len + 2 < 6 )
+    {
       FT_TRACE2(( "             too long fragment length makes"
-                  " pfb_len confused: pfb_len=0x%08x\n", pfb_len ));
+                  " pfb_len confused: pfb_len=0x%08x\n",
+                  pfb_len ));
+
       error = FT_THROW( Array_Too_Large );
       goto Exit;
     }
+
     if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )
       goto Exit;
 
@@ -1616,9 +1842,10 @@
     pfb_pos     = 6;
     pfb_lenpos  = 2;
 
-    len = 0;
+    len  = 0;
     type = 1;
-    for ( i = 0; i < resource_cnt; ++i )
+
+    for ( i = 0; i < resource_cnt; i++ )
     {
       error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] );
       if ( error )
@@ -1637,18 +1864,24 @@
 
       if ( FT_READ_USHORT( flags ) )
         goto Exit2;
-      FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
-                   i, offsets[i], rlen, flags ));
+
+      FT_TRACE3(( "POST fragment[%d]:"
+                  " offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+                  i, offsets[i], rlen, flags ));
 
       error = FT_ERR( Array_Too_Large );
-      /* postpone the check of rlen longer than buffer until FT_Stream_Read() */
+
+      /* postpone the check of `rlen longer than buffer' */
+      /* until `FT_Stream_Read'                          */
+
       if ( ( flags >> 8 ) == 0 )        /* Comment, should not be loaded */
       {
-        FT_TRACE3(( "    Skip POST fragment #%d because it is a comment\n", i ));
+        FT_TRACE3(( "    Skip POST fragment #%d because it is a comment\n",
+                    i ));
         continue;
       }
 
-      /* the flags are part of the resource, so rlen >= 2.  */
+      /* the flags are part of the resource, so rlen >= 2,  */
       /* but some fonts declare rlen = 0 for empty fragment */
       if ( rlen > 2 )
         rlen -= 2;
@@ -1660,9 +1893,12 @@
       else
       {
         FT_TRACE3(( "    Write POST fragment #%d header (4-byte) to buffer"
-                    " 0x%p + 0x%08x\n", i, pfb_data, pfb_lenpos ));
+                    " %p + 0x%08x\n",
+                    i, pfb_data, pfb_lenpos ));
+
         if ( pfb_lenpos + 3 > pfb_len + 2 )
           goto Exit2;
+
         pfb_data[pfb_lenpos    ] = (FT_Byte)( len );
         pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
         pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
@@ -1672,13 +1908,16 @@
           break;
 
         FT_TRACE3(( "    Write POST fragment #%d header (6-byte) to buffer"
-                    " 0x%p + 0x%08x\n", i, pfb_data, pfb_pos ));
+                    " %p + 0x%08x\n",
+                    i, pfb_data, pfb_pos ));
+
         if ( pfb_pos + 6 > pfb_len + 2 )
           goto Exit2;
+
         pfb_data[pfb_pos++] = 0x80;
 
         type = flags >> 8;
-        len = rlen;
+        len  = rlen;
 
         pfb_data[pfb_pos++] = (FT_Byte)type;
         pfb_lenpos          = pfb_pos;
@@ -1692,14 +1931,18 @@
         goto Exit2;
 
       FT_TRACE3(( "    Load POST fragment #%d (%d byte) to buffer"
-                  " 0x%p + 0x%08x\n", i, rlen, pfb_data, pfb_pos ));
+                  " %p + 0x%08x\n",
+                  i, rlen, pfb_data, pfb_pos ));
+
       error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );
       if ( error )
         goto Exit2;
+
       pfb_pos += rlen;
     }
 
     error = FT_ERR( Array_Too_Large );
+
     if ( pfb_pos + 2 > pfb_len + 2 )
       goto Exit2;
     pfb_data[pfb_pos++] = 0x80;
@@ -1720,11 +1963,12 @@
                                   aface );
 
   Exit2:
-    if ( error == FT_ERR( Array_Too_Large ) )
+    if ( FT_ERR_EQ( error, Array_Too_Large ) )
       FT_TRACE2(( "  Abort due to too-short buffer to store"
                   " all POST fragments\n" ));
-    else if ( error == FT_ERR( Invalid_Offset ) )
+    else if ( FT_ERR_EQ( error, Invalid_Offset ) )
       FT_TRACE2(( "  Abort due to invalid offset in a POST fragment\n" ));
+
     if ( error )
       error = FT_ERR( Cannot_Open_Resource );
     FT_FREE( pfb_data );
@@ -1737,7 +1981,7 @@
   /* The resource header says we've got resource_cnt `sfnt'      */
   /* (TrueType/OpenType) resources in this file.  Look through   */
   /* them for the one indicated by face_index, load it into mem, */
-  /* pass it on the the truetype driver and return it.           */
+  /* pass it on to the truetype driver, and return it.           */
   /*                                                             */
   static FT_Error
   Mac_Read_sfnt_Resource( FT_Library  library,
@@ -1756,8 +2000,8 @@
     FT_Long    face_index_in_resource = 0;
 
 
-    if ( face_index == -1 )
-      face_index = 0;
+    if ( face_index < 0 )
+      face_index = -face_index - 1;
     if ( face_index >= resource_cnt )
       return FT_THROW( Cannot_Open_Resource );
 
@@ -1768,8 +2012,10 @@
 
     if ( FT_READ_LONG( rlen ) )
       goto Exit;
-    if ( rlen == -1 )
+    if ( rlen < 1 )
       return FT_THROW( Cannot_Open_Resource );
+    if ( (FT_ULong)rlen > FT_MAC_RFORK_MAX_LEN )
+      return FT_THROW( Invalid_Offset );
 
     error = open_face_PS_from_sfnt_stream( library,
                                            stream,
@@ -1780,14 +2026,17 @@
       goto Exit;
 
     /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
-    if ( FT_Stream_Seek( stream, flag_offset + 4 ) )
+    error = FT_Stream_Seek( stream, flag_offset + 4 );
+    if ( error )
       goto Exit;
 
     if ( FT_ALLOC( sfnt_data, rlen ) )
       return error;
     error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, (FT_ULong)rlen );
-    if ( error )
+    if ( error ) {
+      FT_FREE( sfnt_data );
       goto Exit;
+    }
 
     is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
     error = open_face_from_buffer( library,
@@ -1816,19 +2065,19 @@
   {
     FT_Memory  memory = library->memory;
     FT_Error   error;
-    FT_Long    map_offset, rdara_pos;
+    FT_Long    map_offset, rdata_pos;
     FT_Long    *data_offsets;
     FT_Long    count;
 
 
     error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
-                                       &map_offset, &rdara_pos );
+                                       &map_offset, &rdata_pos );
     if ( error )
       return error;
 
     /* POST resources must be sorted to concatenate properly */
     error = FT_Raccess_Get_DataOffsets( library, stream,
-                                        map_offset, rdara_pos,
+                                        map_offset, rdata_pos,
                                         TTAG_POST, TRUE,
                                         &data_offsets, &count );
     if ( !error )
@@ -1845,7 +2094,7 @@
     /* sfnt resources should not be sorted to preserve the face order by
        QuickDraw API */
     error = FT_Raccess_Get_DataOffsets( library, stream,
-                                        map_offset, rdara_pos,
+                                        map_offset, rdata_pos,
                                         TTAG_sfnt, FALSE,
                                         &data_offsets, &count );
     if ( !error )
@@ -1878,7 +2127,7 @@
     FT_Long        dlen, offset;
 
 
-    if ( NULL == stream )
+    if ( !stream )
       return FT_THROW( Invalid_Stream_Operation );
 
     error = FT_Stream_Seek( stream, 0 );
@@ -1889,13 +2138,14 @@
     if ( error )
       goto Exit;
 
-    if (            header[ 0] !=  0 ||
-                    header[74] !=  0 ||
-                    header[82] !=  0 ||
-                    header[ 1] ==  0 ||
-                    header[ 1] >  33 ||
-                    header[63] !=  0 ||
-         header[2 + header[1]] !=  0 )
+    if (            header[ 0] !=   0 ||
+                    header[74] !=   0 ||
+                    header[82] !=   0 ||
+                    header[ 1] ==   0 ||
+                    header[ 1] >   33 ||
+                    header[63] !=   0 ||
+         header[2 + header[1]] !=   0 ||
+                  header[0x53] > 0x7F )
       return FT_THROW( Unknown_File_Format );
 
     dlen = ( header[0x53] << 24 ) |
@@ -1951,13 +2201,15 @@
       {
         FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
                     " is already checked and"
-                    " no font is found\n", i ));
+                    " no font is found\n",
+                    i ));
         continue;
       }
 
       if ( errors[i] )
       {
-        FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i ));
+        FT_TRACE3(( "Error 0x%x has occurred in rule %d\n",
+                    errors[i], i ));
         continue;
       }
 
@@ -2032,7 +2284,11 @@
 #undef  FT_COMPONENT
 #define FT_COMPONENT  trace_raccess
 
-      FT_TRACE3(( "Try as dfont: %s ...", args->pathname ));
+#ifdef FT_DEBUG_LEVEL_TRACE
+      FT_TRACE3(( "Try as dfont: " ));
+      if ( !( args->flags & FT_OPEN_MEMORY ) )
+        FT_TRACE3(( "%s ...", args->pathname ));
+#endif
 
       error = IsMacResource( library, stream, 0, face_index, aface );
 
@@ -2063,6 +2319,17 @@
                 FT_Long              face_index,
                 FT_Face             *aface )
   {
+    return ft_open_face_internal( library, args, face_index, aface, 1 );
+  }
+
+
+  static FT_Error
+  ft_open_face_internal( FT_Library           library,
+                         const FT_Open_Args*  args,
+                         FT_Long              face_index,
+                         FT_Face             *aface,
+                         FT_Bool              test_mac_fonts )
+  {
     FT_Error     error;
     FT_Driver    driver = NULL;
     FT_Memory    memory = NULL;
@@ -2073,6 +2340,23 @@
     FT_Module*   cur;
     FT_Module*   limit;
 
+#ifndef FT_CONFIG_OPTION_MAC_FONTS
+    FT_UNUSED( test_mac_fonts );
+#endif
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_TRACE3(( "FT_Open_Face: " ));
+    if ( face_index < 0 )
+      FT_TRACE3(( "Requesting number of faces and named instances\n"));
+    else
+    {
+      FT_TRACE3(( "Requesting face %ld", face_index & 0xFFFFL ));
+      if ( face_index & 0x7FFF0000L )
+        FT_TRACE3(( ", named instance %ld", face_index >> 16 ));
+      FT_TRACE3(( "\n" ));
+    }
+#endif
 
     /* test for valid `library' delayed to `FT_Stream_New' */
 
@@ -2150,11 +2434,13 @@
             goto Success;
 
 #ifdef FT_CONFIG_OPTION_MAC_FONTS
-          if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
+          if ( test_mac_fonts                                           &&
+               ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
                FT_ERR_EQ( error, Table_Missing )                        )
           {
             /* TrueType but essential tables are missing */
-            if ( FT_Stream_Seek( stream, 0 ) )
+            error = FT_Stream_Seek( stream, 0 );
+            if ( error )
               break;
 
             error = open_face_PS_from_sfnt_stream( library,
@@ -2186,16 +2472,20 @@
         goto Fail2;
 
 #if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
-      error = load_mac_face( library, stream, face_index, aface, args );
-      if ( !error )
+      if ( test_mac_fonts )
       {
-        /* We don't want to go to Success here.  We've already done that. */
-        /* On the other hand, if we succeeded we still need to close this */
-        /* stream (we opened a different stream which extracted the       */
-        /* interesting information out of this stream here.  That stream  */
-        /* will still be open and the face will point to it).             */
-        FT_Stream_Free( stream, external_stream );
-        return error;
+        error = load_mac_face( library, stream, face_index, aface, args );
+        if ( !error )
+        {
+          /* We don't want to go to Success here.  We've already done   */
+          /* that.  On the other hand, if we succeeded we still need to */
+          /* close this stream (we opened a different stream which      */
+          /* extracted the interesting information out of this stream   */
+          /* here.  That stream will still be open and the face will    */
+          /* point to it).                                              */
+          FT_Stream_Free( stream, external_stream );
+          return error;
+        }
       }
 
       if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
@@ -2268,11 +2558,24 @@
 
 
         if ( bsize->height < 0 )
-          bsize->height = (FT_Short)-bsize->height;
+          bsize->height = -bsize->height;
         if ( bsize->x_ppem < 0 )
-          bsize->x_ppem = (FT_Short)-bsize->x_ppem;
+          bsize->x_ppem = -bsize->x_ppem;
         if ( bsize->y_ppem < 0 )
           bsize->y_ppem = -bsize->y_ppem;
+
+        /* check whether negation actually has worked */
+        if ( bsize->height < 0 || bsize->x_ppem < 0 || bsize->y_ppem < 0 )
+        {
+          FT_TRACE0(( "FT_Open_Face:"
+                      " Invalid bitmap dimensions for strike %d,"
+                      " now disabled\n", i ));
+          bsize->width  = 0;
+          bsize->height = 0;
+          bsize->size   = 0;
+          bsize->x_ppem = 0;
+          bsize->y_ppem = 0;
+        }
       }
     }
 
@@ -2290,6 +2593,13 @@
       internal->transform_delta.y = 0;
 
       internal->refcount = 1;
+
+      internal->no_stem_darkening = -1;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+      /* Per-face filtering can only be set up by FT_Face_Properties */
+      internal->lcd_filter_func = NULL;
+#endif
     }
 
     if ( aface )
@@ -2306,7 +2616,20 @@
       destroy_face( memory, face, driver );
 
   Exit:
-    FT_TRACE4(( "FT_Open_Face: Return %d\n", error ));
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( !error && face_index < 0 )
+    {
+      FT_TRACE3(( "FT_Open_Face: The font has %ld face%s\n"
+                  "              and %ld named instance%s for face %ld\n",
+                  face->num_faces,
+                  face->num_faces == 1 ? "" : "s",
+                  face->style_flags >> 16,
+                  ( face->style_flags >> 16 ) == 1 ? "" : "s",
+                  -face_index - 1 ));
+    }
+#endif
+
+    FT_TRACE4(( "FT_Open_Face: Return 0x%x\n", error ));
 
     return error;
   }
@@ -2447,6 +2770,8 @@
     FT_Size          size = NULL;
     FT_ListNode      node = NULL;
 
+    FT_Size_Internal  internal = NULL;
+
 
     if ( !face )
       return FT_THROW( Invalid_Face_Handle );
@@ -2469,8 +2794,10 @@
 
     size->face = face;
 
-    /* for now, do not use any internal fields in size objects */
-    size->internal = NULL;
+    if ( FT_NEW( internal ) )
+      goto Exit;
+
+    size->internal = internal;
 
     if ( clazz->init_size )
       error = clazz->init_size( size );
@@ -2572,6 +2899,9 @@
     w = FT_PIX_ROUND( w );
     h = FT_PIX_ROUND( h );
 
+    if ( !w || !h )
+      return FT_THROW( Invalid_Pixel_Size );
+
     for ( i = 0; i < face->num_fixed_sizes; i++ )
     {
       FT_Bitmap_Size*  bsize = face->available_sizes + i;
@@ -2591,6 +2921,8 @@
       }
     }
 
+    FT_TRACE3(( "FT_Match_Size: no matching bitmap strike\n" ));
+
     return FT_THROW( Invalid_Pixel_Size );
   }
 
@@ -2689,18 +3021,6 @@
       metrics->height      = bsize->height << 6;
       metrics->max_advance = bsize->x_ppem;
     }
-
-    FT_TRACE5(( "FT_Select_Metrics:\n" ));
-    FT_TRACE5(( "  x scale: %d (%f)\n",
-                metrics->x_scale, metrics->x_scale / 65536.0 ));
-    FT_TRACE5(( "  y scale: %d (%f)\n",
-                metrics->y_scale, metrics->y_scale / 65536.0 ));
-    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
-    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
-    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
-    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
-    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
-    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
   }
 
 
@@ -2809,18 +3129,6 @@
       metrics->x_scale = 1L << 16;
       metrics->y_scale = 1L << 16;
     }
-
-    FT_TRACE5(( "FT_Request_Metrics:\n" ));
-    FT_TRACE5(( "  x scale: %d (%f)\n",
-                metrics->x_scale, metrics->x_scale / 65536.0 ));
-    FT_TRACE5(( "  y scale: %d (%f)\n",
-                metrics->y_scale, metrics->y_scale / 65536.0 ));
-    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
-    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
-    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
-    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
-    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
-    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
   }
 
 
@@ -2830,6 +3138,7 @@
   FT_Select_Size( FT_Face  face,
                   FT_Int   strike_index )
   {
+    FT_Error         error = FT_Err_Ok;
     FT_Driver_Class  clazz;
 
 
@@ -2843,36 +3152,37 @@
 
     if ( clazz->select_size )
     {
-      FT_Error  error;
-
-
       error = clazz->select_size( face->size, (FT_ULong)strike_index );
 
-#ifdef FT_DEBUG_LEVEL_TRACE
-      {
-        FT_Size_Metrics*  metrics = &face->size->metrics;
+      FT_TRACE5(( "FT_Select_Size (%s driver):\n",
+                  face->driver->root.clazz->module_name ));
+    }
+    else
+    {
+      FT_Select_Metrics( face, (FT_ULong)strike_index );
 
-
-        FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" ));
-        FT_TRACE5(( "  x scale: %d (%f)\n",
-                    metrics->x_scale, metrics->x_scale / 65536.0 ));
-        FT_TRACE5(( "  y scale: %d (%f)\n",
-                    metrics->y_scale, metrics->y_scale / 65536.0 ));
-        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
-        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
-        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
-        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
-        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
-        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
-      }
-#endif
-
-      return error;
+      FT_TRACE5(( "FT_Select_Size:\n" ));
     }
 
-    FT_Select_Metrics( face, (FT_ULong)strike_index );
+#ifdef FT_DEBUG_LEVEL_TRACE
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
 
-    return FT_Err_Ok;
+
+      FT_TRACE5(( "  x scale: %d (%f)\n",
+                  metrics->x_scale, metrics->x_scale / 65536.0 ));
+      FT_TRACE5(( "  y scale: %d (%f)\n",
+                  metrics->y_scale, metrics->y_scale / 65536.0 ));
+      FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+      FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+      FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+      FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+      FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+      FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+    }
+#endif
+
+    return error;
   }
 
 
@@ -2882,6 +3192,7 @@
   FT_Request_Size( FT_Face          face,
                    FT_Size_Request  req )
   {
+    FT_Error         error = FT_Err_Ok;
     FT_Driver_Class  clazz;
     FT_ULong         strike_index;
 
@@ -2893,59 +3204,60 @@
          req->type >= FT_SIZE_REQUEST_TYPE_MAX )
       return FT_THROW( Invalid_Argument );
 
+    /* signal the auto-hinter to recompute its size metrics */
+    /* (if requested)                                       */
+    face->size->internal->autohint_metrics.x_scale = 0;
+
     clazz = face->driver->clazz;
 
     if ( clazz->request_size )
     {
-      FT_Error  error;
-
-
       error = clazz->request_size( face->size, req );
 
-#ifdef FT_DEBUG_LEVEL_TRACE
-      {
-        FT_Size_Metrics*  metrics = &face->size->metrics;
-
-
-        FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" ));
-        FT_TRACE5(( "  x scale: %d (%f)\n",
-                    metrics->x_scale, metrics->x_scale / 65536.0 ));
-        FT_TRACE5(( "  y scale: %d (%f)\n",
-                    metrics->y_scale, metrics->y_scale / 65536.0 ));
-        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
-        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
-        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
-        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
-        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
-        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
-      }
-#endif
-
-      return error;
+      FT_TRACE5(( "FT_Request_Size (%s driver):\n",
+                  face->driver->root.clazz->module_name ));
     }
-
-    /*
-     * The reason that a driver doesn't have `request_size' defined is
-     * either that the scaling here suffices or that the supported formats
-     * are bitmap-only and size matching is not implemented.
-     *
-     * In the latter case, a simple size matching is done.
-     */
-    if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
+    else if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
     {
-      FT_Error  error;
-
-
+      /*
+       * The reason that a driver doesn't have `request_size' defined is
+       * either that the scaling here suffices or that the supported formats
+       * are bitmap-only and size matching is not implemented.
+       *
+       * In the latter case, a simple size matching is done.
+       */
       error = FT_Match_Size( face, req, 0, &strike_index );
       if ( error )
         return error;
 
       return FT_Select_Size( face, (FT_Int)strike_index );
     }
+    else
+    {
+      FT_Request_Metrics( face, req );
 
-    FT_Request_Metrics( face, req );
+      FT_TRACE5(( "FT_Request_Size:\n" ));
+    }
 
-    return FT_Err_Ok;
+#ifdef FT_DEBUG_LEVEL_TRACE
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+      FT_TRACE5(( "  x scale: %d (%f)\n",
+                  metrics->x_scale, metrics->x_scale / 65536.0 ));
+      FT_TRACE5(( "  y scale: %d (%f)\n",
+                  metrics->y_scale, metrics->y_scale / 65536.0 ));
+      FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+      FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+      FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+      FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+      FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+      FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+    }
+#endif
+
+    return error;
   }
 
 
@@ -3068,18 +3380,37 @@
 
           if ( kern_mode != FT_KERNING_UNFITTED )
           {
+            FT_Pos  orig_x = akerning->x;
+            FT_Pos  orig_y = akerning->y;
+
+
             /* we scale down kerning values for small ppem values */
             /* to avoid that rounding makes them too big.         */
             /* `25' has been determined heuristically.            */
             if ( face->size->metrics.x_ppem < 25 )
-              akerning->x = FT_MulDiv( akerning->x,
+              akerning->x = FT_MulDiv( orig_x,
                                        face->size->metrics.x_ppem, 25 );
             if ( face->size->metrics.y_ppem < 25 )
-              akerning->y = FT_MulDiv( akerning->y,
+              akerning->y = FT_MulDiv( orig_y,
                                        face->size->metrics.y_ppem, 25 );
 
             akerning->x = FT_PIX_ROUND( akerning->x );
             akerning->y = FT_PIX_ROUND( akerning->y );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+            {
+              FT_Pos  orig_x_rounded = FT_PIX_ROUND( orig_x );
+              FT_Pos  orig_y_rounded = FT_PIX_ROUND( orig_y );
+
+
+              if ( akerning->x != orig_x_rounded ||
+                   akerning->y != orig_y_rounded )
+                FT_TRACE5(( "FT_Get_Kerning: horizontal kerning"
+                            " (%d, %d) scaled down to (%d, %d) pixels\n",
+                            orig_x_rounded / 64, orig_y_rounded / 64,
+                            akerning->x / 64, akerning->y / 64 ));
+            }
+#endif
           }
         }
       }
@@ -3291,7 +3622,7 @@
     FT_CMap    cmap = NULL;
 
 
-    if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
+    if ( !clazz || !charmap || !charmap->face )
       return FT_THROW( Invalid_Argument );
 
     face   = charmap->face;
@@ -3350,8 +3681,12 @@
         FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
         FT_TRACE1(( " 0x%x is truncated\n", charcode ));
       }
+
       result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
+      if ( result >= (FT_UInt)face->num_glyphs )
+        result = 0;
     }
+
     return result;
   }
 
@@ -3370,7 +3705,7 @@
     if ( face && face->charmap && face->num_glyphs )
     {
       gindex = FT_Get_Char_Index( face, 0 );
-      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+      if ( gindex == 0 )
         result = FT_Get_Next_Char( face, 0, &gindex );
     }
 
@@ -3416,6 +3751,85 @@
 
   /* documentation is in freetype.h */
 
+  FT_EXPORT_DEF( FT_Error )
+  FT_Face_Properties( FT_Face        face,
+                      FT_UInt        num_properties,
+                      FT_Parameter*  properties )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( num_properties > 0 && !properties )
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
+
+    for ( ; num_properties > 0; num_properties-- )
+    {
+      if ( properties->tag == FT_PARAM_TAG_STEM_DARKENING )
+      {
+        if ( properties->data )
+        {
+          if ( *( (FT_Bool*)properties->data ) == TRUE )
+            face->internal->no_stem_darkening = FALSE;
+          else
+            face->internal->no_stem_darkening = TRUE;
+        }
+        else
+        {
+          /* use module default */
+          face->internal->no_stem_darkening = -1;
+        }
+      }
+      else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS )
+      {
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+        if ( properties->data )
+        {
+          ft_memcpy( face->internal->lcd_weights,
+                     properties->data,
+                     FT_LCD_FILTER_FIVE_TAPS );
+          face->internal->lcd_filter_func = ft_lcd_filter_fir;
+        }
+#else
+        error = FT_THROW( Unimplemented_Feature );
+        goto Exit;
+#endif
+      }
+      else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED )
+      {
+        if ( properties->data )
+        {
+          face->internal->random_seed = *( (FT_Int32*)properties->data );
+          if ( face->internal->random_seed < 0 )
+            face->internal->random_seed = 0;
+        }
+        else
+        {
+          /* use module default */
+          face->internal->random_seed = -1;
+        }
+      }
+      else
+      {
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+
+      if ( error )
+        break;
+
+      properties++;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
   FT_EXPORT_DEF( FT_UInt )
   FT_Face_GetCharVariantIndex( FT_Face   face,
                                FT_ULong  charcode,
@@ -3432,19 +3846,21 @@
       FT_CMap     ucmap = FT_CMAP( face->charmap );
 
 
-      if ( charmap != NULL )
+      if ( charmap )
       {
         FT_CMap  vcmap = FT_CMAP( charmap );
 
 
         if ( charcode > 0xFFFFFFFFUL )
         {
-          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( "FT_Face_GetCharVariantIndex:"
+                      " too large charcode" ));
           FT_TRACE1(( " 0x%x is truncated\n", charcode ));
         }
         if ( variantSelector > 0xFFFFFFFFUL )
         {
-          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( "FT_Face_GetCharVariantIndex:"
+                      " too large variantSelector" ));
           FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
         }
 
@@ -3473,19 +3889,21 @@
       FT_CharMap  charmap = find_variant_selector_charmap( face );
 
 
-      if ( charmap != NULL )
+      if ( charmap )
       {
         FT_CMap  vcmap = FT_CMAP( charmap );
 
 
         if ( charcode > 0xFFFFFFFFUL )
         {
-          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:"
+                      " too large charcode" ));
           FT_TRACE1(( " 0x%x is truncated\n", charcode ));
         }
         if ( variantSelector > 0xFFFFFFFFUL )
         {
-          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:"
+                      " too large variantSelector" ));
           FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
         }
 
@@ -3512,7 +3930,7 @@
       FT_CharMap  charmap = find_variant_selector_charmap( face );
 
 
-      if ( charmap != NULL )
+      if ( charmap )
       {
         FT_CMap    vcmap  = FT_CMAP( charmap );
         FT_Memory  memory = FT_FACE_MEMORY( face );
@@ -3540,7 +3958,7 @@
       FT_CharMap  charmap = find_variant_selector_charmap( face );
 
 
-      if ( charmap != NULL )
+      if ( charmap )
       {
         FT_CMap    vcmap  = FT_CMAP( charmap );
         FT_Memory  memory = FT_FACE_MEMORY( face );
@@ -3548,7 +3966,7 @@
 
         if ( charcode > 0xFFFFFFFFUL )
         {
-          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( "FT_Face_GetVariantsOfChar: too large charcode" ));
           FT_TRACE1(( " 0x%x is truncated\n", charcode ));
         }
 
@@ -3574,7 +3992,7 @@
       FT_CharMap  charmap = find_variant_selector_charmap( face );
 
 
-      if ( charmap != NULL )
+      if ( charmap )
       {
         FT_CMap    vcmap  = FT_CMAP( charmap );
         FT_Memory  memory = FT_FACE_MEMORY( face );
@@ -3702,7 +4120,7 @@
     if ( face && FT_IS_SFNT( face ) )
     {
       FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-      if ( service != NULL )
+      if ( service )
         table = service->get_table( face, tag );
     }
 
@@ -3726,7 +4144,7 @@
       return FT_THROW( Invalid_Face_Handle );
 
     FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-    if ( service == NULL )
+    if ( !service )
       return FT_THROW( Unimplemented_Feature );
 
     return service->load_table( face, tag, offset, buffer, length );
@@ -3751,7 +4169,7 @@
       return FT_THROW( Invalid_Face_Handle );
 
     FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-    if ( service == NULL )
+    if ( !service )
       return FT_THROW( Unimplemented_Feature );
 
     return service->table_info( face, table_index, tag, &offset, length );
@@ -3773,7 +4191,7 @@
 
     face = charmap->face;
     FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
-    if ( service == NULL )
+    if ( !service )
       return 0;
     if ( service->get_cmap_info( charmap, &cmap_info ))
       return 0;
@@ -3797,7 +4215,7 @@
 
     face = charmap->face;
     FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
-    if ( service == NULL )
+    if ( !service )
       return -1;
     if ( service->get_cmap_info( charmap, &cmap_info ))
       return -1;
@@ -4116,8 +4534,17 @@
 #undef  FT_COMPONENT
 #define FT_COMPONENT  trace_bitmap
 
-    /* we convert to a single bitmap format for computing the checksum */
-    if ( !error )
+    /*
+     * Computing the MD5 checksum is expensive, unnecessarily distorting a
+     * possible profiling of FreeType if compiled with tracing support.  For
+     * this reason, we execute the following code only if explicitly
+     * requested.
+     */
+
+    /* we use FT_TRACE3 in this block */
+    if ( !error                             &&
+         ft_trace_levels[trace_bitmap] >= 3 &&
+         slot->bitmap.buffer                )
     {
       FT_Bitmap  bitmap;
       FT_Error   err;
@@ -4125,24 +4552,35 @@
 
       FT_Bitmap_Init( &bitmap );
 
-      /* this also converts the bitmap flow to `down' (i.e., pitch > 0) */
+      /* we convert to a single bitmap format for computing the checksum */
+      /* this also converts the bitmap flow to `down' (i.e., pitch > 0)  */
       err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
       if ( !err )
       {
         MD5_CTX        ctx;
         unsigned char  md5[16];
-        int            i;
-        unsigned int   rows  = bitmap.rows;
-        unsigned int   pitch = (unsigned int)bitmap.pitch;
+        unsigned long  coverage = 0;
+        int            i, j;
+        int            rows  = (int)bitmap.rows;
+        int            pitch = bitmap.pitch;
 
 
+        FT_TRACE3(( "FT_Render_Glyph: bitmap %dx%d, mode %d\n",
+                    rows, pitch, slot->bitmap.pixel_mode ));
+
+        for ( i = 0; i < rows; i++ )
+          for ( j = 0; j < pitch; j++ )
+            coverage += bitmap.buffer[i * pitch + j];
+
+        FT_TRACE3(( "  Total coverage: %lu\n", coverage ));
+
         MD5_Init( &ctx );
-        MD5_Update( &ctx, bitmap.buffer, rows * pitch );
+        if ( bitmap.buffer )
+          MD5_Update( &ctx, bitmap.buffer,
+                      (unsigned long)rows * (unsigned long)pitch );
         MD5_Final( md5, &ctx );
 
-        FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
-                    "  ",
-                    rows, pitch ));
+        FT_TRACE3(( "  MD5 checksum: " ));
         for ( i = 0; i < 16; i++ )
           FT_TRACE3(( "%02X", md5[i] ));
         FT_TRACE3(( "\n" ));
@@ -4151,6 +4589,52 @@
       FT_Bitmap_Done( library, &bitmap );
     }
 
+    /*
+     * Dump bitmap in Netpbm format (PBM or PGM).
+     */
+
+    /* we use FT_TRACE7 in this block */
+    if ( !error                             &&
+         ft_trace_levels[trace_bitmap] >= 7 &&
+         slot->bitmap.rows  < 128U          &&
+         slot->bitmap.width < 128U          &&
+         slot->bitmap.buffer                )
+    {
+      int  rows  = (int)slot->bitmap.rows;
+      int  width = (int)slot->bitmap.width;
+      int  pitch =      slot->bitmap.pitch;
+      int  i, j, m;
+      unsigned char*  topleft = slot->bitmap.buffer;
+
+      if ( pitch < 0 )
+        topleft -= pitch * ( rows - 1 );
+
+      FT_TRACE7(( "Netpbm image: start\n" ));
+      switch ( slot->bitmap.pixel_mode )
+      {
+      case FT_PIXEL_MODE_MONO:
+        FT_TRACE7(( "P1 %d %d\n", width, rows ));
+        for ( i = 0; i < rows; i++ )
+        {
+          for ( j = 0; j < width; )
+            for ( m = 128; m > 0 && j < width; m >>= 1, j++ )
+              FT_TRACE7(( " %d", ( topleft[i * pitch + j / 8] & m ) != 0 ));
+          FT_TRACE7(( "\n" ));
+        }
+        break;
+
+      default:
+        FT_TRACE7(( "P2 %d %d 255\n", width, rows ));
+        for ( i = 0; i < rows; i++ )
+        {
+          for ( j = 0; j < width; j += 1 )
+            FT_TRACE7(( " %3u", topleft[i * pitch + j] ));
+          FT_TRACE7(( "\n" ));
+        }
+      }
+      FT_TRACE7(( "Netpbm image: end\n" ));
+    }
+
 #undef  FT_COMPONENT
 #define FT_COMPONENT  trace_objs
 
@@ -4242,7 +4726,7 @@
   {
     FT_Error   error;
     FT_Memory  memory;
-    FT_Module  module;
+    FT_Module  module = NULL;
     FT_UInt    nn;
 
 
@@ -4255,7 +4739,7 @@
     if ( !clazz )
       return FT_THROW( Invalid_Argument );
 
-    /* check freetype version */
+    /* check FreeType version */
     if ( clazz->module_requires > FREETYPE_VER_FIXED )
       return FT_THROW( Invalid_Version );
 
@@ -4394,7 +4878,8 @@
 
   FT_BASE_DEF( FT_Pointer )
   ft_module_get_service( FT_Module    module,
-                         const char*  service_id )
+                         const char*  service_id,
+                         FT_Bool      global )
   {
     FT_Pointer  result = NULL;
 
@@ -4407,7 +4892,7 @@
       if ( module->clazz->get_interface )
         result = module->clazz->get_interface( module, service_id );
 
-      if ( result == NULL )
+      if ( global && !result )
       {
         /* we didn't find it, look in all other modules then */
         FT_Library  library = module->library;
@@ -4424,7 +4909,7 @@
             if ( cur[0]->clazz->get_interface )
             {
               result = cur[0]->clazz->get_interface( cur[0], service_id );
-              if ( result != NULL )
+              if ( result )
                 break;
             }
           }
@@ -4483,7 +4968,8 @@
                   const FT_String*  module_name,
                   const FT_String*  property_name,
                   void*             value,
-                  FT_Bool           set )
+                  FT_Bool           set,
+                  FT_Bool           value_is_string )
   {
     FT_Module*           cur;
     FT_Module*           limit;
@@ -4553,8 +5039,13 @@
       return FT_THROW( Unimplemented_Feature );
     }
 
-    return set ? service->set_property( cur[0], property_name, value )
-               : service->get_property( cur[0], property_name, value );
+    return set ? service->set_property( cur[0],
+                                        property_name,
+                                        value,
+                                        value_is_string )
+               : service->get_property( cur[0],
+                                        property_name,
+                                        value );
   }
 
 
@@ -4570,7 +5061,8 @@
                            module_name,
                            property_name,
                            (void*)value,
-                           TRUE );
+                           TRUE,
+                           FALSE );
   }
 
 
@@ -4586,10 +5078,33 @@
                            module_name,
                            property_name,
                            value,
+                           FALSE,
                            FALSE );
   }
 
 
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+
+  /* this variant is used for handling the FREETYPE_PROPERTIES */
+  /* environment variable                                      */
+
+  FT_BASE_DEF( FT_Error )
+  ft_property_string_set( FT_Library        library,
+                          const FT_String*  module_name,
+                          const FT_String*  property_name,
+                          FT_String*        value )
+  {
+    return ft_property_do( library,
+                           module_name,
+                           property_name,
+                           (void*)value,
+                           TRUE,
+                           TRUE );
+  }
+
+#endif
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
@@ -4648,10 +5163,6 @@
       goto Fail;
 #endif
 
-    /* we don't use raster_pool anymore. */
-    library->raster_pool_size = 0;
-    library->raster_pool      = NULL;
-
     library->version_major = FREETYPE_MAJOR;
     library->version_minor = FREETYPE_MINOR;
     library->version_patch = FREETYPE_PATCH;
@@ -4666,9 +5177,9 @@
 #ifdef FT_CONFIG_OPTION_PIC
   Fail:
     ft_pic_container_destroy( library );
-#endif
     FT_FREE( library );
     return error;
+#endif
   }
 
 
@@ -4845,7 +5356,8 @@
 
         service = (FT_Service_TrueTypeEngine)
                     ft_module_get_service( module,
-                                           FT_SERVICE_ID_TRUETYPE_ENGINE );
+                                           FT_SERVICE_ID_TRUETYPE_ENGINE,
+                                           0 );
         if ( service )
           result = service->engine_type;
       }
diff --git a/src/base/ftotval.c b/src/base/ftotval.c
index 786457b..a2944a7 100644
--- a/src/base/ftotval.c
+++ b/src/base/ftotval.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating OpenType tables (body).                  */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c
index d821c49..cb91321 100644
--- a/src/base/ftoutln.c
+++ b/src/base/ftoutln.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType outline management (body).                                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -42,7 +42,7 @@
 
 
   static
-  const FT_Outline  null_outline = { 0, 0, 0, 0, 0, 0 };
+  const FT_Outline  null_outline = { 0, 0, NULL, NULL, NULL, 0 };
 
 
   /* documentation is in ftoutln.h */
@@ -52,8 +52,9 @@
                         const FT_Outline_Funcs*  func_interface,
                         void*                    user )
   {
-#undef SCALED
-#define SCALED( x )  ( ( (x) << shift ) - delta )
+#undef  SCALED
+#define SCALED( x )  ( ( (x) < 0 ? -( -(x) << shift )             \
+                                 :  (  (x) << shift ) ) - delta )
 
     FT_Vector   v_last;
     FT_Vector   v_control;
@@ -285,12 +286,13 @@
     FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
     return FT_Err_Ok;
 
-  Exit:
-    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
-    return error;
-
   Invalid_Outline:
-    return FT_THROW( Invalid_Outline );
+    error = FT_THROW( Invalid_Outline );
+    /* fall through */
+
+  Exit:
+    FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error ));
+    return error;
   }
 
 
@@ -414,11 +416,14 @@
     if ( source == target )
       return FT_Err_Ok;
 
-    FT_ARRAY_COPY( target->points, source->points, source->n_points );
+    if ( source->n_points )
+    {
+      FT_ARRAY_COPY( target->points, source->points, source->n_points );
+      FT_ARRAY_COPY( target->tags,   source->tags,   source->n_points );
+    }
 
-    FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
-
-    FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
+    if ( source->n_contours )
+      FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
 
     /* copy all flags, except the `FT_OUTLINE_OWNER' one */
     is_owner      = target->flags & FT_OUTLINE_OWNER;
@@ -536,8 +541,8 @@
 
     for ( n = 0; n < outline->n_points; n++ )
     {
-      vec->x += xOffset;
-      vec->y += yOffset;
+      vec->x = ADD_LONG( vec->x, xOffset );
+      vec->y = ADD_LONG( vec->y, yOffset );
       vec++;
     }
   }
@@ -907,8 +912,7 @@
                          FT_Pos       ystrength )
   {
     FT_Vector*  points;
-    FT_Vector   v_prev, v_first, v_next, v_cur;
-    FT_Int      c, n, first;
+    FT_Int      c, first, last;
     FT_Int      orientation;
 
 
@@ -934,87 +938,98 @@
     first = 0;
     for ( c = 0; c < outline->n_contours; c++ )
     {
-      FT_Vector  in, out, shift;
-      FT_Fixed   l_in, l_out, l, q, d;
-      int        last = outline->contours[c];
+      FT_Vector  in, out, anchor, shift;
+      FT_Fixed   l_in, l_out, l_anchor = 0, l, q, d;
+      FT_Int     i, j, k;
 
 
-      v_first = points[first];
-      v_prev  = points[last];
-      v_cur   = v_first;
+      l_in = 0;
+      last = outline->contours[c];
 
-      /* compute incoming normalized vector */
-      in.x = v_cur.x - v_prev.x;
-      in.y = v_cur.y - v_prev.y;
-      l_in = FT_Vector_Length( &in );
-      if ( l_in )
+      /* pacify compiler */
+      in.x = in.y = anchor.x = anchor.y = 0;
+
+      /* Counter j cycles though the points; counter i advances only  */
+      /* when points are moved; anchor k marks the first moved point. */
+      for ( i = last, j = first, k = -1;
+            j != i && i != k;
+            j = j < last ? j + 1 : first )
       {
-        in.x = FT_DivFix( in.x, l_in );
-        in.y = FT_DivFix( in.y, l_in );
-      }
-
-      for ( n = first; n <= last; n++ )
-      {
-        if ( n < last )
-          v_next = points[n + 1];
-        else
-          v_next = v_first;
-
-        /* compute outgoing normalized vector */
-        out.x = v_next.x - v_cur.x;
-        out.y = v_next.y - v_cur.y;
-        l_out = FT_Vector_Length( &out );
-        if ( l_out )
+        if ( j != k )
         {
-          out.x = FT_DivFix( out.x, l_out );
-          out.y = FT_DivFix( out.y, l_out );
-        }
+          out.x = points[j].x - points[i].x;
+          out.y = points[j].y - points[i].y;
+          l_out = (FT_Fixed)FT_Vector_NormLen( &out );
 
-        d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
-
-        /* shift only if turn is less than ~160 degrees */
-        if ( d > -0xF000L )
-        {
-          d = d + 0x10000L;
-
-          /* shift components are aligned along lateral bisector */
-          /* and directed according to the outline orientation.  */
-          shift.x = in.y + out.y;
-          shift.y = in.x + out.x;
-
-          if ( orientation == FT_ORIENTATION_TRUETYPE )
-            shift.x = -shift.x;
-          else
-            shift.y = -shift.y;
-
-          /* restrict shift magnitude to better handle collapsing segments */
-          q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
-          if ( orientation == FT_ORIENTATION_TRUETYPE )
-            q = -q;
-
-          l = FT_MIN( l_in, l_out );
-
-          /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
-          if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
-            shift.x = FT_MulDiv( shift.x, xstrength, d );
-          else
-            shift.x = FT_MulDiv( shift.x, l, q );
-
-
-          if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
-            shift.y = FT_MulDiv( shift.y, ystrength, d );
-          else
-            shift.y = FT_MulDiv( shift.y, l, q );
+          if ( l_out == 0 )
+            continue;
         }
         else
-          shift.x = shift.y = 0;
+        {
+          out   = anchor;
+          l_out = l_anchor;
+        }
 
-        outline->points[n].x = v_cur.x + xstrength + shift.x;
-        outline->points[n].y = v_cur.y + ystrength + shift.y;
+        if ( l_in != 0 )
+        {
+          if ( k < 0 )
+          {
+            k        = i;
+            anchor   = in;
+            l_anchor = l_in;
+          }
 
-        in    = out;
-        l_in  = l_out;
-        v_cur = v_next;
+          d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y );
+
+          /* shift only if turn is less than ~160 degrees */
+          if ( d > -0xF000L )
+          {
+            d = d + 0x10000L;
+
+            /* shift components along lateral bisector in proper orientation */
+            shift.x = in.y + out.y;
+            shift.y = in.x + out.x;
+
+            if ( orientation == FT_ORIENTATION_TRUETYPE )
+              shift.x = -shift.x;
+            else
+              shift.y = -shift.y;
+
+            /* restrict shift magnitude to better handle collapsing segments */
+            q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x );
+            if ( orientation == FT_ORIENTATION_TRUETYPE )
+              q = -q;
+
+            l = FT_MIN( l_in, l_out );
+
+            /* non-strict inequalities avoid divide-by-zero when q == l == 0 */
+            if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) )
+              shift.x = FT_MulDiv( shift.x, xstrength, d );
+            else
+              shift.x = FT_MulDiv( shift.x, l, q );
+
+
+            if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) )
+              shift.y = FT_MulDiv( shift.y, ystrength, d );
+            else
+              shift.y = FT_MulDiv( shift.y, l, q );
+          }
+          else
+            shift.x = shift.y = 0;
+
+          for ( ;
+                i != j;
+                i = i < last ? i + 1 : first )
+          {
+            points[i].x += xstrength + shift.x;
+            points[i].y += ystrength + shift.y;
+          }
+        }
+        else
+          i = j;
+
+        in   = out;
+        l_in = l_out;
       }
 
       first = last + 1;
@@ -1066,13 +1081,17 @@
       FT_Int  last = outline->contours[c];
 
 
-      v_prev = points[last];
+      v_prev.x = points[last].x >> xshift;
+      v_prev.y = points[last].y >> yshift;
 
       for ( n = first; n <= last; n++ )
       {
-        v_cur = points[n];
-        area += ( ( v_cur.y - v_prev.y ) >> yshift ) *
-                ( ( v_cur.x + v_prev.x ) >> xshift );
+        v_cur.x = points[n].x >> xshift;
+        v_cur.y = points[n].y >> yshift;
+
+        area = ADD_LONG( area,
+                         ( v_cur.y - v_prev.y ) * ( v_cur.x + v_prev.x ) );
+
         v_prev = v_cur;
       }
 
diff --git a/src/base/ftpatent.c b/src/base/ftpatent.c
index bf2b085..e23ee2e 100644
--- a/src/base/ftpatent.c
+++ b/src/base/ftpatent.c
@@ -3,9 +3,9 @@
 /*  ftpatent.c                                                             */
 /*                                                                         */
 /*    FreeType API for checking patented TrueType bytecode instructions    */
-/*    (body).                                                              */
+/*    (body).  Obsolete, retained for backward compatibility.              */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,238 +25,14 @@
 #include FT_SERVICE_TRUETYPE_GLYF_H
 
 
-  static FT_Bool
-  _tt_check_patents_in_range( FT_Stream  stream,
-                              FT_ULong   size )
-  {
-    FT_Bool   result = FALSE;
-    FT_Error  error;
-    FT_Bytes  p, end;
-
-
-    if ( FT_FRAME_ENTER( size ) )
-      return 0;
-
-    p   = stream->cursor;
-    end = p + size;
-
-    while ( p < end )
-    {
-      switch (p[0])
-      {
-      case 0x06:  /* SPvTL // */
-      case 0x07:  /* SPvTL +  */
-      case 0x08:  /* SFvTL // */
-      case 0x09:  /* SFvTL +  */
-      case 0x0A:  /* SPvFS    */
-      case 0x0B:  /* SFvFS    */
-        result = TRUE;
-        goto Exit;
-
-      case 0x40:
-        if ( p + 1 >= end )
-          goto Exit;
-
-        p += p[1] + 2;
-        break;
-
-      case 0x41:
-        if ( p + 1 >= end )
-          goto Exit;
-
-        p += p[1] * 2 + 2;
-        break;
-
-      case 0x71:  /* DELTAP2 */
-      case 0x72:  /* DELTAP3 */
-      case 0x73:  /* DELTAC0 */
-      case 0x74:  /* DELTAC1 */
-      case 0x75:  /* DELTAC2 */
-        result = TRUE;
-        goto Exit;
-
-      case 0xB0:
-      case 0xB1:
-      case 0xB2:
-      case 0xB3:
-      case 0xB4:
-      case 0xB5:
-      case 0xB6:
-      case 0xB7:
-        p += ( p[0] - 0xB0 ) + 2;
-        break;
-
-      case 0xB8:
-      case 0xB9:
-      case 0xBA:
-      case 0xBB:
-      case 0xBC:
-      case 0xBD:
-      case 0xBE:
-      case 0xBF:
-        p += ( p[0] - 0xB8 ) * 2 + 3;
-        break;
-
-      default:
-        p += 1;
-        break;
-      }
-    }
-
-  Exit:
-    FT_UNUSED( error );
-    FT_FRAME_EXIT();
-    return result;
-  }
-
-
-  static FT_Bool
-  _tt_check_patents_in_table( FT_Face   face,
-                              FT_ULong  tag )
-  {
-    FT_Stream              stream = face->stream;
-    FT_Error               error  = FT_Err_Ok;
-    FT_Service_SFNT_Table  service;
-    FT_Bool                result = FALSE;
-
-
-    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-
-    if ( service )
-    {
-      FT_UInt   i = 0;
-      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;
-
-
-      for ( i = 0; !error && tag_i != tag ; i++ )
-        error = service->table_info( face, i,
-                                     &tag_i, &offset_i, &length_i );
-
-      if ( error                      ||
-           FT_STREAM_SEEK( offset_i ) )
-        goto Exit;
-
-      result = _tt_check_patents_in_range( stream, length_i );
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  static FT_Bool
-  _tt_face_check_patents( FT_Face  face )
-  {
-    FT_Stream  stream = face->stream;
-    FT_UInt    gindex;
-    FT_Error   error;
-    FT_Bool    result;
-
-    FT_Service_TTGlyf  service;
-
-
-    result = _tt_check_patents_in_table( face, TTAG_fpgm );
-    if ( result )
-      goto Exit;
-
-    result = _tt_check_patents_in_table( face, TTAG_prep );
-    if ( result )
-      goto Exit;
-
-    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
-    if ( service == NULL )
-      goto Exit;
-
-    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
-    {
-      FT_ULong  offset, num_ins, size;
-      FT_Int    num_contours;
-
-
-      offset = service->get_location( face, gindex, &size );
-      if ( size == 0 )
-        continue;
-
-      if ( FT_STREAM_SEEK( offset )      ||
-           FT_READ_SHORT( num_contours ) )
-        continue;
-
-      if ( num_contours >= 0 )  /* simple glyph */
-      {
-        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
-          continue;
-      }
-      else  /* compound glyph */
-      {
-        FT_Bool  has_instr = 0;
-
-
-        if ( FT_STREAM_SKIP( 8 ) )
-          continue;
-
-        /* now read each component */
-        for (;;)
-        {
-          FT_UInt  flags, toskip;
-
-
-          if( FT_READ_USHORT( flags ) )
-            break;
-
-          toskip = 2 + 1 + 1;
-
-          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
-            toskip += 2;
-
-          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
-            toskip += 2;
-          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
-            toskip += 4;
-          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
-            toskip += 8;
-
-          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
-            has_instr = 1;
-
-          if ( FT_STREAM_SKIP( toskip ) )
-            goto NextGlyph;
-
-          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
-            break;
-        }
-
-        if ( !has_instr )
-          goto NextGlyph;
-      }
-
-      if ( FT_READ_USHORT( num_ins ) )
-        continue;
-
-      result = _tt_check_patents_in_range( stream, num_ins );
-      if ( result )
-        goto Exit;
-
-    NextGlyph:
-      ;
-    }
-
-  Exit:
-    return result;
-  }
-
-
   /* documentation is in freetype.h */
 
   FT_EXPORT_DEF( FT_Bool )
   FT_Face_CheckTrueTypePatents( FT_Face  face )
   {
-    FT_Bool  result = FALSE;
+    FT_UNUSED( face );
 
-
-    if ( face && FT_IS_SFNT( face ) )
-      result = _tt_face_check_patents( face );
-
-    return result;
+    return FALSE;
   }
 
 
@@ -266,22 +42,10 @@
   FT_Face_SetUnpatentedHinting( FT_Face  face,
                                 FT_Bool  value )
   {
-    FT_Bool  result = FALSE;
-
-
-#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
-    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
-    if ( face && FT_IS_SFNT( face ) )
-    {
-      result = !face->internal->ignore_unpatented_hinter;
-      face->internal->ignore_unpatented_hinter = !value;
-    }
-#else
     FT_UNUSED( face );
     FT_UNUSED( value );
-#endif
 
-    return result;
+    return FALSE;
   }
 
 /* END */
diff --git a/src/base/ftpfr.c b/src/base/ftpfr.c
index 39f089e..bfe1352 100644
--- a/src/base/ftpfr.c
+++ b/src/base/ftpfr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing PFR-specific data (body).                 */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftpic.c b/src/base/ftpic.c
index 6c4b1cd..1492e18 100644
--- a/src/base/ftpic.c
+++ b/src/base/ftpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services (body).              */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftpsprop.c b/src/base/ftpsprop.c
new file mode 100644
index 0000000..459b5e6
--- /dev/null
+++ b/src/base/ftpsprop.c
@@ -0,0 +1,285 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpsprop.c                                                             */
+/*                                                                         */
+/*    Get and set properties of PostScript drivers (body).                 */
+/*    See `ftdriver.h' for available properties.                           */
+/*                                                                         */
+/*  Copyright 2017-2018 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_DRIVER_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_psprops
+
+
+  FT_BASE_CALLBACK_DEF( FT_Error )
+  ps_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params;
+      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      FT_Int   dp[8];
+
+
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        char*        ep;
+        int          i;
+
+
+        /* eight comma-separated numbers */
+        for ( i = 0; i < 7; i++ )
+        {
+          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
+          if ( *ep != ',' || s == ep )
+            return FT_THROW( Invalid_Argument );
+
+          s = ep + 1;
+        }
+
+        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
+        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
+          return FT_THROW( Invalid_Argument );
+
+        darken_params = dp;
+      }
+      else
+#endif
+        darken_params = (FT_Int*)value;
+
+      x1 = darken_params[0];
+      y1 = darken_params[1];
+      x2 = darken_params[2];
+      y2 = darken_params[3];
+      x3 = darken_params[4];
+      y3 = darken_params[5];
+      x4 = darken_params[6];
+      y4 = darken_params[7];
+
+      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
+           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
+           x1 > x2  || x2 > x3  || x3 > x4              ||
+           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
+        return FT_THROW( Invalid_Argument );
+
+      driver->darken_params[0] = x1;
+      driver->darken_params[1] = y1;
+      driver->darken_params[2] = x2;
+      driver->darken_params[3] = y2;
+      driver->darken_params[4] = x3;
+      driver->darken_params[5] = y3;
+      driver->darken_params[6] = x4;
+      driver->darken_params[7] = y4;
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+#if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \
+    defined( T1_CONFIG_OPTION_OLD_ENGINE  )
+      const char*  module_name = module->clazz->module_name;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        if ( !ft_strcmp( s, "adobe" ) )
+          driver->hinting_engine = FT_HINTING_ADOBE;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+        else if ( !ft_strcmp( module_name, "cff" ) &&
+                  !ft_strcmp( s, "freetype" )      )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+        else if ( ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) &&
+                  !ft_strcmp( s, "freetype" )            )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
+      {
+        FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+        if ( *hinting_engine == FT_HINTING_ADOBE
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  !ft_strcmp( module_name, "cff" )       )
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) )
+#endif
+           )
+          driver->hinting_engine = *hinting_engine;
+        else
+          error = FT_ERR( Unimplemented_Feature );
+
+        return error;
+      }
+    }
+
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         nsd = ft_strtol( s, NULL, 10 );
+
+
+        if ( !nsd )
+          driver->no_stem_darkening = FALSE;
+        else
+          driver->no_stem_darkening = TRUE;
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+        driver->no_stem_darkening = *no_stem_darkening;
+      }
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "random-seed" ) )
+    {
+      FT_Int32  random_seed;
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
+      }
+      else
+#endif
+        random_seed = *(FT_Int32*)value;
+
+      if ( random_seed < 0 )
+        random_seed = 0;
+
+      driver->random_seed = random_seed;
+
+      return error;
+    }
+
+    FT_TRACE0(( "ps_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_BASE_CALLBACK_DEF( FT_Error )
+  ps_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   void*        value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params = driver->darken_params;
+      FT_Int*  val           = (FT_Int*)value;
+
+
+      val[0] = darken_params[0];
+      val[1] = darken_params[1];
+      val[2] = darken_params[2];
+      val[3] = darken_params[3];
+      val[4] = darken_params[4];
+      val[5] = darken_params[5];
+      val[6] = darken_params[6];
+      val[7] = darken_params[7];
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt   hinting_engine    = driver->hinting_engine;
+      FT_UInt*  val               = (FT_UInt*)value;
+
+
+      *val = hinting_engine;
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
+      FT_Bool*  val               = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "ps_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+/* END */
diff --git a/src/base/ftrfork.c b/src/base/ftrfork.c
index 82d54f8..c3a2b91 100644
--- a/src/base/ftrfork.c
+++ b/src/base/ftrfork.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Embedded resource forks accessor (body).                             */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
@@ -56,7 +56,7 @@
   {
     FT_Error       error;
     unsigned char  head[16], head2[16];
-    FT_Long        map_pos, rdata_len;
+    FT_Long        map_pos, map_len, rdata_len;
     int            allzeros, allmatch, i;
     FT_Long        type_list;
 
@@ -67,28 +67,64 @@
     if ( error )
       return error;
 
-    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
+    error = FT_Stream_Read( stream, (FT_Byte*)head, 16 );
     if ( error )
       return error;
 
-    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
-                                  ( head[1] << 16 ) |
-                                  ( head[2] <<  8 ) |
-                                    head[3]         );
-    map_pos    = rfork_offset + ( ( head[4] << 24 ) |
-                                  ( head[5] << 16 ) |
-                                  ( head[6] <<  8 ) |
-                                    head[7]         );
-    rdata_len = ( head[ 8] << 24 ) |
-                ( head[ 9] << 16 ) |
-                ( head[10] <<  8 ) |
-                  head[11];
-
-    /* map_len = head[12] .. head[15] */
-
-    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
+    /* ensure positive values */
+    if ( head[0]  >= 0x80 ||
+         head[4]  >= 0x80 ||
+         head[8]  >= 0x80 ||
+         head[12] >= 0x80 )
       return FT_THROW( Unknown_File_Format );
 
+    *rdata_pos = ( head[ 0] << 24 ) |
+                 ( head[ 1] << 16 ) |
+                 ( head[ 2] <<  8 ) |
+                   head[ 3];
+    map_pos    = ( head[ 4] << 24 ) |
+                 ( head[ 5] << 16 ) |
+                 ( head[ 6] <<  8 ) |
+                   head[ 7];
+    rdata_len  = ( head[ 8] << 24 ) |
+                 ( head[ 9] << 16 ) |
+                 ( head[10] <<  8 ) |
+                   head[11];
+    map_len    = ( head[12] << 24 ) |
+                 ( head[13] << 16 ) |
+                 ( head[14] <<  8 ) |
+                   head[15];
+
+    /* the map must not be empty */
+    if ( !map_pos )
+      return FT_THROW( Unknown_File_Format );
+
+    /* check whether rdata and map overlap */
+    if ( *rdata_pos < map_pos )
+    {
+      if ( *rdata_pos > map_pos - rdata_len )
+        return FT_THROW( Unknown_File_Format );
+    }
+    else
+    {
+      if ( map_pos > *rdata_pos - map_len )
+        return FT_THROW( Unknown_File_Format );
+    }
+
+    /* check whether end of rdata or map exceeds stream size */
+    if ( FT_LONG_MAX - rdata_len < *rdata_pos                               ||
+         FT_LONG_MAX - map_len < map_pos                                    ||
+
+         FT_LONG_MAX - ( *rdata_pos + rdata_len ) < rfork_offset            ||
+         FT_LONG_MAX - ( map_pos + map_len ) < rfork_offset                 ||
+
+         (FT_ULong)( rfork_offset + *rdata_pos + rdata_len ) > stream->size ||
+         (FT_ULong)( rfork_offset + map_pos + map_len ) > stream->size      )
+      return FT_THROW( Unknown_File_Format );
+
+    *rdata_pos += rfork_offset;
+    map_pos    += rfork_offset;
+
     error = FT_Stream_Seek( stream, (FT_ULong)map_pos );
     if ( error )
       return error;
@@ -101,7 +137,7 @@
 
     allzeros = 1;
     allmatch = 1;
-    for ( i = 0; i < 16; ++i )
+    for ( i = 0; i < 16; i++ )
     {
       if ( head2[i] != 0 )
         allzeros = 0;
@@ -113,15 +149,14 @@
 
     /* If we have reached this point then it is probably a mac resource */
     /* file.  Now, does it contain any interesting resources?           */
-    /* Skip handle to next resource map, the file resource number, and  */
-    /* attributes.                                                      */
+
     (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
                           + 2      /* skip file resource number */
                           + 2 );   /* skip attributes */
 
-    if ( FT_READ_USHORT( type_list ) )
+    if ( FT_READ_SHORT( type_list ) )
       return error;
-    if ( type_list == -1 )
+    if ( type_list < 0 )
       return FT_THROW( Unknown_File_Format );
 
     error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) );
@@ -170,15 +205,34 @@
     if ( error )
       return error;
 
-    if ( FT_READ_USHORT( cnt ) )
+    if ( FT_READ_SHORT( cnt ) )
       return error;
     cnt++;
 
-    for ( i = 0; i < cnt; ++i )
+    /* `rpos' is a signed 16bit integer offset to resource records; the    */
+    /* size of a resource record is 12 bytes.  The map header is 28 bytes, */
+    /* and a type list needs 10 bytes or more.  If we assume that the name */
+    /* list is empty and we have only a single entry in the type list,     */
+    /* there can be at most                                                */
+    /*                                                                     */
+    /*   (32768 - 28 - 10) / 12 = 2727                                     */
+    /*                                                                     */
+    /* resources.                                                          */
+    /*                                                                     */
+    /* A type list starts with a two-byte counter, followed by 10-byte     */
+    /* type records.  Assuming that there are no resources, the number of  */
+    /* type records can be at most                                         */
+    /*                                                                     */
+    /*   (32768 - 28 - 2) / 8 = 4079                                       */
+    /*                                                                     */
+    if ( cnt > 4079 )
+      return FT_THROW( Invalid_Table );
+
+    for ( i = 0; i < cnt; i++ )
     {
       if ( FT_READ_LONG( tag_internal ) ||
-           FT_READ_USHORT( subcnt )     ||
-           FT_READ_USHORT( rpos )       )
+           FT_READ_SHORT( subcnt )      ||
+           FT_READ_SHORT( rpos )        )
         return error;
 
       FT_TRACE2(( "Resource tags: %c%c%c%c\n",
@@ -194,6 +248,11 @@
         *count = subcnt + 1;
         rpos  += map_offset;
 
+        /* a zero count might be valid in the resource specification, */
+        /* however, it is completely useless to us                    */
+        if ( *count < 1 || *count > 2727 )
+          return FT_THROW( Invalid_Table );
+
         error = FT_Stream_Seek( stream, (FT_ULong)rpos );
         if ( error )
           return error;
@@ -201,35 +260,50 @@
         if ( FT_NEW_ARRAY( ref, *count ) )
           return error;
 
-        for ( j = 0; j < *count; ++j )
+        for ( j = 0; j < *count; j++ )
         {
-          if ( FT_READ_USHORT( ref[j].res_id ) )
+          if ( FT_READ_SHORT( ref[j].res_id ) )
             goto Exit;
-          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
+          if ( FT_STREAM_SKIP( 2 ) )  /* resource name offset */
             goto Exit;
-          if ( FT_READ_LONG( temp ) )
+          if ( FT_READ_LONG( temp ) ) /* attributes (8bit), offset (24bit) */
             goto Exit;
-          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
+          if ( FT_STREAM_SKIP( 4 ) )  /* mbz */
             goto Exit;
 
+          /*
+           * According to Inside Macintosh: More Macintosh Toolbox,
+           * "Resource IDs" (1-46), there are some reserved IDs.
+           * However, FreeType2 is not a font synthesizer, no need
+           * to check the acceptable resource ID.
+           */
+          if ( temp < 0 )
+          {
+            error = FT_THROW( Invalid_Table );
+            goto Exit;
+          }
+
           ref[j].offset = temp & 0xFFFFFFL;
+
           FT_TRACE3(( "             [%d]:"
                       " resource_id=0x%04x, offset=0x%08x\n",
-                      j, ref[j].res_id, ref[j].offset ));
+                      j, (FT_UShort)ref[j].res_id, ref[j].offset ));
         }
 
-        if (sort_by_res_id)
+        if ( sort_by_res_id )
         {
-          ft_qsort( ref, (size_t)*count, sizeof ( FT_RFork_Ref ),
-                    ( int(*)(const void*, const void*) )
-                    ft_raccess_sort_ref_by_id );
+          ft_qsort( ref,
+                    (size_t)*count,
+                    sizeof ( FT_RFork_Ref ),
+                    ( int(*)(const void*,
+                             const void*) )ft_raccess_sort_ref_by_id );
 
           FT_TRACE3(( "             -- sort resources by their ids --\n" ));
-          for ( j = 0; j < *count; ++ j ) {
+
+          for ( j = 0; j < *count; j++ )
             FT_TRACE3(( "             [%d]:"
                         " resource_id=0x%04x, offset=0x%08x\n",
                         j, ref[j].res_id, ref[j].offset ));
-          }
         }
 
         if ( FT_NEW_ARRAY( offsets_internal, *count ) )
@@ -239,7 +313,7 @@
          *      gap between reference IDs are acceptable?
          *      further investigation on Apple implementation is needed.
          */
-        for ( j = 0; j < *count; ++j )
+        for ( j = 0; j < *count; j++ )
           offsets_internal[j] = rdata_pos + ref[j].offset;
 
         *offsets = offsets_internal;
@@ -392,7 +466,7 @@
         errors[i] = FT_Err_Ok;
 
       if ( errors[i] )
-        continue ;
+        continue;
 
       errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
                                                  stream, base_name,
@@ -404,7 +478,7 @@
   }
 
 
-#ifndef FT_MACINTOSH
+#if defined( FT_CONFIG_OPTION_MAC_FONTS ) && !defined( FT_MACINTOSH )
   static FT_RFork_Rule
   raccess_get_rule_type_from_rule_index( FT_Library  library,
                                          FT_UInt     rule_index )
diff --git a/src/base/ftsnames.c b/src/base/ftsnames.c
index 80304e5..90ea1e2 100644
--- a/src/base/ftsnames.c
+++ b/src/base/ftsnames.c
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    This is _not_ used to retrieve glyph names!                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,8 @@
 
 
 #include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+
 #include FT_SFNT_NAMES_H
 #include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_INTERNAL_STREAM_H
@@ -54,11 +56,11 @@
 
       if ( idx < (FT_UInt)ttface->num_names )
       {
-        TT_NameEntryRec*  entry = ttface->name_table.names + idx;
+        TT_Name  entry = ttface->name_table.names + idx;
 
 
         /* load name on demand */
-        if ( entry->stringLength > 0 && entry->string == NULL )
+        if ( entry->stringLength > 0 && !entry->string )
         {
           FT_Memory  memory = face->memory;
           FT_Stream  stream = face->stream;
@@ -88,6 +90,58 @@
   }
 
 
+  /* documentation is in ftsnames.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Sfnt_LangTag( FT_Face          face,
+                       FT_UInt          langID,
+                       FT_SfntLangTag  *alangTag )
+  {
+    FT_Error  error = FT_ERR( Invalid_Argument );
+
+
+    if ( alangTag && face && FT_IS_SFNT( face ) )
+    {
+      TT_Face  ttface = (TT_Face)face;
+
+
+      if ( ttface->name_table.format != 1 )
+        return FT_THROW( Invalid_Table );
+
+      if ( langID > 0x8000U                                        &&
+           langID - 0x8000U < ttface->name_table.numLangTagRecords )
+      {
+        TT_LangTag  entry = ttface->name_table.langTags +
+                            ( langID - 0x8000U );
+
+
+        /* load name on demand */
+        if ( entry->stringLength > 0 && !entry->string )
+        {
+          FT_Memory  memory = face->memory;
+          FT_Stream  stream = face->stream;
+
+
+          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||
+               FT_STREAM_SEEK( entry->stringOffset )                ||
+               FT_STREAM_READ( entry->string, entry->stringLength ) )
+          {
+            FT_FREE( entry->string );
+            entry->stringLength = 0;
+          }
+        }
+
+        alangTag->string     = (FT_Byte*)entry->string;
+        alangTag->string_len = entry->stringLength;
+
+        error = FT_Err_Ok;
+      }
+    }
+
+    return error;
+  }
+
+
 #endif /* TT_CONFIG_OPTION_SFNT_NAMES */
 
 
diff --git a/src/base/ftstream.c b/src/base/ftstream.c
index b68f3f8..18df7dc 100644
--- a/src/base/ftstream.c
+++ b/src/base/ftstream.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    I/O stream support (body).                                           */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -778,7 +778,7 @@
 
       case ft_frame_short_be:
       case ft_frame_ushort_be:  /* read a 2-byte big-endian short */
-        value = FT_NEXT_USHORT( cursor) ;
+        value = FT_NEXT_USHORT( cursor );
         sign_shift = 16;
         break;
 
diff --git a/src/base/ftstroke.c b/src/base/ftstroke.c
index 842ee30..6ae1819 100644
--- a/src/base/ftstroke.c
+++ b/src/base/ftstroke.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType path stroker (body).                                        */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,6 +24,16 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_OBJECTS_H
 
+#include "basepic.h"
+
+
+  /* declare an extern to access `ft_outline_glyph_class' globally     */
+  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
+  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */
+#ifndef FT_CONFIG_OPTION_PIC
+  FT_CALLBACK_TABLE const FT_Glyph_Class  ft_outline_glyph_class;
+#endif
+
 
   /* documentation is in ftstroke.h */
 
@@ -702,9 +712,10 @@
                            FT_Outline*      outline )
   {
     /* copy point locations */
-    FT_ARRAY_COPY( outline->points + outline->n_points,
-                   border->points,
-                   border->num_points );
+    if ( border->num_points )
+      FT_ARRAY_COPY( outline->points + outline->n_points,
+                     border->points,
+                     border->num_points );
 
     /* copy tags */
     {
@@ -2285,15 +2296,6 @@
   }
 
 
-  /* declare an extern to access `ft_outline_glyph_class' globally     */
-  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
-  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */
-#ifndef FT_CONFIG_OPTION_PIC
-  extern const FT_Glyph_Class  ft_outline_glyph_class;
-#endif
-#include "basepic.h"
-
-
   /* documentation is in ftstroke.h */
 
   FT_EXPORT_DEF( FT_Error )
diff --git a/src/base/ftsynth.c b/src/base/ftsynth.c
index cd68533..c283467 100644
--- a/src/base/ftsynth.c
+++ b/src/base/ftsynth.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType synthesizing code for emboldening and slanting (body).      */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -123,14 +123,14 @@
 
       /*
        * XXX: overflow check for 16-bit system, for compatibility
-       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+       *      with FT_GlyphSlot_Embolden() since FreeType 2.1.10.
        *      unfortunately, this function return no informations
        *      about the cause of error.
        */
       if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
       {
         FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
-        FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
+        FT_TRACE1(( "too strong emboldening parameter ystr=%d\n", ystr ));
         return;
       }
       error = FT_GlyphSlot_Own_Bitmap( slot );
diff --git a/src/base/ftsystem.c b/src/base/ftsystem.c
index 1938fd8..6adebdb 100644
--- a/src/base/ftsystem.c
+++ b/src/base/ftsystem.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    ANSI-specific FreeType low-level system interface (body).            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/fttrigon.c b/src/base/fttrigon.c
index 5b24304..d6dd098 100644
--- a/src/base/fttrigon.c
+++ b/src/base/fttrigon.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType trigonometric functions (body).                             */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -71,7 +71,8 @@
 
     /* 0x40000000 comes from regression analysis between true */
     /* and CORDIC hypotenuse, so it minimizes the error       */
-    val = (FT_Fixed)( ( (FT_Int64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 );
+    val = (FT_Fixed)(
+            ( (FT_UInt64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 );
 
     return s < 0 ? -val : val;
   }
diff --git a/src/base/fttype1.c b/src/base/fttype1.c
index c549382..aa8f8cc 100644
--- a/src/base/fttype1.c
+++ b/src/base/fttype1.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for PS names support (body).                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftutil.c b/src/base/ftutil.c
index f5b72db..4de5f2c 100644
--- a/src/base/ftutil.c
+++ b/src/base/ftutil.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for memory and list management (body).         */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -74,7 +74,7 @@
     if ( size > 0 )
     {
       block = memory->alloc( memory, size );
-      if ( block == NULL )
+      if ( !block )
         error = FT_THROW( Out_Of_Memory );
     }
     else if ( size < 0 )
@@ -135,25 +135,27 @@
       ft_mem_free( memory, block );
       block = NULL;
     }
-    else if ( new_count > FT_INT_MAX/item_size )
+    else if ( new_count > FT_INT_MAX / item_size )
     {
       error = FT_THROW( Array_Too_Large );
     }
     else if ( cur_count == 0 )
     {
-      FT_ASSERT( block == NULL );
+      FT_ASSERT( !block );
 
-      block = ft_mem_alloc( memory, new_count*item_size, &error );
+      block = memory->alloc( memory, new_count * item_size );
+      if ( block == NULL )
+        error = FT_THROW( Out_Of_Memory );
     }
     else
     {
       FT_Pointer  block2;
-      FT_Long     cur_size = cur_count*item_size;
-      FT_Long     new_size = new_count*item_size;
+      FT_Long     cur_size = cur_count * item_size;
+      FT_Long     new_size = new_count * item_size;
 
 
       block2 = memory->realloc( memory, cur_size, new_size, block );
-      if ( block2 == NULL )
+      if ( !block2 )
         error = FT_THROW( Out_Of_Memory );
       else
         block = block2;
diff --git a/src/base/ftver.rc b/src/base/ftver.rc
new file mode 100644
index 0000000..a2903d5
--- /dev/null
+++ b/src/base/ftver.rc
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftver.rc                                                               */
+/*                                                                         */
+/*    FreeType VERSIONINFO resource for Windows DLLs.                      */
+/*                                                                         */
+/*  Copyright 2018 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<windows.h>
+
+#define FT_VERSION      2,9,1,0
+#define FT_VERSION_STR  "2.9.1"
+
+VS_VERSION_INFO      VERSIONINFO
+FILEVERSION          FT_VERSION
+PRODUCTVERSION       FT_VERSION
+FILEFLAGSMASK        VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+FILEFLAGS            VS_FF_DEBUG
+#endif
+#ifdef _DLL
+FILETYPE             VFT_DLL
+#define FT_FILENAME  "freetype.dll"
+#else
+FILETYPE             VFT_STATIC_LIB
+#define FT_FILENAME  "freetype.lib"
+#endif
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName",      "The FreeType Project"
+      VALUE "FileDescription",  "Font Rendering Library"
+      VALUE "FileVersion",      FT_VERSION_STR
+      VALUE "ProductName",      "FreeType"
+      VALUE "ProductVersion",   FT_VERSION_STR
+      VALUE "LegalCopyright",   "\251 2018 The FreeType Project www.freetype.org. All rights reserved."
+      VALUE "InternalName",     "freetype"
+      VALUE "OriginalFilename", FT_FILENAME
+    END
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN
+    /* The following line should only be modified for localized versions.  */
+    /* It consists of any number of WORD,WORD pairs, with each pair        */
+    /* describing a "language,codepage" combination supported by the file. */
+    VALUE "Translation", 0x409, 1252
+  END
+END
diff --git a/src/base/ftwinfnt.c b/src/base/ftwinfnt.c
index 76a19af..11bd28a 100644
--- a/src/base/ftwinfnt.c
+++ b/src/base/ftwinfnt.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing Windows FNT specific info (body).         */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/md5.c b/src/base/md5.c
index 52d96ac..b235e17 100644
--- a/src/base/md5.c
+++ b/src/base/md5.c
@@ -63,12 +63,19 @@
 	(a) += (b);
 
 /*
- * SET reads 4 input bytes in little-endian byte order and stores them
- * in a properly aligned word in host byte order.
+ * SET reads 4 input bytes in little-endian byte order and stores them in a
+ * properly aligned word in host byte order.
  *
- * The check for little-endian architectures that tolerate unaligned
- * memory accesses is just an optimization.  Nothing will break if it
- * doesn't work.
+ * The check for little-endian architectures that tolerate unaligned memory
+ * accesses is just an optimization.  Nothing will break if it fails to detect
+ * a suitable architecture.
+ *
+ * Unfortunately, this optimization may be a C strict aliasing rules violation
+ * if the caller's data buffer has effective type that cannot be aliased by
+ * MD5_u32plus.  In practice, this problem may occur if these MD5 routines are
+ * inlined into a calling function, or with future and dangerously advanced
+ * link-time optimizations.  For the time being, keeping these MD5 routines in
+ * their own translation unit avoids the problem.
  */
 #if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
 #define SET(n) \
@@ -87,8 +94,8 @@
 #endif
 
 /*
- * This processes one or more 64-byte data blocks, but does NOT update
- * the bit counters.  There are no alignment requirements.
+ * This processes one or more 64-byte data blocks, but does NOT update the bit
+ * counters.  There are no alignment requirements.
  */
 static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
 {
@@ -242,6 +249,12 @@
 	memcpy(ctx->buffer, data, size);
 }
 
+#define OUT(dst, src) \
+	(dst)[0] = (unsigned char)(src); \
+	(dst)[1] = (unsigned char)((src) >> 8); \
+	(dst)[2] = (unsigned char)((src) >> 16); \
+	(dst)[3] = (unsigned char)((src) >> 24);
+
 void MD5_Final(unsigned char *result, MD5_CTX *ctx)
 {
 	unsigned long used, available;
@@ -262,33 +275,15 @@
 	memset(&ctx->buffer[used], 0, available - 8);
 
 	ctx->lo <<= 3;
-	ctx->buffer[56] = ctx->lo;
-	ctx->buffer[57] = ctx->lo >> 8;
-	ctx->buffer[58] = ctx->lo >> 16;
-	ctx->buffer[59] = ctx->lo >> 24;
-	ctx->buffer[60] = ctx->hi;
-	ctx->buffer[61] = ctx->hi >> 8;
-	ctx->buffer[62] = ctx->hi >> 16;
-	ctx->buffer[63] = ctx->hi >> 24;
+	OUT(&ctx->buffer[56], ctx->lo)
+	OUT(&ctx->buffer[60], ctx->hi)
 
 	body(ctx, ctx->buffer, 64);
 
-	result[0] = ctx->a;
-	result[1] = ctx->a >> 8;
-	result[2] = ctx->a >> 16;
-	result[3] = ctx->a >> 24;
-	result[4] = ctx->b;
-	result[5] = ctx->b >> 8;
-	result[6] = ctx->b >> 16;
-	result[7] = ctx->b >> 24;
-	result[8] = ctx->c;
-	result[9] = ctx->c >> 8;
-	result[10] = ctx->c >> 16;
-	result[11] = ctx->c >> 24;
-	result[12] = ctx->d;
-	result[13] = ctx->d >> 8;
-	result[14] = ctx->d >> 16;
-	result[15] = ctx->d >> 24;
+	OUT(&result[0], ctx->a)
+	OUT(&result[4], ctx->b)
+	OUT(&result[8], ctx->c)
+	OUT(&result[12], ctx->d)
 
 	memset(ctx, 0, sizeof(*ctx));
 }
diff --git a/src/base/rules.mk b/src/base/rules.mk
index 1852e08..e9805bd 100644
--- a/src/base/rules.mk
+++ b/src/base/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -40,10 +40,14 @@
             $(BASE_DIR)/ftadvanc.c \
             $(BASE_DIR)/ftcalc.c   \
             $(BASE_DIR)/ftdbgmem.c \
+            $(BASE_DIR)/ftfntfmt.c \
             $(BASE_DIR)/ftgloadr.c \
+            $(BASE_DIR)/fthash.c   \
+            $(BASE_DIR)/ftlcdfil.c \
             $(BASE_DIR)/ftobjs.c   \
             $(BASE_DIR)/ftoutln.c  \
             $(BASE_DIR)/ftpic.c    \
+            $(BASE_DIR)/ftpsprop.c \
             $(BASE_DIR)/ftrfork.c  \
             $(BASE_DIR)/ftsnames.c \
             $(BASE_DIR)/ftstream.c \
diff --git a/src/bdf/Jamfile b/src/bdf/Jamfile
index 006843c..d9e441c 100644
--- a/src/bdf/Jamfile
+++ b/src/bdf/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/bdf Jamfile
 #
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,9 @@
 
   if $(FT2_MULTI)
   {
-    _sources = bdfdrivr bdflib ;
+    _sources = bdfdrivr
+               bdflib
+               ;
   }
   else
   {
diff --git a/src/bdf/README b/src/bdf/README
index b761aba..996ac2d 100644
--- a/src/bdf/README
+++ b/src/bdf/README
@@ -13,7 +13,7 @@
 Adobe Specification V 2.2.  The specification of the BDF font format is
 available from Adobe's web site:
 
-  http://partners.adobe.com/public/developer/en/font/5005.BDF_Spec.pdf
+  https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5005.BDF_Spec.pdf
 
 Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org).
 They do not define vertical metrics, because the X Consortium BDF
diff --git a/src/bdf/bdf.c b/src/bdf/bdf.c
index f95fb76..e54df66 100644
--- a/src/bdf/bdf.c
+++ b/src/bdf/bdf.c
@@ -24,9 +24,10 @@
 THE SOFTWARE.
 */
 
-#define FT_MAKE_OPTION_SINGLE_OBJECT
 
+#define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
+
 #include "bdflib.c"
 #include "bdfdrivr.c"
 
diff --git a/src/bdf/bdf.h b/src/bdf/bdf.h
index bd5a2e4..9012727 100644
--- a/src/bdf/bdf.h
+++ b/src/bdf/bdf.h
@@ -22,8 +22,8 @@
  */
 
 
-#ifndef __BDF_H__
-#define __BDF_H__
+#ifndef BDF_H_
+#define BDF_H_
 
 
 /*
@@ -33,6 +33,7 @@
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_HASH_H
 
 
 FT_BEGIN_HEADER
@@ -40,12 +41,12 @@
 
 /* Imported from bdfP.h */
 
-#define _bdf_glyph_modified( map, e )                 \
-          ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) )
-#define _bdf_set_glyph_modified( map, e )              \
-          ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) )
-#define _bdf_clear_glyph_modified( map, e )             \
-          ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) )
+#define _bdf_glyph_modified( map, e )                     \
+          ( (map)[(e) >> 5] & ( 1UL << ( (e) & 31 ) ) )
+#define _bdf_set_glyph_modified( map, e )                 \
+          ( (map)[(e) >> 5] |= ( 1UL << ( (e) & 31 ) ) )
+#define _bdf_clear_glyph_modified( map, e )               \
+          ( (map)[(e) >> 5] &= ~( 1UL << ( (e) & 31 ) ) )
 
 /* end of bdfP.h */
 
@@ -157,24 +158,6 @@
   } bdf_glyph_t;
 
 
-  typedef struct  _hashnode_
-  {
-    const char*  key;
-    size_t       data;
-
-  } _hashnode, *hashnode;
-
-
-  typedef struct  hashtable_
-  {
-    unsigned int  limit;
-    unsigned int  size;
-    unsigned int  used;
-    hashnode*     table;
-
-  } hashtable;
-
-
   typedef struct  bdf_glyphlist_t_
   {
     unsigned short  pad;          /* Pad to 4-byte boundary.              */
@@ -238,7 +221,7 @@
 
     bdf_property_t*  user_props;
     unsigned long    nuser_props;
-    hashtable        proptbl;
+    FT_HashRec       proptbl;
 
   } bdf_font_t;
 
@@ -291,7 +274,7 @@
 FT_END_HEADER
 
 
-#endif /* __BDF_H__ */
+#endif /* BDF_H_ */
 
 
 /* END */
diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c
index 4b3fb76..ca937f8 100644
--- a/src/bdf/bdfdrivr.c
+++ b/src/bdf/bdfdrivr.c
@@ -276,7 +276,7 @@
 
         len = lengths[nn];
 
-        if ( src == NULL )
+        if ( !src )
           continue;
 
         /* separate elements with a space */
@@ -373,13 +373,14 @@
     /* we have a bdf font: let's construct the face object */
     face->bdffont = font;
 
-    /* BDF could not have multiple face in single font file.
+    /* BDF cannot have multiple faces in a single font file.
      * XXX: non-zero face_index is already invalid argument, but
      *      Type1, Type42 driver has a convention to return
      *      an invalid argument error when the font could be
      *      opened by the specified driver.
      */
-    if ( face_index > 0 ) {
+    if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
+    {
       FT_ERROR(( "BDF_Face_Init: invalid face index\n" ));
       BDF_Face_Done( bdfface );
       return FT_THROW( Invalid_Argument );
@@ -422,7 +423,7 @@
       else
         bdfface->family_name = NULL;
 
-      if ( ( error = bdf_interpret_style( face ) ) != 0 )
+      if ( FT_SET_ERROR( bdf_interpret_style( face ) ) )
         goto Exit;
 
       /* the number of glyphs (with one slot for the undefined glyph */
@@ -436,46 +437,156 @@
       {
         FT_Bitmap_Size*  bsize = bdfface->available_sizes;
         FT_Short         resolution_x = 0, resolution_y = 0;
+        long             value;
 
 
-        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
+        FT_ZERO( bsize );
+
+        /* sanity checks */
+        if ( font->font_ascent > 0x7FFF || font->font_ascent < -0x7FFF )
+        {
+          font->font_ascent = font->font_ascent < 0 ? -0x7FFF : 0x7FFF;
+          FT_TRACE0(( "BDF_Face_Init: clamping font ascent to value %d\n",
+                      font->font_ascent ));
+        }
+        if ( font->font_descent > 0x7FFF || font->font_descent < -0x7FFF )
+        {
+          font->font_descent = font->font_descent < 0 ? -0x7FFF : 0x7FFF;
+          FT_TRACE0(( "BDF_Face_Init: clamping font descent to value %d\n",
+                      font->font_descent ));
+        }
 
         bsize->height = (FT_Short)( font->font_ascent + font->font_descent );
 
         prop = bdf_get_font_property( font, "AVERAGE_WIDTH" );
         if ( prop )
-          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative average width\n" ));
+#endif
+          if ( prop->value.l >    0x7FFFL * 10 - 5   ||
+               prop->value.l < -( 0x7FFFL * 10 - 5 ) )
+          {
+            bsize->width = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping average width to value %d\n",
+                        bsize->width ));
+          }
+          else
+            bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) );
+        }
         else
-          bsize->width = (FT_Short)( bsize->height * 2/3 );
+        {
+          /* this is a heuristical value */
+          bsize->width = (FT_Short)FT_MulDiv( bsize->height, 2, 3 );
+        }
 
         prop = bdf_get_font_property( font, "POINT_SIZE" );
         if ( prop )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative point size\n" ));
+#endif
           /* convert from 722.7 decipoints to 72 points per inch */
-          bsize->size =
-            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );
+          if ( prop->value.l >  0x504C2L || /* 0x7FFF * 72270/7200 */
+               prop->value.l < -0x504C2L )
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = FT_MulDiv( FT_ABS( prop->value.l ),
+                                     64 * 7200,
+                                     72270L );
+        }
+        else if ( font->point_size )
+        {
+          if ( font->point_size > 0x7FFF )
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = (FT_Pos)font->point_size << 6;
+        }
         else
-          bsize->size = bsize->width << 6;
+        {
+          /* this is a heuristical value */
+          bsize->size = bsize->width * 64;
+        }
 
         prop = bdf_get_font_property( font, "PIXEL_SIZE" );
         if ( prop )
-          bsize->y_ppem = (FT_Short)prop->value.l << 6;
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative pixel size\n" ));
+#endif
+          if ( prop->value.l > 0x7FFF || prop->value.l < -0x7FFF )
+          {
+            bsize->y_ppem = 0x7FFF << 6;
+            FT_TRACE0(( "BDF_Face_Init: clamping pixel size to value %d\n",
+                        bsize->y_ppem ));
+          }
+          else
+            bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6;
+        }
 
         prop = bdf_get_font_property( font, "RESOLUTION_X" );
         if ( prop )
-          resolution_x = (FT_Short)prop->value.l;
+          value = prop->value.l;
+        else
+          value = (long)font->resolution_x;
+        if ( value )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( value < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative X resolution\n" ));
+#endif
+          if ( value > 0x7FFF || value < -0x7FFF )
+          {
+            resolution_x = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping X resolution to value %d\n",
+                        resolution_x ));
+          }
+          else
+            resolution_x = FT_ABS( (FT_Short)value );
+        }
 
         prop = bdf_get_font_property( font, "RESOLUTION_Y" );
         if ( prop )
-          resolution_y = (FT_Short)prop->value.l;
+          value = prop->value.l;
+        else
+          value = (long)font->resolution_y;
+        if ( value )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( value < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative Y resolution\n" ));
+#endif
+          if ( value > 0x7FFF || value < -0x7FFF )
+          {
+            resolution_y = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping Y resolution to value %d\n",
+                        resolution_y ));
+          }
+          else
+            resolution_y = FT_ABS( (FT_Short)value );
+        }
 
         if ( bsize->y_ppem == 0 )
         {
           bsize->y_ppem = bsize->size;
           if ( resolution_y )
-            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
+            bsize->y_ppem = FT_MulDiv( bsize->y_ppem, resolution_y, 72 );
         }
         if ( resolution_x && resolution_y )
-          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
+          bsize->x_ppem = FT_MulDiv( bsize->y_ppem,
+                                     resolution_x,
+                                     resolution_y );
         else
           bsize->x_ppem = bsize->y_ppem;
       }
@@ -544,7 +655,11 @@
               if ( !ft_strcmp( s, "10646" )                      ||
                    ( !ft_strcmp( s, "8859" ) &&
                      !ft_strcmp( face->charset_encoding, "1" ) ) )
-              unicode_charmap = 1;
+                unicode_charmap = 1;
+              /* another name for ASCII */
+              else if ( !ft_strcmp( s, "646.1991" )                 &&
+                        !ft_strcmp( face->charset_encoding, "IRV" ) )
+                unicode_charmap = 1;
             }
 
             {
@@ -565,12 +680,6 @@
               }
 
               error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
-
-#if 0
-              /* Select default charmap */
-              if ( bdfface->num_charmaps )
-                bdfface->charmap = bdfface->charmaps[0];
-#endif
             }
 
             goto Exit;
@@ -615,9 +724,9 @@
 
     FT_Select_Metrics( size->face, strike_index );
 
-    size->metrics.ascender    = bdffont->font_ascent << 6;
-    size->metrics.descender   = -bdffont->font_descent << 6;
-    size->metrics.max_advance = bdffont->bbx.width << 6;
+    size->metrics.ascender    = bdffont->font_ascent * 64;
+    size->metrics.descender   = -bdffont->font_descent * 64;
+    size->metrics.max_advance = bdffont->bbx.width * 64;
 
     return FT_Err_Ok;
   }
@@ -704,7 +813,7 @@
 
     bitmap->rows  = glyph.bbx.height;
     bitmap->width = glyph.bbx.width;
-    if ( glyph.bpr > INT_MAX )
+    if ( glyph.bpr > FT_INT_MAX )
       FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n",
                    glyph.bpr ));
     bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */
@@ -734,18 +843,18 @@
     slot->bitmap_left = glyph.bbx.x_offset;
     slot->bitmap_top  = glyph.bbx.ascent;
 
-    slot->metrics.horiAdvance  = (FT_Pos)( glyph.dwidth << 6 );
-    slot->metrics.horiBearingX = (FT_Pos)( glyph.bbx.x_offset << 6 );
-    slot->metrics.horiBearingY = (FT_Pos)( glyph.bbx.ascent << 6 );
-    slot->metrics.width        = (FT_Pos)( bitmap->width << 6 );
-    slot->metrics.height       = (FT_Pos)( bitmap->rows << 6 );
+    slot->metrics.horiAdvance  = (FT_Pos)( glyph.dwidth * 64 );
+    slot->metrics.horiBearingX = (FT_Pos)( glyph.bbx.x_offset * 64 );
+    slot->metrics.horiBearingY = (FT_Pos)( glyph.bbx.ascent * 64 );
+    slot->metrics.width        = (FT_Pos)( bitmap->width * 64 );
+    slot->metrics.height       = (FT_Pos)( bitmap->rows * 64 );
 
     /*
      * XXX DWIDTH1 and VVECTOR should be parsed and
      * used here, provided such fonts do exist.
      */
     ft_synthesize_vertical_metrics( &slot->metrics,
-                                    bdf->bdffont->bbx.height << 6 );
+                                    bdf->bdffont->bbx.height * 64 );
 
   Exit:
     return error;
@@ -823,8 +932,8 @@
 
   static const FT_Service_BDFRec  bdf_service_bdf =
   {
-    (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id,
-    (FT_BDF_GetPropertyFunc) bdf_get_bdf_property
+    (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id,       /* get_charset_id */
+    (FT_BDF_GetPropertyFunc) bdf_get_bdf_property      /* get_property   */
   };
 
 
@@ -865,32 +974,32 @@
       0x10000L,
       0x20000L,
 
-      0,
+      NULL,    /* module-specific interface */
 
-      0,                        /* FT_Module_Constructor */
-      0,                        /* FT_Module_Destructor  */
-      bdf_driver_requester
+      NULL,                     /* FT_Module_Constructor  module_init   */
+      NULL,                     /* FT_Module_Destructor   module_done   */
+      bdf_driver_requester      /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( BDF_FaceRec ),
     sizeof ( FT_SizeRec ),
     sizeof ( FT_GlyphSlotRec ),
 
-    BDF_Face_Init,
-    BDF_Face_Done,
-    0,                          /* FT_Size_InitFunc */
-    0,                          /* FT_Size_DoneFunc */
-    0,                          /* FT_Slot_InitFunc */
-    0,                          /* FT_Slot_DoneFunc */
+    BDF_Face_Init,              /* FT_Face_InitFunc  init_face */
+    BDF_Face_Done,              /* FT_Face_DoneFunc  done_face */
+    NULL,                       /* FT_Size_InitFunc  init_size */
+    NULL,                       /* FT_Size_DoneFunc  done_size */
+    NULL,                       /* FT_Slot_InitFunc  init_slot */
+    NULL,                       /* FT_Slot_DoneFunc  done_slot */
 
-    BDF_Glyph_Load,
+    BDF_Glyph_Load,             /* FT_Slot_LoadFunc  load_glyph */
 
-    0,                          /* FT_Face_GetKerningFunc  */
-    0,                          /* FT_Face_AttachFunc      */
-    0,                          /* FT_Face_GetAdvancesFunc */
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
 
-    BDF_Size_Request,
-    BDF_Size_Select
+    BDF_Size_Request,           /* FT_Size_RequestFunc  request_size */
+    BDF_Size_Select             /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/bdf/bdfdrivr.h b/src/bdf/bdfdrivr.h
index 3c61d64..9455081 100644
--- a/src/bdf/bdfdrivr.h
+++ b/src/bdf/bdfdrivr.h
@@ -25,8 +25,8 @@
 */
 
 
-#ifndef __BDFDRIVR_H__
-#define __BDFDRIVR_H__
+#ifndef BDFDRIVR_H_
+#define BDFDRIVR_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_DRIVER_H
@@ -74,7 +74,7 @@
 FT_END_HEADER
 
 
-#endif /* __BDFDRIVR_H__ */
+#endif /* BDFDRIVR_H_ */
 
 
 /* END */
diff --git a/src/bdf/bdferror.h b/src/bdf/bdferror.h
index ea545ac..b462c7d 100644
--- a/src/bdf/bdferror.h
+++ b/src/bdf/bdferror.h
@@ -26,12 +26,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __BDFERROR_H__
-#define __BDFERROR_H__
+#ifndef BDFERROR_H_
+#define BDFERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  BDF_Err_
@@ -39,7 +39,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __BDFERROR_H__ */
+#endif /* BDFERROR_H_ */
 
 
 /* END */
diff --git a/src/bdf/bdflib.c b/src/bdf/bdflib.c
index 8655d0e..2f5c99d 100644
--- a/src/bdf/bdflib.c
+++ b/src/bdf/bdflib.c
@@ -201,6 +201,7 @@
 #define ACMSG14  "Glyph %ld extra columns removed.\n"
 #define ACMSG15  "Incorrect glyph count: %ld indicated but %ld found.\n"
 #define ACMSG16  "Glyph %ld missing columns padded with zero bits.\n"
+#define ACMSG17  "Adjusting number of glyphs to %ld.\n"
 
   /* Error messages. */
 #define ERRMSG1  "[line %ld] Missing `%s' line.\n"
@@ -220,164 +221,6 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Hash table utilities for the properties.                              */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /* XXX: Replace this with FreeType's hash functions */
-
-
-#define INITIAL_HT_SIZE  241
-
-  typedef void
-  (*hash_free_func)( hashnode  node );
-
-  static hashnode*
-  hash_bucket( const char*  key,
-               hashtable*   ht )
-  {
-    const char*    kp  = key;
-    unsigned long  res = 0;
-    hashnode*      bp  = ht->table, *ndp;
-
-
-    /* Mocklisp hash function. */
-    while ( *kp )
-      res = ( res << 5 ) - res + (unsigned long)*kp++;
-
-    ndp = bp + ( res % ht->size );
-    while ( *ndp )
-    {
-      kp = (*ndp)->key;
-      if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 )
-        break;
-      ndp--;
-      if ( ndp < bp )
-        ndp = bp + ( ht->size - 1 );
-    }
-
-    return ndp;
-  }
-
-
-  static FT_Error
-  hash_rehash( hashtable*  ht,
-               FT_Memory   memory )
-  {
-    hashnode*     obp = ht->table, *bp, *nbp;
-    unsigned int  i, sz = ht->size;
-    FT_Error      error = FT_Err_Ok;
-
-
-    ht->size <<= 1;
-    ht->limit  = ht->size / 3;
-
-    if ( FT_NEW_ARRAY( ht->table, ht->size ) )
-      goto Exit;
-
-    for ( i = 0, bp = obp; i < sz; i++, bp++ )
-    {
-      if ( *bp )
-      {
-        nbp = hash_bucket( (*bp)->key, ht );
-        *nbp = *bp;
-      }
-    }
-    FT_FREE( obp );
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  hash_init( hashtable*  ht,
-             FT_Memory   memory )
-  {
-    unsigned int  sz    = INITIAL_HT_SIZE;
-    FT_Error      error = FT_Err_Ok;
-
-
-    ht->size  = sz;
-    ht->limit = sz / 3;
-    ht->used  = 0;
-
-    if ( FT_NEW_ARRAY( ht->table, sz ) )
-      goto Exit;
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  hash_free( hashtable*  ht,
-             FT_Memory   memory )
-  {
-    if ( ht != 0 )
-    {
-      unsigned int  i, sz = ht->size;
-      hashnode*     bp = ht->table;
-
-
-      for ( i = 0; i < sz; i++, bp++ )
-        FT_FREE( *bp );
-
-      FT_FREE( ht->table );
-    }
-  }
-
-
-  static FT_Error
-  hash_insert( char*       key,
-               size_t      data,
-               hashtable*  ht,
-               FT_Memory   memory )
-  {
-    hashnode   nn;
-    hashnode*  bp      = hash_bucket( key, ht );
-    FT_Error   error   = FT_Err_Ok;
-
-
-    nn = *bp;
-    if ( !nn )
-    {
-      if ( FT_NEW( nn ) )
-        goto Exit;
-      *bp = nn;
-
-      nn->key  = key;
-      nn->data = data;
-
-      if ( ht->used >= ht->limit )
-      {
-        error = hash_rehash( ht, memory );
-        if ( error )
-          goto Exit;
-      }
-      ht->used++;
-    }
-    else
-      nn->data = data;
-
-  Exit:
-    return error;
-  }
-
-
-  static hashnode
-  hash_lookup( const char* key,
-               hashtable*  ht )
-  {
-    hashnode *np = hash_bucket( key, ht );
-
-
-    return *np;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
   /* Utility types and functions.                                          */
   /*                                                                       */
   /*************************************************************************/
@@ -432,6 +275,7 @@
     _bdf_list_t     list;
 
     FT_Memory       memory;
+    unsigned long   size;        /* the stream size */
 
   } _bdf_parse_t;
 
@@ -832,14 +676,6 @@
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
   };
 
-  static const unsigned char  odigits[32] =
-  {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-
   static const unsigned char  ddigits[32] =
   {
     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03,
@@ -857,81 +693,41 @@
   };
 
 
-  /* Routine to convert an ASCII string into an unsigned long integer. */
+  /* Routine to convert a decimal ASCII string to an unsigned long integer. */
   static unsigned long
-  _bdf_atoul( char*         s,
-              char**        end,
-              unsigned int  base )
+  _bdf_atoul( char*  s )
   {
-    unsigned long         v;
-    const unsigned char*  dmap;
+    unsigned long  v;
 
 
     if ( s == 0 || *s == 0 )
       return 0;
 
-    /* Make sure the radix is something recognizable.  Default to 10. */
-    switch ( base )
+    for ( v = 0; sbitset( ddigits, *s ); s++ )
     {
-    case 8:
-      dmap = odigits;
-      break;
-    case 16:
-      dmap = hdigits;
-      break;
-    default:
-      base = 10;
-      dmap = ddigits;
-      break;
+      if ( v < ( FT_ULONG_MAX - 9 ) / 10 )
+        v = v * 10 + a2i[(int)*s];
+      else
+      {
+        v = FT_ULONG_MAX;
+        break;
+      }
     }
 
-    /* Check for the special hex prefix. */
-    if ( *s == '0'                                  &&
-         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
-    {
-      base = 16;
-      dmap = hdigits;
-      s   += 2;
-    }
-
-    for ( v = 0; sbitset( dmap, *s ); s++ )
-      v = v * base + a2i[(int)*s];
-
-    if ( end != 0 )
-      *end = s;
-
     return v;
   }
 
 
-  /* Routine to convert an ASCII string into a signed long integer. */
+  /* Routine to convert a decimal ASCII string to a signed long integer. */
   static long
-  _bdf_atol( char*   s,
-             char**  end,
-             int     base )
+  _bdf_atol( char*  s )
   {
-    long                  v, neg;
-    const unsigned char*  dmap;
+    long  v, neg;
 
 
     if ( s == 0 || *s == 0 )
       return 0;
 
-    /* Make sure the radix is something recognizable.  Default to 10. */
-    switch ( base )
-    {
-    case 8:
-      dmap = odigits;
-      break;
-    case 16:
-      dmap = hdigits;
-      break;
-    default:
-      base = 10;
-      dmap = ddigits;
-      break;
-    }
-
     /* Check for a minus sign. */
     neg = 0;
     if ( *s == '-' )
@@ -940,100 +736,56 @@
       neg = 1;
     }
 
-    /* Check for the special hex prefix. */
-    if ( *s == '0'                                  &&
-         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+    for ( v = 0; sbitset( ddigits, *s ); s++ )
     {
-      base = 16;
-      dmap = hdigits;
-      s   += 2;
+      if ( v < ( FT_LONG_MAX - 9 ) / 10 )
+        v = v * 10 + a2i[(int)*s];
+      else
+      {
+        v = FT_LONG_MAX;
+        break;
+      }
     }
 
-    for ( v = 0; sbitset( dmap, *s ); s++ )
-      v = v * base + a2i[(int)*s];
-
-    if ( end != 0 )
-      *end = s;
-
     return ( !neg ) ? v : -v;
   }
 
 
-  /* Routine to convert an ASCII string into an unsigned short integer. */
+  /* Routine to convert a decimal ASCII string to an unsigned short integer. */
   static unsigned short
-  _bdf_atous( char*         s,
-              char**        end,
-              unsigned int  base )
+  _bdf_atous( char*  s )
   {
-    unsigned short        v;
-    const unsigned char*  dmap;
+    unsigned short  v;
 
 
     if ( s == 0 || *s == 0 )
       return 0;
 
-    /* Make sure the radix is something recognizable.  Default to 10. */
-    switch ( base )
+    for ( v = 0; sbitset( ddigits, *s ); s++ )
     {
-    case 8:
-      dmap = odigits;
-      break;
-    case 16:
-      dmap = hdigits;
-      break;
-    default:
-      base = 10;
-      dmap = ddigits;
-      break;
+      if ( v < ( FT_USHORT_MAX - 9 ) / 10 )
+        v = (unsigned short)( v * 10 + a2i[(int)*s] );
+      else
+      {
+        v = FT_USHORT_MAX;
+        break;
+      }
     }
 
-    /* Check for the special hex prefix. */
-    if ( *s == '0'                                  &&
-         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
-    {
-      base = 16;
-      dmap = hdigits;
-      s   += 2;
-    }
-
-    for ( v = 0; sbitset( dmap, *s ); s++ )
-      v = (unsigned short)( v * base + a2i[(int)*s] );
-
-    if ( end != 0 )
-      *end = s;
-
     return v;
   }
 
 
-  /* Routine to convert an ASCII string into a signed short integer. */
+  /* Routine to convert a decimal ASCII string to a signed short integer. */
   static short
-  _bdf_atos( char*   s,
-             char**  end,
-             int     base )
+  _bdf_atos( char*  s )
   {
-    short                 v, neg;
-    const unsigned char*  dmap;
+    short  v, neg;
 
 
     if ( s == 0 || *s == 0 )
       return 0;
 
-    /* Make sure the radix is something recognizable.  Default to 10. */
-    switch ( base )
-    {
-    case 8:
-      dmap = odigits;
-      break;
-    case 16:
-      dmap = hdigits;
-      break;
-    default:
-      base = 10;
-      dmap = ddigits;
-      break;
-    }
-
     /* Check for a minus. */
     neg = 0;
     if ( *s == '-' )
@@ -1042,21 +794,17 @@
       neg = 1;
     }
 
-    /* Check for the special hex prefix. */
-    if ( *s == '0'                                  &&
-         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+    for ( v = 0; sbitset( ddigits, *s ); s++ )
     {
-      base = 16;
-      dmap = hdigits;
-      s   += 2;
+      if ( v < ( SHRT_MAX - 9 ) / 10 )
+        v = (short)( v * 10 + a2i[(int)*s] );
+      else
+      {
+        v = SHRT_MAX;
+        break;
+      }
     }
 
-    for ( v = 0; sbitset( dmap, *s ); s++ )
-      v = (short)( v * base + a2i[(int)*s] );
-
-    if ( end != 0 )
-      *end = s;
-
     return (short)( ( !neg ) ? v : -v );
   }
 
@@ -1096,7 +844,7 @@
     /* First check whether the property has        */
     /* already been added or not.  If it has, then */
     /* simply ignore it.                           */
-    if ( hash_lookup( name, &(font->proptbl) ) )
+    if ( ft_hash_str_lookup( name, &(font->proptbl) ) )
       goto Exit;
 
     if ( FT_RENEW_ARRAY( font->user_props,
@@ -1121,7 +869,7 @@
 
     n = _num_bdf_properties + font->nuser_props;
 
-    error = hash_insert( p->name, n, &(font->proptbl), memory );
+    error = ft_hash_str_insert( p->name, n, &(font->proptbl), memory );
     if ( error )
       goto Exit;
 
@@ -1132,25 +880,23 @@
   }
 
 
-  FT_LOCAL_DEF( bdf_property_t * )
+  FT_LOCAL_DEF( bdf_property_t* )
   bdf_get_property( char*        name,
                     bdf_font_t*  font )
   {
-    hashnode  hn;
-    size_t    propid;
+    size_t*  propid;
 
 
     if ( name == 0 || *name == 0 )
       return 0;
 
-    if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )
+    if ( ( propid = ft_hash_str_lookup( name, &(font->proptbl) ) ) == NULL )
       return 0;
 
-    propid = hn->data;
-    if ( propid >= _num_bdf_properties )
-      return font->user_props + ( propid - _num_bdf_properties );
+    if ( *propid >= _num_bdf_properties )
+      return font->user_props + ( *propid - _num_bdf_properties );
 
-    return (bdf_property_t*)_bdf_properties + propid;
+    return (bdf_property_t*)_bdf_properties + *propid;
   }
 
 
@@ -1163,30 +909,30 @@
 
   /* Parse flags. */
 
-#define _BDF_START      0x0001U
-#define _BDF_FONT_NAME  0x0002U
-#define _BDF_SIZE       0x0004U
-#define _BDF_FONT_BBX   0x0008U
-#define _BDF_PROPS      0x0010U
-#define _BDF_GLYPHS     0x0020U
-#define _BDF_GLYPH      0x0040U
-#define _BDF_ENCODING   0x0080U
-#define _BDF_SWIDTH     0x0100U
-#define _BDF_DWIDTH     0x0200U
-#define _BDF_BBX        0x0400U
-#define _BDF_BITMAP     0x0800U
+#define BDF_START_      0x0001U
+#define BDF_FONT_NAME_  0x0002U
+#define BDF_SIZE_       0x0004U
+#define BDF_FONT_BBX_   0x0008U
+#define BDF_PROPS_      0x0010U
+#define BDF_GLYPHS_     0x0020U
+#define BDF_GLYPH_      0x0040U
+#define BDF_ENCODING_   0x0080U
+#define BDF_SWIDTH_     0x0100U
+#define BDF_DWIDTH_     0x0200U
+#define BDF_BBX_        0x0400U
+#define BDF_BITMAP_     0x0800U
 
-#define _BDF_SWIDTH_ADJ  0x1000U
+#define BDF_SWIDTH_ADJ_  0x1000U
 
-#define _BDF_GLYPH_BITS ( _BDF_GLYPH    | \
-                          _BDF_ENCODING | \
-                          _BDF_SWIDTH   | \
-                          _BDF_DWIDTH   | \
-                          _BDF_BBX      | \
-                          _BDF_BITMAP   )
+#define BDF_GLYPH_BITS_ ( BDF_GLYPH_    | \
+                          BDF_ENCODING_ | \
+                          BDF_SWIDTH_   | \
+                          BDF_DWIDTH_   | \
+                          BDF_BBX_      | \
+                          BDF_BITMAP_   )
 
-#define _BDF_GLYPH_WIDTH_CHECK   0x40000000UL
-#define _BDF_GLYPH_HEIGHT_CHECK  0x80000000UL
+#define BDF_GLYPH_WIDTH_CHECK_   0x40000000UL
+#define BDF_GLYPH_HEIGHT_CHECK_  0x80000000UL
 
 
   static FT_Error
@@ -1358,8 +1104,7 @@
                      char*          value,
                      unsigned long  lineno )
   {
-    size_t          propid;
-    hashnode        hn;
+    size_t*         propid;
     bdf_property_t  *prop, *fp;
     FT_Memory       memory = font->memory;
     FT_Error        error  = FT_Err_Ok;
@@ -1368,11 +1113,12 @@
 
 
     /* First, check whether the property already exists in the font. */
-    if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 )
+    if ( ( propid = ft_hash_str_lookup( name,
+                                        (FT_Hash)font->internal ) ) != NULL )
     {
       /* The property already exists in the font, so simply replace */
       /* the value of the property with the current value.          */
-      fp = font->props + hn->data;
+      fp = font->props + *propid;
 
       switch ( fp->format )
       {
@@ -1388,11 +1134,11 @@
         break;
 
       case BDF_INTEGER:
-        fp->value.l = _bdf_atol( value, 0, 10 );
+        fp->value.l = _bdf_atol( value );
         break;
 
       case BDF_CARDINAL:
-        fp->value.ul = _bdf_atoul( value, 0, 10 );
+        fp->value.ul = _bdf_atoul( value );
         break;
 
       default:
@@ -1404,16 +1150,16 @@
 
     /* See whether this property type exists yet or not. */
     /* If not, create it.                                */
-    hn = hash_lookup( name, &(font->proptbl) );
-    if ( hn == 0 )
+    propid = ft_hash_str_lookup( name, &(font->proptbl) );
+    if ( !propid )
     {
       error = bdf_create_property( name, BDF_ATOM, font );
       if ( error )
         goto Exit;
-      hn = hash_lookup( name, &(font->proptbl) );
+      propid = ft_hash_str_lookup( name, &(font->proptbl) );
     }
 
-    /* Allocate another property if this is overflow. */
+    /* Allocate another property if this is overflowing. */
     if ( font->props_used == font->props_size )
     {
       if ( font->props_size == 0 )
@@ -1430,15 +1176,14 @@
       }
 
       fp = font->props + font->props_size;
-      FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) );
+      FT_ZERO( fp );
       font->props_size++;
     }
 
-    propid = hn->data;
-    if ( propid >= _num_bdf_properties )
-      prop = font->user_props + ( propid - _num_bdf_properties );
+    if ( *propid >= _num_bdf_properties )
+      prop = font->user_props + ( *propid - _num_bdf_properties );
     else
-      prop = (bdf_property_t*)_bdf_properties + propid;
+      prop = (bdf_property_t*)_bdf_properties + *propid;
 
     fp = font->props + font->props_used;
 
@@ -1458,11 +1203,11 @@
       break;
 
     case BDF_INTEGER:
-      fp->value.l = _bdf_atol( value, 0, 10 );
+      fp->value.l = _bdf_atol( value );
       break;
 
     case BDF_CARDINAL:
-      fp->value.ul = _bdf_atoul( value, 0, 10 );
+      fp->value.ul = _bdf_atoul( value );
       break;
     }
 
@@ -1471,10 +1216,10 @@
     if ( _bdf_strncmp( name, "COMMENT", 7 ) != 0 )
     {
       /* Add the property to the font property table. */
-      error = hash_insert( fp->name,
-                           font->props_used,
-                           (hashtable *)font->internal,
-                           memory );
+      error = ft_hash_str_insert( fp->name,
+                                  font->props_used,
+                                  (FT_Hash)font->internal,
+                                  memory );
       if ( error )
         goto Exit;
     }
@@ -1565,7 +1310,7 @@
     }
 
     /* The very first thing expected is the number of glyphs. */
-    if ( !( p->flags & _BDF_GLYPHS ) )
+    if ( !( p->flags & BDF_GLYPHS_ ) )
     {
       if ( _bdf_strncmp( line, "CHARS", 5 ) != 0 )
       {
@@ -1577,7 +1322,14 @@
       error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
       if ( error )
         goto Exit;
-      p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 );
+      p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1] );
+
+      /* We need at least 20 bytes per glyph. */
+      if ( p->cnt > p->size / 20 )
+      {
+        p->cnt = font->glyphs_size = p->size / 20;
+        FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG17, p->cnt ));
+      }
 
       /* Make sure the number of glyphs is non-zero. */
       if ( p->cnt == 0 )
@@ -1595,7 +1347,7 @@
       if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )
         goto Exit;
 
-      p->flags |= _BDF_GLYPHS;
+      p->flags |= BDF_GLYPHS_;
 
       goto Exit;
     }
@@ -1603,7 +1355,7 @@
     /* Check for the ENDFONT field. */
     if ( _bdf_strncmp( line, "ENDFONT", 7 ) == 0 )
     {
-      if ( p->flags & _BDF_GLYPH_BITS )
+      if ( p->flags & BDF_GLYPH_BITS_ )
       {
         /* Missing ENDCHAR field. */
         FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENDCHAR" ));
@@ -1617,7 +1369,7 @@
                 sizeof ( bdf_glyph_t ),
                 by_encoding );
 
-      p->flags &= ~_BDF_START;
+      p->flags &= ~BDF_START_;
 
       goto Exit;
     }
@@ -1626,14 +1378,14 @@
     if ( _bdf_strncmp( line, "ENDCHAR", 7 ) == 0 )
     {
       p->glyph_enc = 0;
-      p->flags    &= ~_BDF_GLYPH_BITS;
+      p->flags    &= ~BDF_GLYPH_BITS_;
 
       goto Exit;
     }
 
     /* Check whether a glyph is being scanned but should be */
     /* ignored because it is an unencoded glyph.            */
-    if ( ( p->flags & _BDF_GLYPH )     &&
+    if ( ( p->flags & BDF_GLYPH_ )     &&
          p->glyph_enc            == -1 &&
          p->opts->keep_unencoded == 0  )
       goto Exit;
@@ -1641,6 +1393,14 @@
     /* Check for the STARTCHAR field. */
     if ( _bdf_strncmp( line, "STARTCHAR", 9 ) == 0 )
     {
+      if ( p->flags & BDF_GLYPH_BITS_ )
+      {
+        /* Missing ENDCHAR field. */
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENDCHAR" ));
+        error = FT_THROW( Missing_Startchar_Field );
+        goto Exit;
+      }
+
       /* Set the character name in the parse info first until the */
       /* encoding can be checked for an unencoded character.      */
       FT_FREE( p->glyph_name );
@@ -1665,7 +1425,7 @@
 
       FT_MEM_COPY( p->glyph_name, s, slen + 1 );
 
-      p->flags |= _BDF_GLYPH;
+      p->flags |= BDF_GLYPH_;
 
       FT_TRACE4(( DBGMSG1, lineno, s ));
 
@@ -1675,7 +1435,7 @@
     /* Check for the ENCODING field. */
     if ( _bdf_strncmp( line, "ENCODING", 8 ) == 0 )
     {
-      if ( !( p->flags & _BDF_GLYPH ) )
+      if ( !( p->flags & BDF_GLYPH_ ) )
       {
         /* Missing STARTCHAR field. */
         FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" ));
@@ -1687,7 +1447,7 @@
       if ( error )
         goto Exit;
 
-      p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 );
+      p->glyph_enc = _bdf_atol( p->list.field[1] );
 
       /* Normalize negative encoding values.  The specification only */
       /* allows -1, but we can be more generous here.                */
@@ -1696,7 +1456,7 @@
 
       /* Check for alternative encoding format. */
       if ( p->glyph_enc == -1 && p->list.used > 2 )
-        p->glyph_enc = _bdf_atol( p->list.field[2], 0, 10 );
+        p->glyph_enc = _bdf_atol( p->list.field[2] );
 
       if ( p->glyph_enc < -1 )
         p->glyph_enc = -1;
@@ -1773,20 +1533,25 @@
           glyph           = font->unencoded + font->unencoded_used;
           glyph->name     = p->glyph_name;
           glyph->encoding = (long)font->unencoded_used++;
+
+          /* Reset the initial glyph info. */
+          p->glyph_name = NULL;
         }
         else
+        {
           /* Free up the glyph name if the unencoded shouldn't be */
           /* kept.                                                */
           FT_FREE( p->glyph_name );
+        }
 
         p->glyph_name = NULL;
       }
 
       /* Clear the flags that might be added when width and height are */
       /* checked for consistency.                                      */
-      p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK );
+      p->flags &= ~( BDF_GLYPH_WIDTH_CHECK_ | BDF_GLYPH_HEIGHT_CHECK_ );
 
-      p->flags |= _BDF_ENCODING;
+      p->flags |= BDF_ENCODING_;
 
       goto Exit;
     }
@@ -1798,16 +1563,16 @@
       glyph = font->glyphs + ( font->glyphs_used - 1 );
 
     /* Check whether a bitmap is being constructed. */
-    if ( p->flags & _BDF_BITMAP )
+    if ( p->flags & BDF_BITMAP_ )
     {
       /* If there are more rows than are specified in the glyph metrics, */
       /* ignore the remaining lines.                                     */
       if ( p->row >= (unsigned long)glyph->bbx.height )
       {
-        if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) )
+        if ( !( p->flags & BDF_GLYPH_HEIGHT_CHECK_ ) )
         {
           FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding ));
-          p->flags |= _BDF_GLYPH_HEIGHT_CHECK;
+          p->flags |= BDF_GLYPH_HEIGHT_CHECK_;
           font->modified = 1;
         }
 
@@ -1832,10 +1597,10 @@
       /* If any line has not enough columns,            */
       /* indicate they have been padded with zero bits. */
       if ( i < nibbles                            &&
-           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )
+           !( p->flags & BDF_GLYPH_WIDTH_CHECK_ ) )
       {
         FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG16, glyph->encoding ));
-        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;
+        p->flags       |= BDF_GLYPH_WIDTH_CHECK_;
         font->modified  = 1;
       }
 
@@ -1847,10 +1612,10 @@
       /* If any line has extra columns, indicate they have been removed. */
       if ( i == nibbles                           &&
            sbitset( hdigits, line[nibbles] )      &&
-           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )
+           !( p->flags & BDF_GLYPH_WIDTH_CHECK_ ) )
       {
         FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding ));
-        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;
+        p->flags       |= BDF_GLYPH_WIDTH_CHECK_;
         font->modified  = 1;
       }
 
@@ -1861,15 +1626,15 @@
     /* Expect the SWIDTH (scalable width) field next. */
     if ( _bdf_strncmp( line, "SWIDTH", 6 ) == 0 )
     {
-      if ( !( p->flags & _BDF_ENCODING ) )
+      if ( !( p->flags & BDF_ENCODING_ ) )
         goto Missing_Encoding;
 
       error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
       if ( error )
         goto Exit;
 
-      glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );
-      p->flags |= _BDF_SWIDTH;
+      glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1] );
+      p->flags |= BDF_SWIDTH_;
 
       goto Exit;
     }
@@ -1877,16 +1642,16 @@
     /* Expect the DWIDTH (scalable width) field next. */
     if ( _bdf_strncmp( line, "DWIDTH", 6 ) == 0 )
     {
-      if ( !( p->flags & _BDF_ENCODING ) )
+      if ( !( p->flags & BDF_ENCODING_ ) )
         goto Missing_Encoding;
 
       error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
       if ( error )
         goto Exit;
 
-      glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );
+      glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1] );
 
-      if ( !( p->flags & _BDF_SWIDTH ) )
+      if ( !( p->flags & BDF_SWIDTH_ ) )
       {
         /* Missing SWIDTH field.  Emit an auto correction message and set */
         /* the scalable width from the device width.                      */
@@ -1898,24 +1663,24 @@
                                      font->resolution_x ) );
       }
 
-      p->flags |= _BDF_DWIDTH;
+      p->flags |= BDF_DWIDTH_;
       goto Exit;
     }
 
     /* Expect the BBX field next. */
     if ( _bdf_strncmp( line, "BBX", 3 ) == 0 )
     {
-      if ( !( p->flags & _BDF_ENCODING ) )
+      if ( !( p->flags & BDF_ENCODING_ ) )
         goto Missing_Encoding;
 
       error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
       if ( error )
         goto Exit;
 
-      glyph->bbx.width    = _bdf_atous( p->list.field[1], 0, 10 );
-      glyph->bbx.height   = _bdf_atous( p->list.field[2], 0, 10 );
-      glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
-      glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+      glyph->bbx.width    = _bdf_atous( p->list.field[1] );
+      glyph->bbx.height   = _bdf_atous( p->list.field[2] );
+      glyph->bbx.x_offset = _bdf_atos( p->list.field[3] );
+      glyph->bbx.y_offset = _bdf_atos( p->list.field[4] );
 
       /* Generate the ascent and descent of the character. */
       glyph->bbx.ascent  = (short)( glyph->bbx.height + glyph->bbx.y_offset );
@@ -1932,7 +1697,7 @@
       p->minlb    = (short)FT_MIN( glyph->bbx.x_offset, p->minlb );
       p->maxlb    = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb );
 
-      if ( !( p->flags & _BDF_DWIDTH ) )
+      if ( !( p->flags & BDF_DWIDTH_ ) )
       {
         /* Missing DWIDTH field.  Emit an auto correction message and set */
         /* the device width to the glyph width.                           */
@@ -1961,12 +1726,12 @@
           else
             _bdf_set_glyph_modified( font->nmod, glyph->encoding );
 
-          p->flags       |= _BDF_SWIDTH_ADJ;
+          p->flags       |= BDF_SWIDTH_ADJ_;
           font->modified  = 1;
         }
       }
 
-      p->flags |= _BDF_BBX;
+      p->flags |= BDF_BBX_;
       goto Exit;
     }
 
@@ -1976,7 +1741,7 @@
       unsigned long  bitmap_size;
 
 
-      if ( !( p->flags & _BDF_BBX ) )
+      if ( !( p->flags & BDF_BBX_ ) )
       {
         /* Missing BBX field. */
         FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" ));
@@ -2001,7 +1766,7 @@
         goto Exit;
 
       p->row    = 0;
-      p->flags |= _BDF_BITMAP;
+      p->flags |= BDF_BITMAP_;
 
       goto Exit;
     }
@@ -2016,7 +1781,7 @@
     error = FT_THROW( Missing_Encoding_Field );
 
   Exit:
-    if ( error && ( p->flags & _BDF_GLYPH ) )
+    if ( error && ( p->flags & BDF_GLYPH_ ) )
       FT_FREE( p->glyph_name );
 
     return error;
@@ -2080,7 +1845,7 @@
         p->font->modified = 1;
       }
 
-      p->flags &= ~_BDF_PROPS;
+      p->flags &= ~BDF_PROPS_;
       *next     = _bdf_parse_glyphs;
 
       goto Exit;
@@ -2178,7 +1943,7 @@
       goto Exit;
     }
 
-    if ( !( p->flags & _BDF_START ) )
+    if ( !( p->flags & BDF_START_ ) )
     {
       memory = p->memory;
 
@@ -2190,7 +1955,7 @@
         goto Exit;
       }
 
-      p->flags = _BDF_START;
+      p->flags = BDF_START_;
       font = p->font = 0;
 
       if ( FT_NEW( font ) )
@@ -2205,22 +1970,22 @@
         bdf_property_t*  prop;
 
 
-        error = hash_init( &(font->proptbl), memory );
+        error = ft_hash_str_init( &(font->proptbl), memory );
         if ( error )
           goto Exit;
         for ( i = 0, prop = (bdf_property_t*)_bdf_properties;
               i < _num_bdf_properties; i++, prop++ )
         {
-          error = hash_insert( prop->name, i,
-                               &(font->proptbl), memory );
+          error = ft_hash_str_insert( prop->name, i,
+                                      &(font->proptbl), memory );
           if ( error )
             goto Exit;
         }
       }
 
-      if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) )
+      if ( FT_ALLOC( p->font->internal, sizeof ( FT_HashRec ) ) )
         goto Exit;
-      error = hash_init( (hashtable *)p->font->internal,memory );
+      error = ft_hash_str_init( (FT_Hash)p->font->internal, memory );
       if ( error )
         goto Exit;
       p->font->spacing      = p->opts->font_spacing;
@@ -2232,7 +1997,7 @@
     /* Check for the start of the properties. */
     if ( _bdf_strncmp( line, "STARTPROPERTIES", 15 ) == 0 )
     {
-      if ( !( p->flags & _BDF_FONT_BBX ) )
+      if ( !( p->flags & BDF_FONT_BBX_ ) )
       {
         /* Missing the FONTBOUNDINGBOX field. */
         FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" ));
@@ -2243,8 +2008,18 @@
       error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
       if ( error )
         goto Exit;
+
       /* at this point, `p->font' can't be NULL */
-      p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 );
+      p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1] );
+      /* We need at least 4 bytes per property. */
+      if ( p->cnt > p->size / 4 )
+      {
+        p->font->props_size = 0;
+
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG5, lineno, "STARTPROPERTIES" ));
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
 
       if ( FT_NEW_ARRAY( p->font->props, p->cnt ) )
       {
@@ -2252,7 +2027,7 @@
         goto Exit;
       }
 
-      p->flags |= _BDF_PROPS;
+      p->flags |= BDF_PROPS_;
       *next     = _bdf_parse_properties;
 
       goto Exit;
@@ -2261,7 +2036,7 @@
     /* Check for the FONTBOUNDINGBOX field. */
     if ( _bdf_strncmp( line, "FONTBOUNDINGBOX", 15 ) == 0 )
     {
-      if ( !( p->flags & _BDF_SIZE ) )
+      if ( !( p->flags & BDF_SIZE_ ) )
       {
         /* Missing the SIZE field. */
         FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" ));
@@ -2273,18 +2048,18 @@
       if ( error )
         goto Exit;
 
-      p->font->bbx.width  = _bdf_atous( p->list.field[1], 0, 10 );
-      p->font->bbx.height = _bdf_atous( p->list.field[2], 0, 10 );
+      p->font->bbx.width  = _bdf_atous( p->list.field[1] );
+      p->font->bbx.height = _bdf_atous( p->list.field[2] );
 
-      p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
-      p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+      p->font->bbx.x_offset = _bdf_atos( p->list.field[3] );
+      p->font->bbx.y_offset = _bdf_atos( p->list.field[4] );
 
       p->font->bbx.ascent  = (short)( p->font->bbx.height +
                                       p->font->bbx.y_offset );
 
       p->font->bbx.descent = (short)( -p->font->bbx.y_offset );
 
-      p->flags |= _BDF_FONT_BBX;
+      p->flags |= BDF_FONT_BBX_;
 
       goto Exit;
     }
@@ -2319,7 +2094,7 @@
       if ( error )
         goto Exit;
 
-      p->flags |= _BDF_FONT_NAME;
+      p->flags |= BDF_FONT_NAME_;
 
       goto Exit;
     }
@@ -2327,7 +2102,7 @@
     /* Check for the SIZE field. */
     if ( _bdf_strncmp( line, "SIZE", 4 ) == 0 )
     {
-      if ( !( p->flags & _BDF_FONT_NAME ) )
+      if ( !( p->flags & BDF_FONT_NAME_ ) )
       {
         /* Missing the FONT field. */
         FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" ));
@@ -2339,42 +2114,35 @@
       if ( error )
         goto Exit;
 
-      p->font->point_size   = _bdf_atoul( p->list.field[1], 0, 10 );
-      p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 );
-      p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 );
+      p->font->point_size   = _bdf_atoul( p->list.field[1] );
+      p->font->resolution_x = _bdf_atoul( p->list.field[2] );
+      p->font->resolution_y = _bdf_atoul( p->list.field[3] );
 
       /* Check for the bits per pixel field. */
       if ( p->list.used == 5 )
       {
-        unsigned short bitcount, i, shift;
+        unsigned short bpp;
 
 
-        p->font->bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 );
+        bpp = (unsigned short)_bdf_atos( p->list.field[4] );
 
-        /* Only values 1, 2, 4, 8 are allowed. */
-        shift = p->font->bpp;
-        bitcount = 0;
-        for ( i = 0; shift > 0; i++ )
-        {
-          if ( shift & 1 )
-            bitcount = i;
-          shift >>= 1;
-        }
+        /* Only values 1, 2, 4, 8 are allowed for greymap fonts. */
+        if ( bpp > 4 )
+          p->font->bpp = 8;
+        else if ( bpp > 2 )
+          p->font->bpp = 4;
+        else if ( bpp > 1 )
+          p->font->bpp = 2;
+        else
+          p->font->bpp = 1;
 
-        shift = (unsigned short)( ( bitcount > 3 ) ? 8
-                                                   : ( 1U << bitcount ) );
-
-        if ( p->font->bpp > shift || p->font->bpp != shift )
-        {
-          /* select next higher value */
-          p->font->bpp = (unsigned short)( shift << 1 );
+        if ( p->font->bpp != bpp )
           FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp ));
-        }
       }
       else
         p->font->bpp = 1;
 
-      p->flags |= _BDF_SIZE;
+      p->flags |= BDF_SIZE_;
 
       goto Exit;
     }
@@ -2385,7 +2153,7 @@
       char  nbuf[128];
 
 
-      if ( !( p->flags & _BDF_FONT_BBX ) )
+      if ( !( p->flags & BDF_FONT_BBX_ ) )
       {
         /* Missing the FONTBOUNDINGBOX field. */
         FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" ));
@@ -2454,6 +2222,7 @@
     memory    = NULL;
     p->opts   = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts );
     p->minlb  = 32767;
+    p->size   = stream->size;
     p->memory = extmemory;  /* only during font creation */
 
     _bdf_list_init( &p->list, extmemory );
@@ -2525,27 +2294,27 @@
           p->font->bbx.height = (unsigned short)( p->maxas + p->maxds );
         }
 
-        if ( p->flags & _BDF_SWIDTH_ADJ )
+        if ( p->flags & BDF_SWIDTH_ADJ_ )
           FT_TRACE2(( "bdf_load_font: " ACMSG8 ));
       }
     }
 
-    if ( p->flags & _BDF_START )
+    if ( p->flags & BDF_START_ )
     {
       /* The ENDFONT field was never reached or did not exist. */
-      if ( !( p->flags & _BDF_GLYPHS ) )
+      if ( !( p->flags & BDF_GLYPHS_ ) )
       {
         /* Error happened while parsing header. */
         FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno ));
         error = FT_THROW( Corrupted_Font_Header );
-        goto Exit;
+        goto Fail;
       }
       else
       {
         /* Error happened when parsing glyphs. */
         FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno ));
         error = FT_THROW( Corrupted_Font_Glyphs );
-        goto Exit;
+        goto Fail;
       }
     }
 
@@ -2564,7 +2333,7 @@
         p->font->comments[p->font->comments_len] = 0;
       }
     }
-    else if ( error == FT_Err_Ok )
+    else if ( !error )
       error = FT_THROW( Invalid_File_Format );
 
     *font = p->font;
@@ -2576,6 +2345,7 @@
 
       memory = extmemory;
 
+      FT_FREE( p->glyph_name );
       FT_FREE( p );
     }
 
@@ -2611,7 +2381,7 @@
     /* Free up the internal hash table of property names. */
     if ( font->internal )
     {
-      hash_free( (hashtable *)font->internal, memory );
+      ft_hash_str_free( (FT_Hash)font->internal, memory );
       FT_FREE( font->internal );
     }
 
@@ -2656,7 +2426,7 @@
     FT_FREE( font->overflow.glyphs );
 
     /* bdf_cleanup */
-    hash_free( &(font->proptbl), memory );
+    ft_hash_str_free( &(font->proptbl), memory );
 
     /* Free up the user defined properties. */
     for ( prop = font->user_props, i = 0;
@@ -2677,15 +2447,15 @@
   bdf_get_font_property( bdf_font_t*  font,
                          const char*  name )
   {
-    hashnode  hn;
+    size_t*  propid;
 
 
     if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 )
       return 0;
 
-    hn = hash_lookup( name, (hashtable *)font->internal );
+    propid = ft_hash_str_lookup( name, (FT_Hash)font->internal );
 
-    return hn ? ( font->props + hn->data ) : 0;
+    return propid ? ( font->props + *propid ) : 0;
   }
 
 
diff --git a/src/bzip2/Jamfile b/src/bzip2/Jamfile
index 53f850e..3548eab 100644
--- a/src/bzip2/Jamfile
+++ b/src/bzip2/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/bzip2 Jamfile
 #
-# Copyright 2010-2015 by
+# Copyright 2010-2018 by
 # Joel Klinghed
 #
 # based on `src/lzw/Jamfile'
diff --git a/src/bzip2/ftbzip2.c b/src/bzip2/ftbzip2.c
index 4dfc9c8..1601948 100644
--- a/src/bzip2/ftbzip2.c
+++ b/src/bzip2/ftbzip2.c
@@ -8,7 +8,7 @@
 /*  parse compressed PCF fonts, as found with many X11 server              */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2010-2015 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  Joel Klinghed.                                                         */
 /*                                                                         */
 /*  based on `src/gzip/ftgzip.c'                                           */
@@ -32,7 +32,7 @@
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  Bzip2_Err_
@@ -180,7 +180,7 @@
     bzstream->next_in  = (char*)zip->buffer;
 
     if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK ||
-         bzstream->next_in == NULL                       )
+         !bzstream->next_in                              )
       error = FT_THROW( Invalid_File_Format );
 
   Exit:
@@ -254,7 +254,10 @@
       size = stream->read( stream, stream->pos, zip->input,
                            FT_BZIP2_BUFFER_SIZE );
       if ( size == 0 )
+      {
+        zip->limit = zip->cursor;
         return FT_THROW( Invalid_Stream_Operation );
+      }
     }
     else
     {
@@ -263,7 +266,10 @@
         size = FT_BZIP2_BUFFER_SIZE;
 
       if ( size == 0 )
+      {
+        zip->limit = zip->cursor;
         return FT_THROW( Invalid_Stream_Operation );
+      }
 
       FT_MEM_COPY( zip->input, stream->base + stream->pos, size );
     }
@@ -310,7 +316,8 @@
       }
       else if ( err != BZ_OK )
       {
-        error = FT_THROW( Invalid_Stream_Operation );
+        zip->limit = zip->cursor;
+        error      = FT_THROW( Invalid_Stream_Operation );
         break;
       }
     }
@@ -437,16 +444,16 @@
   }
 
 
-  static FT_ULong
-  ft_bzip2_stream_io( FT_Stream  stream,
-                      FT_ULong   pos,
-                      FT_Byte*   buffer,
-                      FT_ULong   count )
+  static unsigned long
+  ft_bzip2_stream_io( FT_Stream       stream,
+                      unsigned long   offset,
+                      unsigned char*  buffer,
+                      unsigned long   count )
   {
     FT_BZip2File  zip = (FT_BZip2File)stream->descriptor.pointer;
 
 
-    return ft_bzip2_file_io( zip, pos, buffer, count );
+    return ft_bzip2_file_io( zip, offset, buffer, count );
   }
 
 
diff --git a/src/bzip2/rules.mk b/src/bzip2/rules.mk
index 7040588..95954d7 100644
--- a/src/bzip2/rules.mk
+++ b/src/bzip2/rules.mk
@@ -2,7 +2,7 @@
 # FreeType 2 BZIP2 support configuration rules
 #
 
-# Copyright 2010-2015 by
+# Copyright 2010-2018 by
 # Joel Klinghed.
 #
 # based on `src/lzw/rules.mk'
diff --git a/src/cache/Jamfile b/src/cache/Jamfile
index 75d8997..53f4c7b 100644
--- a/src/cache/Jamfile
+++ b/src/cache/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/cache Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -11,25 +11,19 @@
 
 SubDir  FT2_TOP $(FT2_SRC_DIR) cache ;
 
-# The file <ftcache.h> contains some macro definitions that are
-# later used in #include statements related to the cache sub-system.  It
-# needs to be parsed through a HDRMACRO rule for macro definitions.
-#
-HDRMACRO  [ FT2_SubDir  include ftcache.h ] ;
-
 {
   local  _sources ;
 
   if $(FT2_MULTI)
   {
-    _sources = ftcmru
-               ftcmanag
+    _sources = ftcbasic
                ftccache
                ftcglyph
-               ftcsbits
                ftcimage
-               ftcbasic
+               ftcmanag
                ftccmap
+               ftcmru
+               ftcsbits
                ;
   }
   else
diff --git a/src/cache/ftcache.c b/src/cache/ftcache.c
index 8de527a..1b425af 100644
--- a/src/cache/ftcache.c
+++ b/src/cache/ftcache.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Caching sub-system (body only).                         */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,15 +17,16 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "ftcmru.c"
-#include "ftcmanag.c"
+
+#include "ftcbasic.c"
 #include "ftccache.c"
 #include "ftccmap.c"
 #include "ftcglyph.c"
 #include "ftcimage.c"
+#include "ftcmanag.c"
+#include "ftcmru.c"
 #include "ftcsbits.c"
-#include "ftcbasic.c"
+
 
 /* END */
diff --git a/src/cache/ftcbasic.c b/src/cache/ftcbasic.c
index ac3290c..994aa12 100644
--- a/src/cache/ftcbasic.c
+++ b/src/cache/ftcbasic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType basic cache interface (body).                           */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -237,12 +237,14 @@
   {
     {
       sizeof ( FTC_BasicFamilyRec ),
-      ftc_basic_family_compare,
-      ftc_basic_family_init,
-      0,                        /* FTC_MruNode_ResetFunc */
-      0                         /* FTC_MruNode_DoneFunc  */
+
+      ftc_basic_family_compare, /* FTC_MruNode_CompareFunc  node_compare */
+      ftc_basic_family_init,    /* FTC_MruNode_InitFunc     node_init    */
+      NULL,                     /* FTC_MruNode_ResetFunc    node_reset   */
+      NULL                      /* FTC_MruNode_DoneFunc     node_done    */
     },
-    ftc_basic_family_load_glyph
+
+    ftc_basic_family_load_glyph /* FTC_IFamily_LoadGlyphFunc  family_load_glyph */
   };
 
 
@@ -250,16 +252,17 @@
   const FTC_GCacheClassRec  ftc_basic_image_cache_class =
   {
     {
-      ftc_inode_new,
-      ftc_inode_weight,
-      ftc_gnode_compare,
-      ftc_basic_gnode_compare_faceid,
-      ftc_inode_free,
+      ftc_inode_new,                  /* FTC_Node_NewFunc      node_new           */
+      ftc_inode_weight,               /* FTC_Node_WeightFunc   node_weight        */
+      ftc_gnode_compare,              /* FTC_Node_CompareFunc  node_compare       */
+      ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc  node_remove_faceid */
+      ftc_inode_free,                 /* FTC_Node_FreeFunc     node_free          */
 
       sizeof ( FTC_GCacheRec ),
-      ftc_gcache_init,
-      ftc_gcache_done
+      ftc_gcache_init,                /* FTC_Cache_InitFunc    cache_init         */
+      ftc_gcache_done                 /* FTC_Cache_DoneFunc    cache_done         */
     },
+
     (FTC_MruListClass)&ftc_basic_image_family_class
   };
 
@@ -301,10 +304,18 @@
     if ( anode )
       *anode  = NULL;
 
-    if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX )
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_ImageType->flags' is of type `FT_Int32'.
+     *
+     * On 16bit systems, higher bits of type->flags cannot be handled.
+     */
+#if 0xFFFFFFFFUL > FT_UINT_MAX
+    if ( (type->flags & (FT_ULong)FT_UINT_MAX) )
       FT_TRACE1(( "FTC_ImageCache_Lookup:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler.face_id = type->face_id;
     query.attrs.scaler.width   = type->width;
@@ -374,11 +385,18 @@
     if ( anode )
       *anode  = NULL;
 
-    /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_Face->face_flags' is of type `FT_Long'.
+     *
+     * On long > int systems, higher bits of load_flags cannot be handled.
+     */
+#if FT_ULONG_MAX > FT_UINT_MAX
     if ( load_flags > FT_UINT_MAX )
       FT_TRACE1(( "FTC_ImageCache_LookupScaler:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   load_flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler     = scaler[0];
     query.attrs.load_flags = (FT_UInt)load_flags;
@@ -419,11 +437,12 @@
   {
     {
       sizeof ( FTC_BasicFamilyRec ),
-      ftc_basic_family_compare,
-      ftc_basic_family_init,
-      0,                            /* FTC_MruNode_ResetFunc */
-      0                             /* FTC_MruNode_DoneFunc  */
+      ftc_basic_family_compare,     /* FTC_MruNode_CompareFunc  node_compare */
+      ftc_basic_family_init,        /* FTC_MruNode_InitFunc     node_init    */
+      NULL,                         /* FTC_MruNode_ResetFunc    node_reset   */
+      NULL                          /* FTC_MruNode_DoneFunc     node_done    */
     },
+
     ftc_basic_family_get_count,
     ftc_basic_family_load_bitmap
   };
@@ -433,16 +452,17 @@
   const FTC_GCacheClassRec  ftc_basic_sbit_cache_class =
   {
     {
-      ftc_snode_new,
-      ftc_snode_weight,
-      ftc_snode_compare,
-      ftc_basic_gnode_compare_faceid,
-      ftc_snode_free,
+      ftc_snode_new,                  /* FTC_Node_NewFunc      node_new           */
+      ftc_snode_weight,               /* FTC_Node_WeightFunc   node_weight        */
+      ftc_snode_compare,              /* FTC_Node_CompareFunc  node_compare       */
+      ftc_basic_gnode_compare_faceid, /* FTC_Node_CompareFunc  node_remove_faceid */
+      ftc_snode_free,                 /* FTC_Node_FreeFunc     node_free          */
 
       sizeof ( FTC_GCacheRec ),
-      ftc_gcache_init,
-      ftc_gcache_done
+      ftc_gcache_init,                /* FTC_Cache_InitFunc    cache_init         */
+      ftc_gcache_done                 /* FTC_Cache_DoneFunc    cache_done         */
     },
+
     (FTC_MruListClass)&ftc_basic_sbit_family_class
   };
 
@@ -482,10 +502,18 @@
 
     *ansbit = NULL;
 
-    if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX )
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_ImageType->flags' is of type `FT_Int32'.
+     *
+     * On 16bit systems, higher bits of type->flags cannot be handled.
+     */
+#if 0xFFFFFFFFUL > FT_UINT_MAX
+    if ( (type->flags & (FT_ULong)FT_UINT_MAX) )
       FT_TRACE1(( "FTC_ImageCache_Lookup:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler.face_id = type->face_id;
     query.attrs.scaler.width   = type->width;
@@ -557,11 +585,18 @@
 
     *ansbit = NULL;
 
-    /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_Face->face_flags' is of type `FT_Long'.
+     *
+     * On long > int systems, higher bits of load_flags cannot be handled.
+     */
+#if FT_ULONG_MAX > FT_UINT_MAX
     if ( load_flags > FT_UINT_MAX )
       FT_TRACE1(( "FTC_ImageCache_LookupScaler:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   load_flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler     = scaler[0];
     query.attrs.load_flags = (FT_UInt)load_flags;
diff --git a/src/cache/ftccache.c b/src/cache/ftccache.c
index d8c5b99..12ec585 100644
--- a/src/cache/ftccache.c
+++ b/src/cache/ftccache.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType internal cache interface (body).                        */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -85,7 +85,7 @@
 
 
   /* get a top bucket for specified hash from cache,
-   * body for FTC_NODE__TOP_FOR_HASH( cache, hash )
+   * body for FTC_NODE_TOP_FOR_HASH( cache, hash )
    */
   FT_LOCAL_DEF( FTC_Node* )
   ftc_get_top_node_for_hash( FTC_Cache  cache,
@@ -147,7 +147,7 @@
         for (;;)
         {
           node = *pnode;
-          if ( node == NULL )
+          if ( !node )
             break;
 
           if ( node->hash & ( mask + 1 ) )
@@ -224,7 +224,7 @@
   ftc_node_hash_unlink( FTC_Node   node0,
                         FTC_Cache  cache )
   {
-    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node0->hash );
+    FTC_Node  *pnode = FTC_NODE_TOP_FOR_HASH( cache, node0->hash );
 
 
     for (;;)
@@ -232,7 +232,7 @@
       FTC_Node  node = *pnode;
 
 
-      if ( node == NULL )
+      if ( !node )
       {
         FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" ));
         return;
@@ -257,7 +257,7 @@
   ftc_node_hash_link( FTC_Node   node,
                       FTC_Cache  cache )
   {
-    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node->hash );
+    FTC_Node  *pnode = FTC_NODE_TOP_FOR_HASH( cache, node->hash );
 
 
     node->link = *pnode;
@@ -288,7 +288,7 @@
     cache = manager->caches[node->cache_index];
 
 #ifdef FT_DEBUG_ERROR
-    if ( cache == NULL )
+    if ( !cache )
     {
       FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" ));
       return;
@@ -494,18 +494,18 @@
     FTC_Node_CompareFunc  compare = cache->clazz.node_compare;
 
 
-    if ( cache == NULL || anode == NULL )
+    if ( !cache || !anode )
       return FT_THROW( Invalid_Argument );
 
     /* Go to the `top' node of the list sharing same masked hash */
-    bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );
+    bucket = pnode = FTC_NODE_TOP_FOR_HASH( cache, hash );
 
     /* Lookup a node with exactly same hash and queried properties.  */
     /* NOTE: _nodcomp() may change the linked list to reduce memory. */
     for (;;)
     {
       node = *pnode;
-      if ( node == NULL )
+      if ( !node )
         goto NewNode;
 
       if ( node->hash == hash                           &&
@@ -518,12 +518,12 @@
     if ( list_changed )
     {
       /* Update bucket by modified linked list */
-      bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );
+      bucket = pnode = FTC_NODE_TOP_FOR_HASH( cache, hash );
 
       /* Update pnode by modified linked list */
       while ( *pnode != node )
       {
-        if ( *pnode == NULL )
+        if ( !*pnode )
         {
           FT_ERROR(( "FTC_Cache_Lookup: oops!!!  node missing\n" ));
           goto NewNode;
@@ -576,13 +576,13 @@
       FTC_Node*  pnode  = bucket;
 
 
-      for ( ;; )
+      for (;;)
       {
         FTC_Node  node = *pnode;
         FT_Bool   list_changed = FALSE;
 
 
-        if ( node == NULL )
+        if ( !node )
           break;
 
         if ( cache->clazz.node_remove_faceid( node, face_id,
diff --git a/src/cache/ftccache.h b/src/cache/ftccache.h
index 4e17c7a..859c547 100644
--- a/src/cache/ftccache.h
+++ b/src/cache/ftccache.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType internal cache interface (specification).                   */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,16 +16,16 @@
 /***************************************************************************/
 
 
-#ifndef __FTCCACHE_H__
-#define __FTCCACHE_H__
+#ifndef FTCCACHE_H_
+#define FTCCACHE_H_
 
 
 #include "ftcmru.h"
 
 FT_BEGIN_HEADER
 
-#define _FTC_FACE_ID_HASH( i )                                  \
-          ( ( (FT_Offset)(i) >> 3 ) ^ ( (FT_Offset)(i) << 7 ) )
+#define FTC_FACE_ID_HASH( i )                                  \
+         ( ( (FT_Offset)(i) >> 3 ) ^ ( (FT_Offset)(i) << 7 ) )
 
   /* handle to cache object */
   typedef struct FTC_CacheRec_*  FTC_Cache;
@@ -69,11 +69,11 @@
 #define FTC_NODE( x )    ( (FTC_Node)(x) )
 #define FTC_NODE_P( x )  ( (FTC_Node*)(x) )
 
-#define FTC_NODE__NEXT( x )  FTC_NODE( (x)->mru.next )
-#define FTC_NODE__PREV( x )  FTC_NODE( (x)->mru.prev )
+#define FTC_NODE_NEXT( x )  FTC_NODE( (x)->mru.next )
+#define FTC_NODE_PREV( x )  FTC_NODE( (x)->mru.prev )
 
 #ifdef FTC_INLINE
-#define FTC_NODE__TOP_FOR_HASH( cache, hash )                     \
+#define FTC_NODE_TOP_FOR_HASH( cache, hash )                      \
         ( ( cache )->buckets +                                    \
             ( ( ( ( hash ) &   ( cache )->mask ) < ( cache )->p ) \
               ? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) )        \
@@ -82,7 +82,7 @@
   FT_LOCAL( FTC_Node* )
   ftc_get_top_node_for_hash( FTC_Cache  cache,
                              FT_Offset  hash );
-#define FTC_NODE__TOP_FOR_HASH( cache, hash )            \
+#define FTC_NODE_TOP_FOR_HASH( cache, hash )             \
         ftc_get_top_node_for_hash( ( cache ), ( hash ) )
 #endif
 
@@ -220,15 +220,15 @@
     node  = NULL;                                                        \
                                                                          \
     /* Go to the `top' node of the list sharing same masked hash */      \
-    _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );          \
+    _bucket = _pnode = FTC_NODE_TOP_FOR_HASH( _cache, _hash );           \
                                                                          \
     /* Look up a node with identical hash and queried properties.    */  \
     /* NOTE: _nodcomp() may change the linked list to reduce memory. */  \
     for (;;)                                                             \
     {                                                                    \
       _node = *_pnode;                                                   \
-      if ( _node == NULL )                                               \
-        goto _NewNode;                                                   \
+      if ( !_node )                                                      \
+        goto NewNode_;                                                   \
                                                                          \
       if ( _node->hash == _hash                             &&           \
            _nodcomp( _node, query, _cache, &_list_changed ) )            \
@@ -240,15 +240,15 @@
     if ( _list_changed )                                                 \
     {                                                                    \
       /* Update _bucket by possibly modified linked list */              \
-      _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );        \
+      _bucket = _pnode = FTC_NODE_TOP_FOR_HASH( _cache, _hash );         \
                                                                          \
       /* Update _pnode by possibly modified linked list */               \
       while ( *_pnode != _node )                                         \
       {                                                                  \
-        if ( *_pnode == NULL )                                           \
+        if ( !*_pnode )                                                  \
         {                                                                \
           FT_ERROR(( "FTC_CACHE_LOOKUP_CMP: oops!!! node missing\n" ));  \
-          goto _NewNode;                                                 \
+          goto NewNode_;                                                 \
         }                                                                \
         else                                                             \
           _pnode = &((*_pnode)->link);                                   \
@@ -273,12 +273,12 @@
         FTC_MruNode_Up( (FTC_MruNode*)_nl,                               \
                         (FTC_MruNode)_node );                            \
     }                                                                    \
-    goto _Ok;                                                            \
+    goto Ok_;                                                            \
                                                                          \
-  _NewNode:                                                              \
+  NewNode_:                                                              \
     error = FTC_Cache_NewNode( _cache, _hash, query, &_node );           \
                                                                          \
-  _Ok:                                                                   \
+  Ok_:                                                                   \
     node = _node;                                                        \
   FT_END_STMNT
 
@@ -325,7 +325,7 @@
         break;                                                    \
                                                                   \
       _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \
-      if ( _try_done > 0 && ( list_changed ) )                    \
+      if ( _try_done > 0 && list_changed != NULL )                \
         *(FT_Bool*)( list_changed ) = TRUE;                       \
                                                                   \
       if ( _try_done == 0 )                                       \
@@ -346,7 +346,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCCACHE_H__ */
+#endif /* FTCCACHE_H_ */
 
 
 /* END */
diff --git a/src/cache/ftccback.h b/src/cache/ftccback.h
index b3237d5..e51d8d6 100644
--- a/src/cache/ftccback.h
+++ b/src/cache/ftccback.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Callback functions of the caching sub-system (specification only).   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,8 +15,8 @@
 /*                                                                         */
 /***************************************************************************/
 
-#ifndef __FTCCBACK_H__
-#define __FTCCBACK_H__
+#ifndef FTCCBACK_H_
+#define FTCCBACK_H_
 
 #include <ft2build.h>
 #include FT_CACHE_H
@@ -86,6 +86,7 @@
                     FTC_Manager  manager );
 
 
-#endif /* __FTCCBACK_H__ */
+#endif /* FTCCBACK_H_ */
+
 
 /* END */
diff --git a/src/cache/ftccmap.c b/src/cache/ftccmap.c
index b826222..d20b0f4 100644
--- a/src/cache/ftccmap.c
+++ b/src/cache/ftccmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType CharMap cache (body)                                        */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -50,7 +50,7 @@
 
   /* compute a query/node hash */
 #define FTC_CMAP_HASH( faceid, index, charcode )         \
-          ( _FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \
+          ( FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \
             ( (charcode) / FTC_CMAP_INDICES_MAX )      )
 
   /* the charmap query */
@@ -201,15 +201,15 @@
   static
   const FTC_CacheClassRec  ftc_cmap_cache_class =
   {
-    ftc_cmap_node_new,
-    ftc_cmap_node_weight,
-    ftc_cmap_node_compare,
-    ftc_cmap_node_remove_faceid,
-    ftc_cmap_node_free,
+    ftc_cmap_node_new,           /* FTC_Node_NewFunc      node_new           */
+    ftc_cmap_node_weight,        /* FTC_Node_WeightFunc   node_weight        */
+    ftc_cmap_node_compare,       /* FTC_Node_CompareFunc  node_compare       */
+    ftc_cmap_node_remove_faceid, /* FTC_Node_CompareFunc  node_remove_faceid */
+    ftc_cmap_node_free,          /* FTC_Node_FreeFunc     node_free          */
 
     sizeof ( FTC_CacheRec ),
-    ftc_cache_init,
-    ftc_cache_done,
+    ftc_cache_init,              /* FTC_Cache_InitFunc    cache_init         */
+    ftc_cache_done,              /* FTC_Cache_DoneFunc    cache_done         */
   };
 
 
@@ -259,9 +259,6 @@
       return 0;
     }
 
-    if ( !face_id )
-      return 0;
-
     query.face_id    = face_id;
     query.cmap_index = (FT_UInt)cmap_index;
     query.char_code  = char_code;
diff --git a/src/cache/ftcerror.h b/src/cache/ftcerror.h
index 15adec5..a26cd59 100644
--- a/src/cache/ftcerror.h
+++ b/src/cache/ftcerror.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Caching sub-system error codes (specification only).                 */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __FTCERROR_H__
-#define __FTCERROR_H__
+#ifndef FTCERROR_H_
+#define FTCERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  FTC_Err_
@@ -36,6 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __FTCERROR_H__ */
+#endif /* FTCERROR_H_ */
+
 
 /* END */
diff --git a/src/cache/ftcglyph.c b/src/cache/ftcglyph.c
index 343b8a7..782cc0e 100644
--- a/src/cache/ftcglyph.c
+++ b/src/cache/ftcglyph.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Glyph Image (FT_Glyph) cache (body).                        */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -106,7 +106,7 @@
   FTC_Family_Init( FTC_Family  family,
                    FTC_Cache   cache )
   {
-    FTC_GCacheClass  clazz = FTC_CACHE__GCACHE_CLASS( cache );
+    FTC_GCacheClass  clazz = FTC_CACHE_GCACHE_CLASS( cache );
 
 
     family->clazz     = clazz->family_class;
diff --git a/src/cache/ftcglyph.h b/src/cache/ftcglyph.h
index 6cadbe2..23c24d2 100644
--- a/src/cache/ftcglyph.h
+++ b/src/cache/ftcglyph.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType abstract glyph cache (specification).                       */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -113,8 +113,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTCGLYPH_H__
-#define __FTCGLYPH_H__
+#ifndef FTCGLYPH_H_
+#define FTCGLYPH_H_
 
 
 #include <ft2build.h>
@@ -245,10 +245,10 @@
 
 #define FTC_GCACHE_CLASS( x )  ((FTC_GCacheClass)(x))
 
-#define FTC_CACHE__GCACHE_CLASS( x ) \
+#define FTC_CACHE_GCACHE_CLASS( x ) \
           FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class )
-#define FTC_CACHE__FAMILY_CLASS( x ) \
-          ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class )
+#define FTC_CACHE_FAMILY_CLASS( x ) \
+          ( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class )
 
 
   /* convenience function; use it instead of FTC_Manager_Register_Cache */
@@ -323,7 +323,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCGLYPH_H__ */
+#endif /* FTCGLYPH_H_ */
 
 
 /* END */
diff --git a/src/cache/ftcimage.c b/src/cache/ftcimage.c
index f519a61..77a1001 100644
--- a/src/cache/ftcimage.c
+++ b/src/cache/ftcimage.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Image cache (body).                                         */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -70,7 +70,7 @@
       FTC_GNode         gnode  = FTC_GNODE( inode );
       FTC_Family        family = gquery->family;
       FT_UInt           gindex = gquery->gindex;
-      FTC_IFamilyClass  clazz  = FTC_CACHE__IFAMILY_CLASS( cache );
+      FTC_IFamilyClass  clazz  = FTC_CACHE_IFAMILY_CLASS( cache );
 
 
       /* initialize its inner fields */
diff --git a/src/cache/ftcimage.h b/src/cache/ftcimage.h
index b312eaa..24a2210 100644
--- a/src/cache/ftcimage.h
+++ b/src/cache/ftcimage.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Generic Image cache (specification)                         */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -32,8 +32,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTCIMAGE_H__
-#define __FTCIMAGE_H__
+#ifndef FTCIMAGE_H_
+#define FTCIMAGE_H_
 
 
 #include <ft2build.h>
@@ -72,8 +72,8 @@
 
 #define FTC_IFAMILY_CLASS( x )  ((FTC_IFamilyClass)(x))
 
-#define FTC_CACHE__IFAMILY_CLASS( x ) \
-          FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class )
+#define FTC_CACHE_IFAMILY_CLASS( x ) \
+          FTC_IFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS(x)->family_class )
 
 
   /* can be used as a @FTC_Node_FreeFunc */
@@ -101,7 +101,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTCIMAGE_H__ */
+#endif /* FTCIMAGE_H_ */
 
 
 /* END */
diff --git a/src/cache/ftcmanag.c b/src/cache/ftcmanag.c
index 658614c..2bcd9df 100644
--- a/src/cache/ftcmanag.c
+++ b/src/cache/ftcmanag.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache Manager (body).                                       */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -156,10 +156,11 @@
   const FTC_MruListClassRec  ftc_size_list_class =
   {
     sizeof ( FTC_SizeNodeRec ),
-    ftc_size_node_compare,
-    ftc_size_node_init,
-    ftc_size_node_reset,
-    ftc_size_node_done
+
+    ftc_size_node_compare,  /* FTC_MruNode_CompareFunc  node_compare */
+    ftc_size_node_init,     /* FTC_MruNode_InitFunc     node_init    */
+    ftc_size_node_reset,    /* FTC_MruNode_ResetFunc    node_reset   */
+    ftc_size_node_done      /* FTC_MruNode_DoneFunc     node_done    */
   };
 
 
@@ -296,10 +297,10 @@
   {
     sizeof ( FTC_FaceNodeRec),
 
-    ftc_face_node_compare,
-    ftc_face_node_init,
-    0,                          /* FTC_MruNode_ResetFunc */
-    ftc_face_node_done
+    ftc_face_node_compare,  /* FTC_MruNode_CompareFunc  node_compare */
+    ftc_face_node_init,     /* FTC_MruNode_InitFunc     node_init    */
+    NULL,                   /* FTC_MruNode_ResetFunc    node_reset   */
+    ftc_face_node_done      /* FTC_MruNode_DoneFunc     node_done    */
   };
 
 
@@ -314,7 +315,7 @@
     FTC_MruNode  mrunode;
 
 
-    if ( !aface || !face_id )
+    if ( !aface )
       return FT_THROW( Invalid_Argument );
 
     *aface = NULL;
@@ -494,7 +495,7 @@
         else
           weight += cache->clazz.node_weight( node, cache );
 
-        node = FTC_NODE__NEXT( node );
+        node = FTC_NODE_NEXT( node );
 
       } while ( node != first );
 
@@ -513,7 +514,7 @@
       do
       {
         count++;
-        node = FTC_NODE__NEXT( node );
+        node = FTC_NODE_NEXT( node );
 
       } while ( node != first );
 
@@ -552,17 +553,17 @@
                 manager->num_nodes ));
 #endif
 
-    if ( manager->cur_weight < manager->max_weight || first == NULL )
+    if ( manager->cur_weight < manager->max_weight || !first )
       return;
 
     /* go to last node -- it's a circular list */
-    node = FTC_NODE__PREV( first );
+    node = FTC_NODE_PREV( first );
     do
     {
       FTC_Node  prev;
 
 
-      prev = ( node == first ) ? NULL : FTC_NODE__PREV( node );
+      prev = ( node == first ) ? NULL : FTC_NODE_PREV( node );
 
       if ( node->ref_count <= 0 )
         ftc_node_destroy( node, manager );
@@ -637,14 +638,14 @@
 
 
     /* try to remove `count' nodes from the list */
-    if ( first == NULL )  /* empty list! */
+    if ( !first )  /* empty list! */
       return 0;
 
     /* go to last node - it's a circular list */
-    node = FTC_NODE__PREV(first);
+    node = FTC_NODE_PREV(first);
     for ( result = 0; result < count; )
     {
-      FTC_Node  prev = FTC_NODE__PREV( node );
+      FTC_Node  prev = FTC_NODE_PREV( node );
 
 
       /* don't touch locked nodes */
@@ -672,7 +673,7 @@
     FT_UInt  nn;
 
 
-    if ( !manager || !face_id )
+    if ( !manager )
       return;
 
     /* this will remove all FTC_SizeNode that correspond to
diff --git a/src/cache/ftcmanag.h b/src/cache/ftcmanag.h
index c6787b7..b4b4755 100644
--- a/src/cache/ftcmanag.h
+++ b/src/cache/ftcmanag.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache Manager (specification).                              */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -59,8 +59,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTCMANAG_H__
-#define __FTCMANAG_H__
+#ifndef FTCMANAG_H_
+#define FTCMANAG_H_
 
 
 #include <ft2build.h>
@@ -161,7 +161,7 @@
           (a)->y_res == (b)->y_res ) ) )
 
 #define FTC_SCALER_HASH( q )                                 \
-    ( _FTC_FACE_ID_HASH( (q)->face_id ) +                     \
+    ( FTC_FACE_ID_HASH( (q)->face_id ) +                     \
       (q)->width + (q)->height*7 +                           \
       ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) )
 
@@ -169,7 +169,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTCMANAG_H__ */
+#endif /* FTCMANAG_H_ */
 
 
 /* END */
diff --git a/src/cache/ftcmru.c b/src/cache/ftcmru.c
index 10ce4f3..1087be4 100644
--- a/src/cache/ftcmru.c
+++ b/src/cache/ftcmru.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType MRU support (body).                                         */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -76,7 +76,7 @@
     FTC_MruNode  first = *plist;
 
 
-    FT_ASSERT( first != NULL );
+    FT_ASSERT( first );
 
     if ( first != node )
     {
@@ -126,7 +126,7 @@
     FTC_MruNode  prev, next;
 
 
-    FT_ASSERT( first != NULL );
+    FT_ASSERT( first );
 
 #ifdef FT_DEBUG_ERROR
       {
@@ -238,7 +238,7 @@
                    FTC_MruNode  *anode )
   {
     FT_Error     error;
-    FTC_MruNode  node = NULL;
+    FTC_MruNode  node   = NULL;
     FT_Memory    memory = list->memory;
 
 
@@ -296,7 +296,7 @@
 
 
     node = FTC_MruList_Find( list, key );
-    if ( node == NULL )
+    if ( !node )
       return FTC_MruList_New( list, key, anode );
 
     *anode = node;
@@ -332,7 +332,7 @@
 
 
     first = list->nodes;
-    while ( first && ( selection == NULL || selection( first, key ) ) )
+    while ( first && ( !selection || selection( first, key ) ) )
     {
       FTC_MruList_Remove( list, first );
       first = list->nodes;
diff --git a/src/cache/ftcmru.h b/src/cache/ftcmru.h
index c0c35f9..82396b9 100644
--- a/src/cache/ftcmru.h
+++ b/src/cache/ftcmru.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Simple MRU list-cache (specification).                               */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -40,8 +40,8 @@
   /*************************************************************************/
 
 
-#ifndef __FTCMRU_H__
-#define __FTCMRU_H__
+#ifndef FTCMRU_H_
+#define FTCMRU_H_
 
 
 #include <ft2build.h>
@@ -108,6 +108,7 @@
   typedef struct  FTC_MruListClassRec_
   {
     FT_Offset                node_size;
+
     FTC_MruNode_CompareFunc  node_compare;
     FTC_MruNode_InitFunc     node_init;
     FTC_MruNode_ResetFunc    node_reset;
@@ -115,6 +116,7 @@
 
   } FTC_MruListClassRec;
 
+
   typedef struct  FTC_MruListRec_
   {
     FT_UInt              num_nodes;
@@ -181,15 +183,15 @@
             FTC_MruNode_Up( _pfirst, _node );                               \
                                                                             \
           node = _node;                                                     \
-          goto _MruOk;                                                      \
+          goto MruOk_;                                                      \
         }                                                                   \
         _node = _node->next;                                                \
                                                                             \
-      } while ( _node != _first) ;                                          \
+      } while ( _node != _first);                                           \
     }                                                                       \
                                                                             \
     error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \
-  _MruOk:                                                                   \
+  MruOk_:                                                                   \
     ;                                                                       \
   FT_END_STMNT
 
@@ -240,7 +242,7 @@
 FT_END_HEADER
 
 
-#endif /* __FTCMRU_H__ */
+#endif /* FTCMRU_H_ */
 
 
 /* END */
diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c
index 8141719..018f1ec 100644
--- a/src/cache/ftcsbits.c
+++ b/src/cache/ftcsbits.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType sbits manager (body).                                       */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -53,6 +53,8 @@
       pitch = -pitch;
 
     size = (FT_ULong)pitch * bitmap->rows;
+    if ( !size )
+      return FT_Err_Ok;
 
     if ( !FT_ALLOC( sbit->buffer, size ) )
       FT_MEM_COPY( sbit->buffer, bitmap->buffer, size );
@@ -215,7 +217,7 @@
     FT_UInt     gindex = gquery->gindex;
     FTC_Family  family = gquery->family;
 
-    FTC_SFamilyClass  clazz = FTC_CACHE__SFAMILY_CLASS( cache );
+    FTC_SFamilyClass  clazz = FTC_CACHE_SFAMILY_CLASS( cache );
     FT_UInt           total;
     FT_UInt           node_count;
 
@@ -376,7 +378,7 @@
        *
        */
 
-      if ( sbit->buffer == NULL && sbit->width == 255 )
+      if ( !sbit->buffer && sbit->width == 255 )
       {
         FT_ULong  size;
         FT_Error  error;
diff --git a/src/cache/ftcsbits.h b/src/cache/ftcsbits.h
index 5a2fa1a..206a1bb 100644
--- a/src/cache/ftcsbits.h
+++ b/src/cache/ftcsbits.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    A small-bitmap cache (specification).                                */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTCSBITS_H__
-#define __FTCSBITS_H__
+#ifndef FTCSBITS_H_
+#define FTCSBITS_H_
 
 
 #include <ft2build.h>
@@ -64,8 +64,8 @@
 
 #define FTC_SFAMILY_CLASS( x )  ((FTC_SFamilyClass)(x))
 
-#define FTC_CACHE__SFAMILY_CLASS( x )  \
-          FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class )
+#define FTC_CACHE_SFAMILY_CLASS( x )  \
+          FTC_SFAMILY_CLASS( FTC_CACHE_GCACHE_CLASS( x )->family_class )
 
 
   FT_LOCAL( void )
@@ -97,7 +97,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTCSBITS_H__ */
+#endif /* FTCSBITS_H_ */
 
 
 /* END */
diff --git a/src/cache/rules.mk b/src/cache/rules.mk
index 6d5cf34..5589359 100644
--- a/src/cache/rules.mk
+++ b/src/cache/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2000-2015 by
+# Copyright 2000-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/cff/Jamfile b/src/cff/Jamfile
index 8ffb79c..53c904f 100644
--- a/src/cff/Jamfile
+++ b/src/cff/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/cff Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,14 @@
 
   if $(FT2_MULTI)
   {
-    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;
+    _sources = cffcmap
+               cffdrivr
+               cffgload
+               cffload
+               cffobjs
+               cffparse
+               cffpic
+               ;
   }
   else
   {
diff --git a/src/cff/cf2ft.h b/src/cff/cf2ft.h
deleted file mode 100644
index 3073df3..0000000
--- a/src/cff/cf2ft.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2ft.h                                                                */
-/*                                                                         */
-/*    FreeType Glue Component to Adobe's Interpreter (specification).      */
-/*                                                                         */
-/*  Copyright 2013 Adobe Systems Incorporated.                             */
-/*                                                                         */
-/*  This software, and all works of authorship, whether in source or       */
-/*  object code form as indicated by the copyright notice(s) included      */
-/*  herein (collectively, the "Work") is made available, and may only be   */
-/*  used, modified, and distributed under the FreeType Project License,    */
-/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
-/*  FreeType Project License, each contributor to the Work hereby grants   */
-/*  to any individual or legal entity exercising permissions granted by    */
-/*  the FreeType Project License and this section (hereafter, "You" or     */
-/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
-/*  royalty-free, irrevocable (except as stated in this section) patent    */
-/*  license to make, have made, use, offer to sell, sell, import, and      */
-/*  otherwise transfer the Work, where such license applies only to those  */
-/*  patent claims licensable by such contributor that are necessarily      */
-/*  infringed by their contribution(s) alone or by combination of their    */
-/*  contribution(s) with the Work to which such contribution(s) was        */
-/*  submitted.  If You institute patent litigation against any entity      */
-/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
-/*  the Work or a contribution incorporated within the Work constitutes    */
-/*  direct or contributory patent infringement, then any patent licenses   */
-/*  granted to You under this License for that Work shall terminate as of  */
-/*  the date such litigation is filed.                                     */
-/*                                                                         */
-/*  By using, modifying, or distributing the Work you indicate that you    */
-/*  have read and understood the terms and conditions of the               */
-/*  FreeType Project License as well as those provided in this section,    */
-/*  and you accept them fully.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __CF2FT_H__
-#define __CF2FT_H__
-
-
-#include "cf2types.h"
-
-
-  /* TODO: disable asserts for now */
-#define CF2_NDEBUG
-
-
-#include FT_SYSTEM_H
-
-#include "cf2glue.h"
-#include "cffgload.h"    /* for CFF_Decoder */
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len );
-
-  FT_LOCAL( CFF_SubFont )
-  cf2_getSubfont( CFF_Decoder*  decoder );
-
-
-  FT_LOCAL( CF2_Fixed )
-  cf2_getPpemY( CFF_Decoder*  decoder );
-  FT_LOCAL( CF2_Fixed )
-  cf2_getStdVW( CFF_Decoder*  decoder );
-  FT_LOCAL( CF2_Fixed )
-  cf2_getStdHW( CFF_Decoder*  decoder );
-
-  FT_LOCAL( void )
-  cf2_getBlueMetrics( CFF_Decoder*  decoder,
-                      CF2_Fixed*    blueScale,
-                      CF2_Fixed*    blueShift,
-                      CF2_Fixed*    blueFuzz );
-  FT_LOCAL( void )
-  cf2_getBlueValues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data );
-  FT_LOCAL( void )
-  cf2_getOtherBlues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data );
-  FT_LOCAL( void )
-  cf2_getFamilyBlues( CFF_Decoder*  decoder,
-                      size_t*       count,
-                      FT_Pos*      *data );
-  FT_LOCAL( void )
-  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
-                           size_t*       count,
-                           FT_Pos*      *data );
-
-  FT_LOCAL( CF2_Int )
-  cf2_getLanguageGroup( CFF_Decoder*  decoder );
-
-  FT_LOCAL( CF2_Int )
-  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
-                              CF2_UInt      idx,
-                              CF2_Buffer    buf );
-  FT_LOCAL( FT_Error )
-  cf2_getSeacComponent( CFF_Decoder*  decoder,
-                        CF2_Int       code,
-                        CF2_Buffer    buf );
-  FT_LOCAL( void )
-  cf2_freeSeacComponent( CFF_Decoder*  decoder,
-                         CF2_Buffer    buf );
-  FT_LOCAL( CF2_Int )
-  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
-                             CF2_UInt      idx,
-                             CF2_Buffer    buf );
-
-  FT_LOCAL( CF2_Fixed )
-  cf2_getDefaultWidthX( CFF_Decoder*  decoder );
-  FT_LOCAL( CF2_Fixed )
-  cf2_getNominalWidthX( CFF_Decoder*  decoder );
-
-
-  /*
-   * FreeType client outline
-   *
-   * process output from the charstring interpreter
-   */
-  typedef struct  CF2_OutlineRec_
-  {
-    CF2_OutlineCallbacksRec  root;        /* base class must be first */
-    CFF_Decoder*             decoder;
-
-  } CF2_OutlineRec, *CF2_Outline;
-
-
-  FT_LOCAL( void )
-  cf2_outline_reset( CF2_Outline  outline );
-  FT_LOCAL( void )
-  cf2_outline_close( CF2_Outline  outline );
-
-
-FT_END_HEADER
-
-
-#endif /* __CF2FT_H__ */
-
-
-/* END */
diff --git a/src/cff/cf2intrp.c b/src/cff/cf2intrp.c
deleted file mode 100644
index 537e060..0000000
--- a/src/cff/cf2intrp.c
+++ /dev/null
@@ -1,1571 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2intrp.c                                                             */
-/*                                                                         */
-/*    Adobe's CFF Interpreter (body).                                      */
-/*                                                                         */
-/*  Copyright 2007-2014 Adobe Systems Incorporated.                        */
-/*                                                                         */
-/*  This software, and all works of authorship, whether in source or       */
-/*  object code form as indicated by the copyright notice(s) included      */
-/*  herein (collectively, the "Work") is made available, and may only be   */
-/*  used, modified, and distributed under the FreeType Project License,    */
-/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
-/*  FreeType Project License, each contributor to the Work hereby grants   */
-/*  to any individual or legal entity exercising permissions granted by    */
-/*  the FreeType Project License and this section (hereafter, "You" or     */
-/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
-/*  royalty-free, irrevocable (except as stated in this section) patent    */
-/*  license to make, have made, use, offer to sell, sell, import, and      */
-/*  otherwise transfer the Work, where such license applies only to those  */
-/*  patent claims licensable by such contributor that are necessarily      */
-/*  infringed by their contribution(s) alone or by combination of their    */
-/*  contribution(s) with the Work to which such contribution(s) was        */
-/*  submitted.  If You institute patent litigation against any entity      */
-/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
-/*  the Work or a contribution incorporated within the Work constitutes    */
-/*  direct or contributory patent infringement, then any patent licenses   */
-/*  granted to You under this License for that Work shall terminate as of  */
-/*  the date such litigation is filed.                                     */
-/*                                                                         */
-/*  By using, modifying, or distributing the Work you indicate that you    */
-/*  have read and understood the terms and conditions of the               */
-/*  FreeType Project License as well as those provided in this section,    */
-/*  and you accept them fully.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include "cf2ft.h"
-#include FT_INTERNAL_DEBUG_H
-
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2stack.h"
-#include "cf2hints.h"
-#include "cf2intrp.h"
-
-#include "cf2error.h"
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
-  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
-  /* messages during execution.                                            */
-  /*                                                                       */
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_cf2interp
-
-
-  /* some operators are not implemented yet */
-#define CF2_FIXME  FT_TRACE4(( "cf2_interpT2CharString:"            \
-                               " operator not implemented yet\n" ))
-
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_init( CF2_HintMask  hintmask,
-                     FT_Error*     error )
-  {
-    FT_ZERO( hintmask );
-
-    hintmask->error = error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hintmask_isValid( const CF2_HintMask  hintmask )
-  {
-    return hintmask->isValid;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hintmask_isNew( const CF2_HintMask  hintmask )
-  {
-    return hintmask->isNew;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_setNew( CF2_HintMask  hintmask,
-                       FT_Bool       val )
-  {
-    hintmask->isNew = val;
-  }
-
-
-  /* clients call `getMaskPtr' in order to iterate */
-  /* through hint mask                             */
-
-  FT_LOCAL_DEF( FT_Byte* )
-  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )
-  {
-    return hintmask->mask;
-  }
-
-
-  static size_t
-  cf2_hintmask_setCounts( CF2_HintMask  hintmask,
-                          size_t        bitCount )
-  {
-    if ( bitCount > CF2_MAX_HINTS )
-    {
-      /* total of h and v stems must be <= 96 */
-      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
-      return 0;
-    }
-
-    hintmask->bitCount  = bitCount;
-    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
-
-    hintmask->isValid = TRUE;
-    hintmask->isNew   = TRUE;
-
-    return bitCount;
-  }
-
-
-  /* consume the hintmask bytes from the charstring, advancing the src */
-  /* pointer                                                           */
-  static void
-  cf2_hintmask_read( CF2_HintMask  hintmask,
-                     CF2_Buffer    charstring,
-                     size_t        bitCount )
-  {
-    size_t  i;
-
-#ifndef CF2_NDEBUG
-    /* these are the bits in the final mask byte that should be zero  */
-    /* Note: this variable is only used in an assert expression below */
-    /* and then only if CF2_NDEBUG is not defined                     */
-    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
-#endif
-
-
-    /* initialize counts and isValid */
-    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
-      return;
-
-    FT_ASSERT( hintmask->byteCount > 0 );
-
-    FT_TRACE4(( " (maskbytes:" ));
-
-    /* set mask and advance interpreter's charstring pointer */
-    for ( i = 0; i < hintmask->byteCount; i++ )
-    {
-      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
-      FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
-    }
-
-    FT_TRACE4(( ")\n" ));
-
-    /* assert any unused bits in last byte are zero unless there's a prior */
-    /* error                                                               */
-    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */
-#ifndef CF2_NDEBUG
-    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
-               *hintmask->error                                        );
-#endif
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_setAll( CF2_HintMask  hintmask,
-                       size_t        bitCount )
-  {
-    size_t    i;
-    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
-
-
-    /* initialize counts and isValid */
-    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
-      return;
-
-    FT_ASSERT( hintmask->byteCount > 0 );
-    FT_ASSERT( hintmask->byteCount <
-                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
-
-    /* set mask to all ones */
-    for ( i = 0; i < hintmask->byteCount; i++ )
-      hintmask->mask[i] = 0xFF;
-
-    /* clear unused bits                                              */
-    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
-    hintmask->mask[hintmask->byteCount - 1] &= ~mask;
-  }
-
-
-  /* Type2 charstring opcodes */
-  enum
-  {
-    cf2_cmdRESERVED_0,   /* 0 */
-    cf2_cmdHSTEM,        /* 1 */
-    cf2_cmdRESERVED_2,   /* 2 */
-    cf2_cmdVSTEM,        /* 3 */
-    cf2_cmdVMOVETO,      /* 4 */
-    cf2_cmdRLINETO,      /* 5 */
-    cf2_cmdHLINETO,      /* 6 */
-    cf2_cmdVLINETO,      /* 7 */
-    cf2_cmdRRCURVETO,    /* 8 */
-    cf2_cmdRESERVED_9,   /* 9 */
-    cf2_cmdCALLSUBR,     /* 10 */
-    cf2_cmdRETURN,       /* 11 */
-    cf2_cmdESC,          /* 12 */
-    cf2_cmdRESERVED_13,  /* 13 */
-    cf2_cmdENDCHAR,      /* 14 */
-    cf2_cmdRESERVED_15,  /* 15 */
-    cf2_cmdRESERVED_16,  /* 16 */
-    cf2_cmdRESERVED_17,  /* 17 */
-    cf2_cmdHSTEMHM,      /* 18 */
-    cf2_cmdHINTMASK,     /* 19 */
-    cf2_cmdCNTRMASK,     /* 20 */
-    cf2_cmdRMOVETO,      /* 21 */
-    cf2_cmdHMOVETO,      /* 22 */
-    cf2_cmdVSTEMHM,      /* 23 */
-    cf2_cmdRCURVELINE,   /* 24 */
-    cf2_cmdRLINECURVE,   /* 25 */
-    cf2_cmdVVCURVETO,    /* 26 */
-    cf2_cmdHHCURVETO,    /* 27 */
-    cf2_cmdEXTENDEDNMBR, /* 28 */
-    cf2_cmdCALLGSUBR,    /* 29 */
-    cf2_cmdVHCURVETO,    /* 30 */
-    cf2_cmdHVCURVETO     /* 31 */
-  };
-
-  enum
-  {
-    cf2_escDOTSECTION,   /* 0 */
-    cf2_escRESERVED_1,   /* 1 */
-    cf2_escRESERVED_2,   /* 2 */
-    cf2_escAND,          /* 3 */
-    cf2_escOR,           /* 4 */
-    cf2_escNOT,          /* 5 */
-    cf2_escRESERVED_6,   /* 6 */
-    cf2_escRESERVED_7,   /* 7 */
-    cf2_escRESERVED_8,   /* 8 */
-    cf2_escABS,          /* 9 */
-    cf2_escADD,          /* 10     like otherADD */
-    cf2_escSUB,          /* 11     like otherSUB */
-    cf2_escDIV,          /* 12 */
-    cf2_escRESERVED_13,  /* 13 */
-    cf2_escNEG,          /* 14 */
-    cf2_escEQ,           /* 15 */
-    cf2_escRESERVED_16,  /* 16 */
-    cf2_escRESERVED_17,  /* 17 */
-    cf2_escDROP,         /* 18 */
-    cf2_escRESERVED_19,  /* 19 */
-    cf2_escPUT,          /* 20     like otherPUT    */
-    cf2_escGET,          /* 21     like otherGET    */
-    cf2_escIFELSE,       /* 22     like otherIFELSE */
-    cf2_escRANDOM,       /* 23     like otherRANDOM */
-    cf2_escMUL,          /* 24     like otherMUL    */
-    cf2_escRESERVED_25,  /* 25 */
-    cf2_escSQRT,         /* 26 */
-    cf2_escDUP,          /* 27     like otherDUP    */
-    cf2_escEXCH,         /* 28     like otherEXCH   */
-    cf2_escINDEX,        /* 29 */
-    cf2_escROLL,         /* 30 */
-    cf2_escRESERVED_31,  /* 31 */
-    cf2_escRESERVED_32,  /* 32 */
-    cf2_escRESERVED_33,  /* 33 */
-    cf2_escHFLEX,        /* 34 */
-    cf2_escFLEX,         /* 35 */
-    cf2_escHFLEX1,       /* 36 */
-    cf2_escFLEX1         /* 37 */
-  };
-
-
-  /* `stemHintArray' does not change once we start drawing the outline. */
-  static void
-  cf2_doStems( const CF2_Font  font,
-               CF2_Stack       opStack,
-               CF2_ArrStack    stemHintArray,
-               CF2_Fixed*      width,
-               FT_Bool*        haveWidth,
-               CF2_Fixed       hintOffset )
-  {
-    CF2_UInt  i;
-    CF2_UInt  count       = cf2_stack_count( opStack );
-    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );
-
-    /* variable accumulates delta values from operand stack */
-    CF2_Fixed  position = hintOffset;
-
-    if ( hasWidthArg && ! *haveWidth )
-      *width = cf2_stack_getReal( opStack, 0 ) +
-                 cf2_getNominalWidthX( font->decoder );
-
-    if ( font->decoder->width_only )
-      goto exit;
-
-    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
-    {
-      /* construct a CF2_StemHint and push it onto the list */
-      CF2_StemHintRec  stemhint;
-
-
-      stemhint.min  =
-        position   += cf2_stack_getReal( opStack, i );
-      stemhint.max  =
-        position   += cf2_stack_getReal( opStack, i + 1 );
-
-      stemhint.used  = FALSE;
-      stemhint.maxDS =
-      stemhint.minDS = 0;
-
-      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
-    }
-
-    cf2_stack_clear( opStack );
-
-  exit:
-    /* cf2_doStems must define a width (may be default) */
-    *haveWidth = TRUE;
-  }
-
-
-  static void
-  cf2_doFlex( CF2_Stack       opStack,
-              CF2_Fixed*      curX,
-              CF2_Fixed*      curY,
-              CF2_GlyphPath   glyphPath,
-              const FT_Bool*  readFromStack,
-              FT_Bool         doConditionalLastRead )
-  {
-    CF2_Fixed  vals[14];
-    CF2_UInt   index;
-    FT_Bool    isHFlex;
-    CF2_Int    top, i, j;
-
-
-    vals[0] = *curX;
-    vals[1] = *curY;
-    index   = 0;
-    isHFlex = readFromStack[9] == FALSE;
-    top     = isHFlex ? 9 : 10;
-
-    for ( i = 0; i < top; i++ )
-    {
-      vals[i + 2] = vals[i];
-      if ( readFromStack[i] )
-        vals[i + 2] += cf2_stack_getReal( opStack, index++ );
-    }
-
-    if ( isHFlex )
-      vals[9 + 2] = *curY;
-
-    if ( doConditionalLastRead )
-    {
-      FT_Bool    lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >
-                                        cf2_fixedAbs( vals[11] - *curY ) );
-      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, index );
-
-
-      if ( lastIsX )
-      {
-        vals[12] = vals[10] + lastVal;
-        vals[13] = *curY;
-      }
-      else
-      {
-        vals[12] = *curX;
-        vals[13] = vals[11] + lastVal;
-      }
-    }
-    else
-    {
-      if ( readFromStack[10] )
-        vals[12] = vals[10] + cf2_stack_getReal( opStack, index++ );
-      else
-        vals[12] = *curX;
-
-      if ( readFromStack[11] )
-        vals[13] = vals[11] + cf2_stack_getReal( opStack, index );
-      else
-        vals[13] = *curY;
-    }
-
-    for ( j = 0; j < 2; j++ )
-      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
-                                        vals[j * 6 + 3],
-                                        vals[j * 6 + 4],
-                                        vals[j * 6 + 5],
-                                        vals[j * 6 + 6],
-                                        vals[j * 6 + 7] );
-
-    cf2_stack_clear( opStack );
-
-    *curX = vals[12];
-    *curY = vals[13];
-  }
-
-
-  /*
-   * `error' is a shared error code used by many objects in this
-   * routine.  Before the code continues from an error, it must check and
-   * record the error in `*error'.  The idea is that this shared
-   * error code will record the first error encountered.  If testing
-   * for an error anyway, the cost of `goto exit' is small, so we do it,
-   * even if continuing would be safe.  In this case, `lastError' is
-   * set, so the testing and storing can be done in one place, at `exit'.
-   *
-   * Continuing after an error is intended for objects which do their own
-   * testing of `*error', e.g., array stack functions.  This allows us to
-   * avoid an extra test after the call.
-   *
-   * Unimplemented opcodes are ignored.
-   *
-   */
-  FT_LOCAL_DEF( void )
-  cf2_interpT2CharString( CF2_Font              font,
-                          CF2_Buffer            buf,
-                          CF2_OutlineCallbacks  callbacks,
-                          const FT_Vector*      translation,
-                          FT_Bool               doingSeac,
-                          CF2_Fixed             curX,
-                          CF2_Fixed             curY,
-                          CF2_Fixed*            width )
-  {
-    /* lastError is used for errors that are immediately tested */
-    FT_Error  lastError = FT_Err_Ok;
-
-    /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
-
-    FT_Error*  error  = &font->error;
-    FT_Memory  memory = font->memory;
-
-    CF2_Fixed  scaleY        = font->innerTransform.d;
-    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );
-
-    /* save this for hinting seac accents */
-    CF2_Fixed  hintOriginY = curY;
-
-    CF2_Stack  opStack = NULL;
-    FT_Byte    op1;                       /* first opcode byte */
-
-    /* instruction limit; 20,000,000 matches Avalon */
-    FT_UInt32  instructionLimit = 20000000UL;
-
-    CF2_ArrStackRec  subrStack;
-
-    FT_Bool     haveWidth;
-    CF2_Buffer  charstring = NULL;
-
-    CF2_Int  charstringIndex = -1;       /* initialize to empty */
-
-    /* TODO: placeholders for hint structures */
-
-    /* objects used for hinting */
-    CF2_ArrStackRec  hStemHintArray;
-    CF2_ArrStackRec  vStemHintArray;
-
-    CF2_HintMaskRec   hintMask;
-    CF2_GlyphPathRec  glyphPath;
-
-
-    /* initialize the remaining objects */
-    cf2_arrstack_init( &subrStack,
-                       memory,
-                       error,
-                       sizeof ( CF2_BufferRec ) );
-    cf2_arrstack_init( &hStemHintArray,
-                       memory,
-                       error,
-                       sizeof ( CF2_StemHintRec ) );
-    cf2_arrstack_init( &vStemHintArray,
-                       memory,
-                       error,
-                       sizeof ( CF2_StemHintRec ) );
-
-    /* initialize CF2_StemHint arrays */
-    cf2_hintmask_init( &hintMask, error );
-
-    /* initialize path map to manage drawing operations */
-
-    /* Note: last 4 params are used to handle `MoveToPermissive', which */
-    /*       may need to call `hintMap.Build'                           */
-    /* TODO: MoveToPermissive is gone; are these still needed?          */
-    cf2_glyphpath_init( &glyphPath,
-                        font,
-                        callbacks,
-                        scaleY,
-                        /* hShift, */
-                        &hStemHintArray,
-                        &vStemHintArray,
-                        &hintMask,
-                        hintOriginY,
-                        &font->blues,
-                        translation );
-
-    /*
-     * Initialize state for width parsing.  From the CFF Spec:
-     *
-     *   The first stack-clearing operator, which must be one of hstem,
-     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
-     *   rmoveto, or endchar, takes an additional argument - the width (as
-     *   described earlier), which may be expressed as zero or one numeric
-     *   argument.
-     *
-     * What we implement here uses the first validly specified width, but
-     * does not detect errors for specifying more than one width.
-     *
-     * If one of the above operators occurs without explicitly specifying
-     * a width, we assume the default width.
-     *
-     */
-    haveWidth = FALSE;
-    *width    = cf2_getDefaultWidthX( decoder );
-
-    /*
-     * Note: at this point, all pointers to resources must be NULL
-     * and all local objects must be initialized.
-     * There must be no branches to exit: above this point.
-     *
-     */
-
-    /* allocate an operand stack */
-    opStack = cf2_stack_init( memory, error );
-    if ( !opStack )
-    {
-      lastError = FT_THROW( Out_Of_Memory );
-      goto exit;
-    }
-
-    /* initialize subroutine stack by placing top level charstring as */
-    /* first element (max depth plus one for the charstring)          */
-    /* Note: Caller owns and must finalize the first charstring.      */
-    /*       Our copy of it does not change that requirement.         */
-    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
-
-    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
-    *charstring = *buf;    /* structure copy */
-
-    charstringIndex = 0;       /* entry is valid now */
-
-    /* catch errors so far */
-    if ( *error )
-      goto exit;
-
-    /* main interpreter loop */
-    while ( 1 )
-    {
-      if ( cf2_buf_isEnd( charstring ) )
-      {
-        /* If we've reached the end of the charstring, simulate a */
-        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */
-        if ( charstringIndex )
-          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */
-        else
-          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
-      }
-      else
-        op1 = (FT_Byte)cf2_buf_readByte( charstring );
-
-      /* check for errors once per loop */
-      if ( *error )
-        goto exit;
-
-      instructionLimit--;
-      if ( instructionLimit == 0 )
-      {
-        lastError = FT_THROW( Invalid_Glyph_Format );
-        goto exit;
-      }
-
-      switch( op1 )
-      {
-      case cf2_cmdRESERVED_0:
-      case cf2_cmdRESERVED_2:
-      case cf2_cmdRESERVED_9:
-      case cf2_cmdRESERVED_13:
-      case cf2_cmdRESERVED_15:
-      case cf2_cmdRESERVED_16:
-      case cf2_cmdRESERVED_17:
-        /* we may get here if we have a prior error */
-        FT_TRACE4(( " unknown op (%d)\n", op1 ));
-        break;
-
-      case cf2_cmdHSTEMHM:
-      case cf2_cmdHSTEM:
-        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid horizontal hint mask\n" ));
-          break;
-        }
-
-        cf2_doStems( font,
-                     opStack,
-                     &hStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        break;
-
-      case cf2_cmdVSTEMHM:
-      case cf2_cmdVSTEM:
-        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid vertical hint mask\n" ));
-          break;
-        }
-
-        cf2_doStems( font,
-                     opStack,
-                     &vStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        break;
-
-      case cf2_cmdVMOVETO:
-        FT_TRACE4(( " vmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        curY += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdRLINETO:
-        {
-          CF2_UInt  index;
-          CF2_UInt  count = cf2_stack_count( opStack );
-
-
-          FT_TRACE4(( " rlineto\n" ));
-
-          for ( index = 0; index < count; index += 2 )
-          {
-            curX += cf2_stack_getReal( opStack, index + 0 );
-            curY += cf2_stack_getReal( opStack, index + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdHLINETO:
-      case cf2_cmdVLINETO:
-        {
-          CF2_UInt  index;
-          CF2_UInt  count = cf2_stack_count( opStack );
-
-          FT_Bool  isX = op1 == cf2_cmdHLINETO;
-
-
-          FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
-
-          for ( index = 0; index < count; index++ )
-          {
-            CF2_Fixed  v = cf2_stack_getReal( opStack, index );
-
-
-            if ( isX )
-              curX += v;
-            else
-              curY += v;
-
-            isX = !isX;
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue;
-
-      case cf2_cmdRCURVELINE:
-      case cf2_cmdRRCURVETO:
-        {
-          CF2_UInt  count = cf2_stack_count( opStack );
-          CF2_UInt  index = 0;
-
-
-          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
-                                               : " rrcurveto\n" ));
-
-          while ( index + 6 <= count )
-          {
-            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
-            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
-            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
-            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
-            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
-            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
-
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX   = x3;
-            curY   = y3;
-            index += 6;
-          }
-
-          if ( op1 == cf2_cmdRCURVELINE )
-          {
-            curX += cf2_stack_getReal( opStack, index + 0 );
-            curY += cf2_stack_getReal( opStack, index + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdCALLGSUBR:
-      case cf2_cmdCALLSUBR:
-        {
-          CF2_UInt  subrIndex;
-
-
-          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
-                                              : " callsubr" ));
-
-          if ( charstringIndex > CF2_MAX_SUBR )
-          {
-            /* max subr plus one for charstring */
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;                      /* overflow of stack */
-          }
-
-          /* push our current CFF charstring region on subrStack */
-          charstring = (CF2_Buffer)
-                         cf2_arrstack_getPointer(
-                           &subrStack,
-                           (size_t)charstringIndex + 1 );
-
-          /* set up the new CFF region and pointer */
-          subrIndex = (CF2_UInt)cf2_stack_popInt( opStack );
-
-          switch ( op1 )
-          {
-          case cf2_cmdCALLGSUBR:
-            FT_TRACE4(( " (idx %d, entering level %d)\n",
-                        subrIndex + (CF2_UInt)decoder->globals_bias,
-                        charstringIndex + 1 ));
-
-            if ( cf2_initGlobalRegionBuffer( decoder,
-                                             subrIndex,
-                                             charstring ) )
-            {
-              lastError = FT_THROW( Invalid_Glyph_Format );
-              goto exit;  /* subroutine lookup or stream error */
-            }
-            break;
-
-          default:
-            /* cf2_cmdCALLSUBR */
-            FT_TRACE4(( " (idx %d, entering level %d)\n",
-                        subrIndex + (CF2_UInt)decoder->locals_bias,
-                        charstringIndex + 1 ));
-
-            if ( cf2_initLocalRegionBuffer( decoder,
-                                            subrIndex,
-                                            charstring ) )
-            {
-              lastError = FT_THROW( Invalid_Glyph_Format );
-              goto exit;  /* subroutine lookup or stream error */
-            }
-          }
-
-          charstringIndex += 1;       /* entry is valid now */
-        }
-        continue; /* do not clear the stack */
-
-      case cf2_cmdRETURN:
-        FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
-
-        if ( charstringIndex < 1 )
-        {
-          /* Note: cannot return from top charstring */
-          lastError = FT_THROW( Invalid_Glyph_Format );
-          goto exit;                      /* underflow of stack */
-        }
-
-        /* restore position in previous charstring */
-        charstring = (CF2_Buffer)
-                       cf2_arrstack_getPointer(
-                         &subrStack,
-                         (CF2_UInt)--charstringIndex );
-        continue;     /* do not clear the stack */
-
-      case cf2_cmdESC:
-        {
-          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );
-
-
-          switch ( op2 )
-          {
-          case cf2_escDOTSECTION:
-            /* something about `flip type of locking' -- ignore it */
-            FT_TRACE4(( " dotsection\n" ));
-
-            break;
-
-          /* TODO: should these operators be supported? */
-          case cf2_escAND: /* in spec */
-            FT_TRACE4(( " and\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escOR: /* in spec */
-            FT_TRACE4(( " or\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escNOT: /* in spec */
-            FT_TRACE4(( " not\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escABS: /* in spec */
-            FT_TRACE4(( " abs\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escADD: /* in spec */
-            FT_TRACE4(( " add\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escSUB: /* in spec */
-            FT_TRACE4(( " sub\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escDIV: /* in spec */
-            FT_TRACE4(( " div\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escNEG: /* in spec */
-            FT_TRACE4(( " neg\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escEQ: /* in spec */
-            FT_TRACE4(( " eq\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escDROP: /* in spec */
-            FT_TRACE4(( " drop\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escPUT: /* in spec */
-            FT_TRACE4(( " put\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escGET: /* in spec */
-            FT_TRACE4(( " get\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escIFELSE: /* in spec */
-            FT_TRACE4(( " ifelse\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escRANDOM: /* in spec */
-            FT_TRACE4(( " random\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escMUL: /* in spec */
-            FT_TRACE4(( " mul\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escSQRT: /* in spec */
-            FT_TRACE4(( " sqrt\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escDUP: /* in spec */
-            FT_TRACE4(( " dup\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escEXCH: /* in spec */
-            FT_TRACE4(( " exch\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escINDEX: /* in spec */
-            FT_TRACE4(( " index\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escROLL: /* in spec */
-            FT_TRACE4(( " roll\n" ));
-
-            CF2_FIXME;
-            break;
-
-          case cf2_escHFLEX:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, FALSE /* dy1 */,
-                TRUE /* dx2 */, TRUE  /* dy2 */,
-                TRUE /* dx3 */, FALSE /* dy3 */,
-                TRUE /* dx4 */, FALSE /* dy4 */,
-                TRUE /* dx5 */, FALSE /* dy5 */,
-                TRUE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " hflex\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          case cf2_escFLEX:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, TRUE /* dy1 */,
-                TRUE /* dx2 */, TRUE /* dy2 */,
-                TRUE /* dx3 */, TRUE /* dy3 */,
-                TRUE /* dx4 */, TRUE /* dy4 */,
-                TRUE /* dx5 */, TRUE /* dy5 */,
-                TRUE /* dx6 */, TRUE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " flex\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            break;      /* TODO: why is this not a continue? */
-
-          case cf2_escHFLEX1:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, TRUE  /* dy1 */,
-                TRUE /* dx2 */, TRUE  /* dy2 */,
-                TRUE /* dx3 */, FALSE /* dy3 */,
-                TRUE /* dx4 */, FALSE /* dy4 */,
-                TRUE /* dx5 */, TRUE  /* dy5 */,
-                TRUE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " hflex1\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          case cf2_escFLEX1:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE  /* dx1 */, TRUE  /* dy1 */,
-                TRUE  /* dx2 */, TRUE  /* dy2 */,
-                TRUE  /* dx3 */, TRUE  /* dy3 */,
-                TRUE  /* dx4 */, TRUE  /* dy4 */,
-                TRUE  /* dx5 */, TRUE  /* dy5 */,
-                FALSE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " flex1\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          TRUE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          case cf2_escRESERVED_1:
-          case cf2_escRESERVED_2:
-          case cf2_escRESERVED_6:
-          case cf2_escRESERVED_7:
-          case cf2_escRESERVED_8:
-          case cf2_escRESERVED_13:
-          case cf2_escRESERVED_16:
-          case cf2_escRESERVED_17:
-          case cf2_escRESERVED_19:
-          case cf2_escRESERVED_25:
-          case cf2_escRESERVED_31:
-          case cf2_escRESERVED_32:
-          case cf2_escRESERVED_33:
-          default:
-            FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
-
-          }; /* end of switch statement checking `op2' */
-
-        } /* case cf2_cmdESC */
-        break;
-
-      case cf2_cmdENDCHAR:
-        FT_TRACE4(( " endchar\n" ));
-
-        if ( cf2_stack_count( opStack ) == 1 ||
-             cf2_stack_count( opStack ) == 5 )
-        {
-          if ( !haveWidth )
-            *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-        }
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        /* close path if still open */
-        cf2_glyphpath_closeOpenPath( &glyphPath );
-
-        if ( cf2_stack_count( opStack ) > 1 )
-        {
-          /* must be either 4 or 5 --                       */
-          /* this is a (deprecated) implied `seac' operator */
-
-          CF2_Int        achar;
-          CF2_Int        bchar;
-          CF2_BufferRec  component;
-          CF2_Fixed      dummyWidth;   /* ignore component width */
-          FT_Error       error2;
-
-
-          if ( doingSeac )
-          {
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;      /* nested seac */
-          }
-
-          achar = cf2_stack_popInt( opStack );
-          bchar = cf2_stack_popInt( opStack );
-
-          curY = cf2_stack_popFixed( opStack );
-          curX = cf2_stack_popFixed( opStack );
-
-          error2 = cf2_getSeacComponent( decoder, achar, &component );
-          if ( error2 )
-          {
-             lastError = error2;      /* pass FreeType error through */
-             goto exit;
-          }
-          cf2_interpT2CharString( font,
-                                  &component,
-                                  callbacks,
-                                  translation,
-                                  TRUE,
-                                  curX,
-                                  curY,
-                                  &dummyWidth );
-          cf2_freeSeacComponent( decoder, &component );
-
-          error2 = cf2_getSeacComponent( decoder, bchar, &component );
-          if ( error2 )
-          {
-            lastError = error2;      /* pass FreeType error through */
-            goto exit;
-          }
-          cf2_interpT2CharString( font,
-                                  &component,
-                                  callbacks,
-                                  translation,
-                                  TRUE,
-                                  0,
-                                  0,
-                                  &dummyWidth );
-          cf2_freeSeacComponent( decoder, &component );
-        }
-        goto exit;
-
-      case cf2_cmdCNTRMASK:
-      case cf2_cmdHINTMASK:
-        /* the final \n in the tracing message gets added in      */
-        /* `cf2_hintmask_read' (which also traces the mask bytes) */
-        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_stack_count( opStack ) > 1    &&
-             cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
-          break;
-        }
-
-        /* if there are arguments on the stack, there this is an */
-        /* implied cf2_cmdVSTEMHM                                */
-        cf2_doStems( font,
-                     opStack,
-                     &vStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        if ( op1 == cf2_cmdHINTMASK )
-        {
-          /* consume the hint mask bytes which follow the operator */
-          cf2_hintmask_read( &hintMask,
-                             charstring,
-                             cf2_arrstack_size( &hStemHintArray ) +
-                               cf2_arrstack_size( &vStemHintArray ) );
-        }
-        else
-        {
-          /*
-           * Consume the counter mask bytes which follow the operator:
-           * Build a temporary hint map, just to place and lock those
-           * stems participating in the counter mask.  These are most
-           * likely the dominant hstems, and are grouped together in a
-           * few counter groups, not necessarily in correspondence
-           * with the hint groups.  This reduces the chances of
-           * conflicts between hstems that are initially placed in
-           * separate hint groups and then brought together.  The
-           * positions are copied back to `hStemHintArray', so we can
-           * discard `counterMask' and `counterHintMap'.
-           *
-           */
-          CF2_HintMapRec   counterHintMap;
-          CF2_HintMaskRec  counterMask;
-
-
-          cf2_hintmap_init( &counterHintMap,
-                            font,
-                            &glyphPath.initialHintMap,
-                            &glyphPath.hintMoves,
-                            scaleY );
-          cf2_hintmask_init( &counterMask, error );
-
-          cf2_hintmask_read( &counterMask,
-                             charstring,
-                             cf2_arrstack_size( &hStemHintArray ) +
-                               cf2_arrstack_size( &vStemHintArray ) );
-          cf2_hintmap_build( &counterHintMap,
-                             &hStemHintArray,
-                             &vStemHintArray,
-                             &counterMask,
-                             0,
-                             FALSE );
-        }
-        break;
-
-      case cf2_cmdRMOVETO:
-        FT_TRACE4(( " rmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        curY += cf2_stack_popFixed( opStack );
-        curX += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdHMOVETO:
-        FT_TRACE4(( " hmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-            goto exit;
-
-        curX += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdRLINECURVE:
-        {
-          CF2_UInt  count = cf2_stack_count( opStack );
-          CF2_UInt  index = 0;
-
-
-          FT_TRACE4(( " rlinecurve\n" ));
-
-          while ( index + 6 < count )
-          {
-            curX += cf2_stack_getReal( opStack, index + 0 );
-            curY += cf2_stack_getReal( opStack, index + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-            index += 2;
-          }
-
-          while ( index < count )
-          {
-            CF2_Fixed  x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
-            CF2_Fixed  y1 = cf2_stack_getReal( opStack, index + 1 ) + curY;
-            CF2_Fixed  x2 = cf2_stack_getReal( opStack, index + 2 ) + x1;
-            CF2_Fixed  y2 = cf2_stack_getReal( opStack, index + 3 ) + y1;
-            CF2_Fixed  x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
-            CF2_Fixed  y3 = cf2_stack_getReal( opStack, index + 5 ) + y2;
-
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX   = x3;
-            curY   = y3;
-            index += 6;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdVVCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  index = 0;
-
-
-          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
-          /* we enforce it by clearing the second bit           */
-          /* (and sorting the stack indexing to suit)           */
-          count  = count1 & ~2;
-          index += count1 - count;
-
-          FT_TRACE4(( " vvcurveto\n" ));
-
-          while ( index < count )
-          {
-            CF2_Fixed  x1, y1, x2, y2, x3, y3;
-
-
-            if ( ( count - index ) & 1 )
-            {
-              x1 = cf2_stack_getReal( opStack, index ) + curX;
-
-              ++index;
-            }
-            else
-              x1 = curX;
-
-            y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
-            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
-            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
-            x3 = x2;
-            y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX   = x3;
-            curY   = y3;
-            index += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdHHCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  index = 0;
-
-
-          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
-          /* we enforce it by clearing the second bit           */
-          /* (and sorting the stack indexing to suit)           */
-          count  = count1 & ~2;
-          index += count1 - count;
-
-          FT_TRACE4(( " hhcurveto\n" ));
-
-          while ( index < count )
-          {
-            CF2_Fixed  x1, y1, x2, y2, x3, y3;
-
-
-            if ( ( count - index ) & 1 )
-            {
-              y1 = cf2_stack_getReal( opStack, index ) + curY;
-
-              ++index;
-            }
-            else
-              y1 = curY;
-
-            x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
-            x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
-            y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
-            x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
-            y3 = y2;
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX   = x3;
-            curY   = y3;
-            index += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdVHCURVETO:
-      case cf2_cmdHVCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  index = 0;
-
-          FT_Bool  alternate = op1 == cf2_cmdHVCURVETO;
-
-
-          /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */
-          /* 8n+4, or 8n+5, we enforce it by clearing the     */
-          /* second bit                                       */
-          /* (and sorting the stack indexing to suit)         */
-          count  = count1 & ~2;
-          index += count1 - count;
-
-          FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
-
-          while ( index < count )
-          {
-            CF2_Fixed x1, x2, x3, y1, y2, y3;
-
-
-            if ( alternate )
-            {
-              x1 = cf2_stack_getReal( opStack, index + 0 ) + curX;
-              y1 = curY;
-              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
-              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
-              y3 = cf2_stack_getReal( opStack, index + 3 ) + y2;
-
-              if ( count - index == 5 )
-              {
-                x3 = cf2_stack_getReal( opStack, index + 4 ) + x2;
-
-                ++index;
-              }
-              else
-                x3 = x2;
-
-              alternate = FALSE;
-            }
-            else
-            {
-              x1 = curX;
-              y1 = cf2_stack_getReal( opStack, index + 0 ) + curY;
-              x2 = cf2_stack_getReal( opStack, index + 1 ) + x1;
-              y2 = cf2_stack_getReal( opStack, index + 2 ) + y1;
-              x3 = cf2_stack_getReal( opStack, index + 3 ) + x2;
-
-              if ( count - index == 5 )
-              {
-                y3 = cf2_stack_getReal( opStack, index + 4 ) + y2;
-
-                ++index;
-              }
-              else
-                y3 = y2;
-
-              alternate = TRUE;
-            }
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX   = x3;
-            curY   = y3;
-            index += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue;     /* no need to clear stack again */
-
-      case cf2_cmdEXTENDEDNMBR:
-        {
-          CF2_Int  v;
-
-
-          v = (FT_Short)( ( cf2_buf_readByte( charstring ) << 8 ) |
-                            cf2_buf_readByte( charstring )        );
-
-          FT_TRACE4(( " %d", v ));
-
-          cf2_stack_pushInt( opStack, v );
-        }
-        continue;
-
-      default:
-        /* numbers */
-        {
-          if ( /* op1 >= 32 && */ op1 <= 246 )
-          {
-            CF2_Int  v;
-
-
-            v = op1 - 139;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* -107 .. 107 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else if ( /* op1 >= 247 && */ op1 <= 250 )
-          {
-            CF2_Int  v;
-
-
-            v  = op1;
-            v -= 247;
-            v *= 256;
-            v += cf2_buf_readByte( charstring );
-            v += 108;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* 108 .. 1131 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else if ( /* op1 >= 251 && */ op1 <= 254 )
-          {
-            CF2_Int  v;
-
-
-            v  = op1;
-            v -= 251;
-            v *= 256;
-            v += cf2_buf_readByte( charstring );
-            v  = -v - 108;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* -1131 .. -108 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else /* op1 == 255 */
-          {
-            CF2_Fixed  v;
-
-
-            v = (CF2_Fixed)
-                  ( ( (FT_UInt32)cf2_buf_readByte( charstring ) << 24 ) |
-                    ( (FT_UInt32)cf2_buf_readByte( charstring ) << 16 ) |
-                    ( (FT_UInt32)cf2_buf_readByte( charstring ) <<  8 ) |
-                      (FT_UInt32)cf2_buf_readByte( charstring )         );
-
-            FT_TRACE4(( " %.2f", v / 65536.0 ));
-
-            cf2_stack_pushFixed( opStack, v );
-          }
-        }
-        continue;   /* don't clear stack */
-
-      } /* end of switch statement checking `op1' */
-
-      cf2_stack_clear( opStack );
-
-    } /* end of main interpreter loop */
-
-    /* we get here if the charstring ends without cf2_cmdENDCHAR */
-    FT_TRACE4(( "cf2_interpT2CharString:"
-                "  charstring ends without ENDCHAR\n" ));
-
-  exit:
-    /* check whether last error seen is also the first one */
-    cf2_setError( error, lastError );
-
-    /* free resources from objects we've used */
-    cf2_glyphpath_finalize( &glyphPath );
-    cf2_arrstack_finalize( &vStemHintArray );
-    cf2_arrstack_finalize( &hStemHintArray );
-    cf2_arrstack_finalize( &subrStack );
-    cf2_stack_free( opStack );
-
-    FT_TRACE4(( "\n" ));
-
-    return;
-  }
-
-
-/* END */
diff --git a/src/cff/cf2stack.c b/src/cff/cf2stack.c
deleted file mode 100644
index 8332b5d..0000000
--- a/src/cff/cf2stack.c
+++ /dev/null
@@ -1,205 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2stack.c                                                             */
-/*                                                                         */
-/*    Adobe's code for emulating a CFF stack (body).                       */
-/*                                                                         */
-/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
-/*                                                                         */
-/*  This software, and all works of authorship, whether in source or       */
-/*  object code form as indicated by the copyright notice(s) included      */
-/*  herein (collectively, the "Work") is made available, and may only be   */
-/*  used, modified, and distributed under the FreeType Project License,    */
-/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
-/*  FreeType Project License, each contributor to the Work hereby grants   */
-/*  to any individual or legal entity exercising permissions granted by    */
-/*  the FreeType Project License and this section (hereafter, "You" or     */
-/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
-/*  royalty-free, irrevocable (except as stated in this section) patent    */
-/*  license to make, have made, use, offer to sell, sell, import, and      */
-/*  otherwise transfer the Work, where such license applies only to those  */
-/*  patent claims licensable by such contributor that are necessarily      */
-/*  infringed by their contribution(s) alone or by combination of their    */
-/*  contribution(s) with the Work to which such contribution(s) was        */
-/*  submitted.  If You institute patent litigation against any entity      */
-/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
-/*  the Work or a contribution incorporated within the Work constitutes    */
-/*  direct or contributory patent infringement, then any patent licenses   */
-/*  granted to You under this License for that Work shall terminate as of  */
-/*  the date such litigation is filed.                                     */
-/*                                                                         */
-/*  By using, modifying, or distributing the Work you indicate that you    */
-/*  have read and understood the terms and conditions of the               */
-/*  FreeType Project License as well as those provided in this section,    */
-/*  and you accept them fully.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include "cf2ft.h"
-#include FT_INTERNAL_DEBUG_H
-
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2stack.h"
-
-#include "cf2error.h"
-
-
-  /* Allocate and initialize an instance of CF2_Stack.       */
-  /* Note: This function returns NULL on error (does not set */
-  /* `error').                                               */
-  FT_LOCAL_DEF( CF2_Stack )
-  cf2_stack_init( FT_Memory  memory,
-                  FT_Error*  e )
-  {
-    FT_Error  error = FT_Err_Ok;     /* for FT_QNEW */
-
-    CF2_Stack  stack = NULL;
-
-
-    if ( !FT_QNEW( stack ) )
-    {
-      /* initialize the structure; FT_QNEW zeroes it */
-      stack->memory = memory;
-      stack->error  = e;
-      stack->top    = &stack->buffer[0]; /* empty stack */
-    }
-
-    return stack;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_stack_free( CF2_Stack  stack )
-  {
-    if ( stack )
-    {
-      FT_Memory  memory = stack->memory;
-
-
-      /* free the main structure */
-      FT_FREE( stack );
-    }
-  }
-
-
-  FT_LOCAL_DEF( CF2_UInt )
-  cf2_stack_count( CF2_Stack  stack )
-  {
-    return (CF2_UInt)( stack->top - &stack->buffer[0] );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_stack_pushInt( CF2_Stack  stack,
-                     CF2_Int    val )
-  {
-    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
-    {
-      CF2_SET_ERROR( stack->error, Stack_Overflow );
-      return;     /* stack overflow */
-    }
-
-    stack->top->u.i  = val;
-    stack->top->type = CF2_NumberInt;
-    ++stack->top;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_stack_pushFixed( CF2_Stack  stack,
-                       CF2_Fixed  val )
-  {
-    if ( stack->top == &stack->buffer[CF2_OPERAND_STACK_SIZE] )
-    {
-      CF2_SET_ERROR( stack->error, Stack_Overflow );
-      return;     /* stack overflow */
-    }
-
-    stack->top->u.r  = val;
-    stack->top->type = CF2_NumberFixed;
-    ++stack->top;
-  }
-
-
-  /* this function is only allowed to pop an integer type */
-  FT_LOCAL_DEF( CF2_Int )
-  cf2_stack_popInt( CF2_Stack  stack )
-  {
-    if ( stack->top == &stack->buffer[0] )
-    {
-      CF2_SET_ERROR( stack->error, Stack_Underflow );
-      return 0;   /* underflow */
-    }
-    if ( stack->top[-1].type != CF2_NumberInt )
-    {
-      CF2_SET_ERROR( stack->error, Syntax_Error );
-      return 0;   /* type mismatch */
-    }
-
-    --stack->top;
-
-    return stack->top->u.i;
-  }
-
-
-  /* Note: type mismatch is silently cast */
-  /* TODO: check this */
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_stack_popFixed( CF2_Stack  stack )
-  {
-    if ( stack->top == &stack->buffer[0] )
-    {
-      CF2_SET_ERROR( stack->error, Stack_Underflow );
-      return cf2_intToFixed( 0 );    /* underflow */
-    }
-
-    --stack->top;
-
-    switch ( stack->top->type )
-    {
-    case CF2_NumberInt:
-      return cf2_intToFixed( stack->top->u.i );
-    case CF2_NumberFrac:
-      return cf2_fracToFixed( stack->top->u.f );
-    default:
-      return stack->top->u.r;
-    }
-  }
-
-
-  /* Note: type mismatch is silently cast */
-  /* TODO: check this */
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_stack_getReal( CF2_Stack  stack,
-                     CF2_UInt   idx )
-  {
-    FT_ASSERT( cf2_stack_count( stack ) <= CF2_OPERAND_STACK_SIZE );
-
-    if ( idx >= cf2_stack_count( stack ) )
-    {
-      CF2_SET_ERROR( stack->error, Stack_Overflow );
-      return cf2_intToFixed( 0 );    /* bounds error */
-    }
-
-    switch ( stack->buffer[idx].type )
-    {
-    case CF2_NumberInt:
-      return cf2_intToFixed( stack->buffer[idx].u.i );
-    case CF2_NumberFrac:
-      return cf2_fracToFixed( stack->buffer[idx].u.f );
-    default:
-      return stack->buffer[idx].u.r;
-    }
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_stack_clear( CF2_Stack  stack )
-  {
-    stack->top = &stack->buffer[0];
-  }
-
-
-/* END */
diff --git a/src/cff/cff.c b/src/cff/cff.c
index bb2cfb5..1a755d5 100644
--- a/src/cff/cff.c
+++ b/src/cff/cff.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType OpenType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,25 +17,14 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
 
-#include "cffpic.c"
+#include "cffcmap.c"
 #include "cffdrivr.c"
+#include "cffgload.c"
 #include "cffparse.c"
+#include "cffpic.c"
 #include "cffload.c"
 #include "cffobjs.c"
-#include "cffgload.c"
-#include "cffcmap.c"
-
-#include "cf2arrst.c"
-#include "cf2blues.c"
-#include "cf2error.c"
-#include "cf2font.c"
-#include "cf2ft.c"
-#include "cf2hints.c"
-#include "cf2intrp.c"
-#include "cf2read.c"
-#include "cf2stack.c"
 
 /* END */
diff --git a/src/cff/cffcmap.c b/src/cff/cffcmap.c
index e7538e9..e45ae11 100644
--- a/src/cff/cffcmap.c
+++ b/src/cff/cffcmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (body).                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -104,15 +104,21 @@
   }
 
 
-  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
+  FT_DEFINE_CMAP_CLASS(
+    cff_cmap_encoding_class_rec,
+
     sizeof ( CFF_CMapStdRec ),
 
-    (FT_CMap_InitFunc)     cff_cmap_encoding_init,
-    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
-    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
-    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
+    (FT_CMap_InitFunc)     cff_cmap_encoding_init,        /* init       */
+    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,        /* done       */
+    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   )
 
 
@@ -202,15 +208,22 @@
   }
 
 
-  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
+  FT_DEFINE_CMAP_CLASS(
+    cff_cmap_unicode_class_rec,
+
     sizeof ( PS_UnicodesRec ),
 
-    (FT_CMap_InitFunc)     cff_cmap_unicode_init,
-    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
-    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
-    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
+    (FT_CMap_InitFunc)     cff_cmap_unicode_init,        /* init       */
+    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,        /* done       */
+    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   )
 
+
 /* END */
diff --git a/src/cff/cffcmap.h b/src/cff/cffcmap.h
index 6eaed63..856a43d 100644
--- a/src/cff/cffcmap.h
+++ b/src/cff/cffcmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (specification).          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,10 +16,10 @@
 /***************************************************************************/
 
 
-#ifndef __CFFCMAP_H__
-#define __CFFCMAP_H__
+#ifndef CFFCMAP_H_
+#define CFFCMAP_H_
 
-#include "cffobjs.h"
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 FT_BEGIN_HEADER
 
@@ -61,7 +61,7 @@
 
 FT_END_HEADER
 
-#endif /* __CFFCMAP_H__ */
+#endif /* CFFCMAP_H_ */
 
 
 /* END */
diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c
index a718b7a..df89684 100644
--- a/src/cff/cffdrivr.c
+++ b/src/cff/cffdrivr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType font driver implementation (body).                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,16 +21,25 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
 #include FT_SERVICE_CID_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
 #include FT_SERVICE_POSTSCRIPT_NAME_H
 #include FT_SERVICE_TT_CMAP_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
 
 #include "cffdrivr.h"
 #include "cffgload.h"
 #include "cffload.h"
 #include "cffcmap.h"
 #include "cffparse.h"
+#include "cffobjs.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
+#endif
 
 #include "cfferrs.h"
 #include "cffpic.h"
@@ -38,7 +47,7 @@
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_GLYPH_DICT_H
 #include FT_SERVICE_PROPERTIES_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
 
   /*************************************************************************/
@@ -207,6 +216,13 @@
 
       if ( flags & FT_LOAD_VERTICAL_LAYOUT )
       {
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+        /* no fast retrieval for blended MM fonts without VVAR table */
+        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+             !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE )  )
+          return FT_THROW( Unimplemented_Feature );
+#endif
+
         /* check whether we have data from the `vmtx' table at all; */
         /* otherwise we extract the info from the CFF glyphstrings  */
         /* (instead of synthesizing a global value using the `OS/2' */
@@ -225,13 +241,22 @@
                                                        &dummy,
                                                        &ah );
 
-          FT_TRACE5(( "  idx %d: advance height %d font units\n",
-                      start + nn, ah ));
+          FT_TRACE5(( "  idx %d: advance height %d font unit%s\n",
+                      start + nn,
+                      ah,
+                      ah == 1 ? "" : "s" ));
           advances[nn] = ah;
         }
       }
       else
       {
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+        /* no fast retrieval for blended MM fonts without HVAR table */
+        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+             !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE )  )
+          return FT_THROW( Unimplemented_Feature );
+#endif
+
         /* check whether we have data from the `hmtx' table at all */
         if ( !ttface->horizontal.number_Of_HMetrics )
           goto Missing_Table;
@@ -247,8 +272,10 @@
                                                        &dummy,
                                                        &aw );
 
-          FT_TRACE5(( "  idx %d: advance width %d font units\n",
-                      start + nn, aw ));
+          FT_TRACE5(( "  idx %d: advance width %d font unit%s\n",
+                      start + nn,
+                      aw,
+                      aw == 1 ? "" : "s" ));
           advances[nn] = aw;
         }
       }
@@ -291,6 +318,35 @@
     FT_Error    error;
 
 
+    /* CFF2 table does not have glyph names; */
+    /* we need to use `post' table method    */
+    if ( font->version_major == 2 )
+    {
+      FT_Library            library     = FT_FACE_LIBRARY( face );
+      FT_Module             sfnt_module = FT_Get_Module( library, "sfnt" );
+      FT_Service_GlyphDict  service     =
+        (FT_Service_GlyphDict)ft_module_get_service(
+                                 sfnt_module,
+                                 FT_SERVICE_ID_GLYPH_DICT,
+                                 0 );
+
+
+      if ( service && service->get_name )
+        return service->get_name( FT_FACE( face ),
+                                  glyph_index,
+                                  buffer,
+                                  buffer_max );
+      else
+      {
+        FT_ERROR(( "cff_get_glyph_name:"
+                   " cannot get glyph name from a CFF2 font\n"
+                   "                   "
+                   " without the `PSNames' module\n" ));
+        error = FT_THROW( Missing_Module );
+        goto Exit;
+      }
+    }
+
     if ( !font->psnames )
     {
       FT_ERROR(( "cff_get_glyph_name:"
@@ -332,6 +388,31 @@
     cff     = (CFF_FontRec *)face->extra.data;
     charset = &cff->charset;
 
+    /* CFF2 table does not have glyph names; */
+    /* we need to use `post' table method    */
+    if ( cff->version_major == 2 )
+    {
+      FT_Library            library     = FT_FACE_LIBRARY( face );
+      FT_Module             sfnt_module = FT_Get_Module( library, "sfnt" );
+      FT_Service_GlyphDict  service     =
+        (FT_Service_GlyphDict)ft_module_get_service(
+                                 sfnt_module,
+                                 FT_SERVICE_ID_GLYPH_DICT,
+                                 0 );
+
+
+      if ( service && service->name_index )
+        return service->name_index( FT_FACE( face ), glyph_name );
+      else
+      {
+        FT_ERROR(( "cff_get_name_index:"
+                   " cannot get glyph index from a CFF2 font\n"
+                   "                   "
+                   " without the `PSNames' module\n" ));
+        return 0;
+      }
+    }
+
     FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
     if ( !psnames )
       return 0;
@@ -358,8 +439,9 @@
 
   FT_DEFINE_SERVICE_GLYPHDICTREC(
     cff_service_glyph_dict,
-    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,
-    (FT_GlyphDict_NameIndexFunc)cff_get_name_index
+
+    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,      /* get_name   */
+    (FT_GlyphDict_NameIndexFunc)cff_get_name_index       /* name_index */
   )
 
 
@@ -383,11 +465,11 @@
     FT_Error  error = FT_Err_Ok;
 
 
-    if ( cff && cff->font_info == NULL )
+    if ( cff && !cff->font_info )
     {
-      CFF_FontRecDict  dict   = &cff->top_font.font_dict;
+      CFF_FontRecDict  dict      = &cff->top_font.font_dict;
       PS_FontInfoRec  *font_info = NULL;
-      FT_Memory        memory = face->root.memory;
+      FT_Memory        memory    = face->root.memory;
 
 
       if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
@@ -419,13 +501,94 @@
   }
 
 
+  static FT_Error
+  cff_ps_get_font_extra( CFF_Face          face,
+                         PS_FontExtraRec*  afont_extra )
+  {
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( cff && cff->font_extra == NULL )
+    {
+      CFF_FontRecDict   dict       = &cff->top_font.font_dict;
+      PS_FontExtraRec*  font_extra = NULL;
+      FT_Memory         memory     = face->root.memory;
+      FT_String*        embedded_postscript;
+
+
+      if ( FT_ALLOC( font_extra, sizeof ( *font_extra ) ) )
+        goto Fail;
+
+      font_extra->fs_type = 0U;
+
+      embedded_postscript = cff_index_get_sid_string(
+                              cff,
+                              dict->embedded_postscript );
+      if ( embedded_postscript )
+      {
+        FT_String*  start_fstype;
+        FT_String*  start_def;
+
+
+        /* Identify the XYZ integer in `/FSType XYZ def' substring. */
+        if ( ( start_fstype = ft_strstr( embedded_postscript,
+                                         "/FSType" ) ) != NULL    &&
+             ( start_def = ft_strstr( start_fstype +
+                                        sizeof ( "/FSType" ) - 1,
+                                      "def" ) ) != NULL           )
+        {
+          FT_String*  s;
+
+
+          for ( s = start_fstype + sizeof ( "/FSType" ) - 1;
+                s != start_def;
+                s++ )
+          {
+            if ( *s >= '0' && *s <= '9' )
+            {
+              if ( font_extra->fs_type >= ( FT_USHORT_MAX - 9 ) / 10 )
+              {
+                /* Overflow - ignore the FSType value.  */
+                font_extra->fs_type = 0U;
+                break;
+              }
+
+              font_extra->fs_type *= 10;
+              font_extra->fs_type += (FT_UShort)( *s - '0' );
+            }
+            else if ( *s != ' ' && *s != '\n' && *s != '\r' )
+            {
+              /* Non-whitespace character between `/FSType' and next `def' */
+              /* - ignore the FSType value.                                */
+              font_extra->fs_type = 0U;
+              break;
+            }
+          }
+        }
+      }
+
+      cff->font_extra = font_extra;
+    }
+
+    if ( cff )
+      *afont_extra = *cff->font_extra;
+
+  Fail:
+    return error;
+  }
+
+
   FT_DEFINE_SERVICE_PSINFOREC(
     cff_service_ps_info,
-    (PS_GetFontInfoFunc)   cff_ps_get_font_info,
-    (PS_GetFontExtraFunc)  NULL,
-    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
-    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */
-    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+
+    (PS_GetFontInfoFunc)   cff_ps_get_font_info,    /* ps_get_font_info    */
+    (PS_GetFontExtraFunc)  cff_ps_get_font_extra,   /* ps_get_font_extra   */
+    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,  /* ps_has_glyph_names  */
+    /* unsupported with CFF fonts */
+    (PS_GetFontPrivateFunc)NULL,                    /* ps_get_font_private */
+    /* not implemented            */
+    (PS_GetFontValueFunc)  NULL                     /* ps_get_font_value   */
   )
 
 
@@ -444,14 +607,15 @@
     /* following the OpenType specification 1.7, we return the name stored */
     /* in the `name' table for a CFF wrapped into an SFNT container        */
 
-    if ( sfnt )
+    if ( FT_IS_SFNT( FT_FACE( face ) ) && sfnt )
     {
       FT_Library             library     = FT_FACE_LIBRARY( face );
       FT_Module              sfnt_module = FT_Get_Module( library, "sfnt" );
       FT_Service_PsFontName  service     =
         (FT_Service_PsFontName)ft_module_get_service(
                                  sfnt_module,
-                                 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME );
+                                 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME,
+                                 0 );
 
 
       if ( service && service->get_ps_font_name )
@@ -464,7 +628,8 @@
 
   FT_DEFINE_SERVICE_PSFONTNAMEREC(
     cff_service_ps_name,
-    (FT_PsName_GetFunc)cff_get_ps_name
+
+    (FT_PsName_GetFunc)cff_get_ps_name      /* get_ps_font_name */
   )
 
 
@@ -489,21 +654,21 @@
     FT_Library  library = FT_FACE_LIBRARY( face );
 
 
-    cmap_info->language = 0;
-    cmap_info->format   = 0;
-
     if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET &&
          cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET  )
     {
       FT_Module           sfnt    = FT_Get_Module( library, "sfnt" );
       FT_Service_TTCMaps  service =
         (FT_Service_TTCMaps)ft_module_get_service( sfnt,
-                                                   FT_SERVICE_ID_TT_CMAP );
+                                                   FT_SERVICE_ID_TT_CMAP,
+                                                   0 );
 
 
       if ( service && service->get_cmap_info )
         error = service->get_cmap_info( charmap, cmap_info );
     }
+    else
+      error = FT_THROW( Invalid_CharMap_Format );
 
     return error;
   }
@@ -511,7 +676,8 @@
 
   FT_DEFINE_SERVICE_TTCMAPSREC(
     cff_service_get_cmap_info,
-    (TT_CMap_Info_GetFunc)cff_get_cmap_info
+
+    (TT_CMap_Info_GetFunc)cff_get_cmap_info    /* get_cmap_info */
   )
 
 
@@ -542,7 +708,7 @@
 
       if ( registry )
       {
-        if ( cff->registry == NULL )
+        if ( !cff->registry )
           cff->registry = cff_index_get_sid_string( cff,
                                                     dict->cid_registry );
         *registry = cff->registry;
@@ -550,7 +716,7 @@
 
       if ( ordering )
       {
-        if ( cff->ordering == NULL )
+        if ( !cff->ordering )
           cff->ordering = cff_index_get_sid_string( cff,
                                                     dict->cid_ordering );
         *ordering = cff->ordering;
@@ -641,9 +807,13 @@
 
   FT_DEFINE_SERVICE_CIDREC(
     cff_service_cid_info,
-    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
-    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,
-    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index
+
+    (FT_CID_GetRegistryOrderingSupplementFunc)
+      cff_get_ros,                             /* get_ros                  */
+    (FT_CID_GetIsInternallyCIDKeyedFunc)
+      cff_get_is_cid,                          /* get_is_cid               */
+    (FT_CID_GetCIDFromGlyphIndexFunc)
+      cff_get_cid_from_glyph_index             /* get_cid_from_glyph_index */
   )
 
 
@@ -651,133 +821,166 @@
    *  PROPERTY SERVICE
    *
    */
-  static FT_Error
-  cff_property_set( FT_Module    module,         /* CFF_Driver */
-                    const char*  property_name,
-                    const void*  value )
-  {
-    FT_Error    error  = FT_Err_Ok;
-    CFF_Driver  driver = (CFF_Driver)module;
-
-
-    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
-    {
-      FT_Int*  darken_params = (FT_Int*)value;
-
-      FT_Int  x1 = darken_params[0];
-      FT_Int  y1 = darken_params[1];
-      FT_Int  x2 = darken_params[2];
-      FT_Int  y2 = darken_params[3];
-      FT_Int  x3 = darken_params[4];
-      FT_Int  y3 = darken_params[5];
-      FT_Int  x4 = darken_params[6];
-      FT_Int  y4 = darken_params[7];
-
-
-      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
-           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
-           x1 > x2  || x2 > x3  || x3 > x4              ||
-           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
-        return FT_THROW( Invalid_Argument );
-
-      driver->darken_params[0] = x1;
-      driver->darken_params[1] = y1;
-      driver->darken_params[2] = x2;
-      driver->darken_params[3] = y2;
-      driver->darken_params[4] = x3;
-      driver->darken_params[5] = y3;
-      driver->darken_params[6] = x4;
-      driver->darken_params[7] = y4;
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
-    {
-      FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-
-#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
-      if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
-        error = FT_ERR( Unimplemented_Feature );
-      else
-#endif
-        driver->hinting_engine = *hinting_engine;
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
-    {
-      FT_Bool*  no_stem_darkening = (FT_Bool*)value;
-
-
-      driver->no_stem_darkening = *no_stem_darkening;
-
-      return error;
-    }
-
-    FT_TRACE0(( "cff_property_set: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
-  static FT_Error
-  cff_property_get( FT_Module    module,         /* CFF_Driver */
-                    const char*  property_name,
-                    const void*  value )
-  {
-    FT_Error    error  = FT_Err_Ok;
-    CFF_Driver  driver = (CFF_Driver)module;
-
-
-    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
-    {
-      FT_Int*  darken_params = driver->darken_params;
-      FT_Int*  val           = (FT_Int*)value;
-
-
-      val[0] = darken_params[0];
-      val[1] = darken_params[1];
-      val[2] = darken_params[2];
-      val[3] = darken_params[3];
-      val[4] = darken_params[4];
-      val[5] = darken_params[5];
-      val[6] = darken_params[6];
-      val[7] = darken_params[7];
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
-    {
-      FT_UInt   hinting_engine    = driver->hinting_engine;
-      FT_UInt*  val               = (FT_UInt*)value;
-
-
-      *val = hinting_engine;
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
-    {
-      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
-      FT_Bool*  val               = (FT_Bool*)value;
-
-
-      *val = no_stem_darkening;
-
-      return error;
-    }
-
-    FT_TRACE0(( "cff_property_get: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
 
   FT_DEFINE_SERVICE_PROPERTIESREC(
     cff_service_properties,
-    (FT_Properties_SetFunc)cff_property_set,
-    (FT_Properties_GetFunc)cff_property_get )
+
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+  /*
+   *  MULTIPLE MASTER SERVICE
+   *
+   */
+
+  static FT_Error
+  cff_set_mm_blend( CFF_Face   face,
+                    FT_UInt    num_coords,
+                    FT_Fixed*  coords )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->set_mm_blend( FT_FACE( face ), num_coords, coords );
+  }
+
+
+  static FT_Error
+  cff_get_mm_blend( CFF_Face   face,
+                    FT_UInt    num_coords,
+                    FT_Fixed*  coords )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->get_mm_blend( FT_FACE( face ), num_coords, coords );
+  }
+
+
+  static FT_Error
+  cff_get_mm_var( CFF_Face     face,
+                  FT_MM_Var*  *master )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->get_mm_var( FT_FACE( face ), master );
+  }
+
+
+  static FT_Error
+  cff_set_var_design( CFF_Face   face,
+                      FT_UInt    num_coords,
+                      FT_Fixed*  coords )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->set_var_design( FT_FACE( face ), num_coords, coords );
+  }
+
+
+  static FT_Error
+  cff_get_var_design( CFF_Face   face,
+                      FT_UInt    num_coords,
+                      FT_Fixed*  coords )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->get_var_design( FT_FACE( face ), num_coords, coords );
+  }
+
+
+  static FT_Error
+  cff_set_instance( CFF_Face  face,
+                    FT_UInt   instance_index )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->set_instance( FT_FACE( face ), instance_index );
+  }
+
+
+  FT_DEFINE_SERVICE_MULTIMASTERSREC(
+    cff_service_multi_masters,
+
+    (FT_Get_MM_Func)        NULL,                   /* get_mm         */
+    (FT_Set_MM_Design_Func) NULL,                   /* set_mm_design  */
+    (FT_Set_MM_Blend_Func)  cff_set_mm_blend,       /* set_mm_blend   */
+    (FT_Get_MM_Blend_Func)  cff_get_mm_blend,       /* get_mm_blend   */
+    (FT_Get_MM_Var_Func)    cff_get_mm_var,         /* get_mm_var     */
+    (FT_Set_Var_Design_Func)cff_set_var_design,     /* set_var_design */
+    (FT_Get_Var_Design_Func)cff_get_var_design,     /* get_var_design */
+    (FT_Set_Instance_Func)  cff_set_instance,       /* set_instance   */
+
+    (FT_Get_Var_Blend_Func) cff_get_var_blend,      /* get_var_blend  */
+    (FT_Done_Blend_Func)    cff_done_blend          /* done_blend     */
+  )
+
+
+  /*
+   *  METRICS VARIATIONS SERVICE
+   *
+   */
+
+  static FT_Error
+  cff_hadvance_adjust( CFF_Face  face,
+                       FT_UInt   gindex,
+                       FT_Int   *avalue )
+  {
+    FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
+
+
+    return var->hadvance_adjust( FT_FACE( face ), gindex, avalue );
+  }
+
+
+  static void
+  cff_metrics_adjust( CFF_Face  face )
+  {
+    FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
+
+
+    var->metrics_adjust( FT_FACE( face ) );
+  }
+
+
+  FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
+    cff_service_metrics_variations,
+
+    (FT_HAdvance_Adjust_Func)cff_hadvance_adjust,    /* hadvance_adjust */
+    (FT_LSB_Adjust_Func)     NULL,                   /* lsb_adjust      */
+    (FT_RSB_Adjust_Func)     NULL,                   /* rsb_adjust      */
+
+    (FT_VAdvance_Adjust_Func)NULL,                   /* vadvance_adjust */
+    (FT_TSB_Adjust_Func)     NULL,                   /* tsb_adjust      */
+    (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
+    (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
+
+    (FT_Metrics_Adjust_Func) cff_metrics_adjust      /* metrics_adjust  */
+  )
+#endif
+
+
+  /*
+   *  CFFLOAD SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_CFFLOADREC(
+    cff_service_cff_load,
+
+    (FT_Get_Standard_Encoding_Func)cff_get_standard_encoding,
+    (FT_Load_Private_Dict_Func)    cff_load_private_dict,
+    (FT_FD_Select_Get_Func)        cff_fd_select_get,
+    (FT_Blend_Check_Vector_Func)   cff_blend_check_vector,
+    (FT_Blend_Build_Vector_Func)   cff_blend_build_vector
+  )
 
 
   /*************************************************************************/
@@ -792,26 +995,60 @@
   /*************************************************************************/
   /*************************************************************************/
 
-#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
-  FT_DEFINE_SERVICEDESCREC7(
+#if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \
+     defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICEDESCREC10(
     cff_services,
+
+    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
+    FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_METRICS_VARIATIONS,   &CFF_SERVICE_METRICS_VAR_GET,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
+  )
+#elif !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES
+  FT_DEFINE_SERVICEDESCREC8(
+    cff_services,
+
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
+  )
+#elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICEDESCREC9(
+    cff_services,
+
+    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
+    FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_METRICS_VARIATIONS,   &CFF_SERVICE_METRICS_VAR_GET,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #else
-  FT_DEFINE_SERVICEDESCREC6(
+  FT_DEFINE_SERVICEDESCREC7(
     cff_services,
+
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_POSTSCRIPT_INFO,      &CFF_SERVICE_PS_INFO_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #endif
 
@@ -835,7 +1072,7 @@
 #endif
 
     result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
-    if ( result != NULL )
+    if ( result )
       return result;
 
     /* `driver' is not yet evaluated in non-PIC mode */
@@ -865,42 +1102,41 @@
   FT_DEFINE_DRIVER(
     cff_driver_class,
 
-      FT_MODULE_FONT_DRIVER       |
-      FT_MODULE_DRIVER_SCALABLE   |
-      FT_MODULE_DRIVER_HAS_HINTER,
+      FT_MODULE_FONT_DRIVER          |
+      FT_MODULE_DRIVER_SCALABLE      |
+      FT_MODULE_DRIVER_HAS_HINTER    |
+      FT_MODULE_DRIVER_HINTS_LIGHTLY,
 
-      sizeof ( CFF_DriverRec ),
+      sizeof ( PS_DriverRec ),
       "cff",
       0x10000L,
       0x20000L,
 
-      0,   /* module-specific interface */
+      NULL,   /* module-specific interface */
 
-      cff_driver_init,
-      cff_driver_done,
-      cff_get_interface,
+      cff_driver_init,          /* FT_Module_Constructor  module_init   */
+      cff_driver_done,          /* FT_Module_Destructor   module_done   */
+      cff_get_interface,        /* FT_Module_Requester    get_interface */
 
-    /* now the specific driver fields */
     sizeof ( TT_FaceRec ),
     sizeof ( CFF_SizeRec ),
     sizeof ( CFF_GlyphSlotRec ),
 
-    cff_face_init,
-    cff_face_done,
-    cff_size_init,
-    cff_size_done,
-    cff_slot_init,
-    cff_slot_done,
+    cff_face_init,              /* FT_Face_InitFunc  init_face */
+    cff_face_done,              /* FT_Face_DoneFunc  done_face */
+    cff_size_init,              /* FT_Size_InitFunc  init_size */
+    cff_size_done,              /* FT_Size_DoneFunc  done_size */
+    cff_slot_init,              /* FT_Slot_InitFunc  init_slot */
+    cff_slot_done,              /* FT_Slot_DoneFunc  done_slot */
 
-    cff_glyph_load,
+    cff_glyph_load,             /* FT_Slot_LoadFunc  load_glyph */
 
-    cff_get_kerning,
-    0,                       /* FT_Face_AttachFunc */
-    cff_get_advances,
+    cff_get_kerning,            /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    cff_get_advances,           /* FT_Face_GetAdvancesFunc  get_advances */
 
-    cff_size_request,
-
-    CFF_SIZE_SELECT
+    cff_size_request,           /* FT_Size_RequestFunc  request_size */
+    CFF_SIZE_SELECT             /* FT_Size_SelectFunc   select_size  */
   )
 
 
diff --git a/src/cff/cffdrivr.h b/src/cff/cffdrivr.h
index 9527f5e..ad7c3ad 100644
--- a/src/cff/cffdrivr.h
+++ b/src/cff/cffdrivr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level OpenType driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CFFDRIVER_H__
-#define __CFFDRIVER_H__
+#ifndef CFFDRIVER_H_
+#define CFFDRIVER_H_
 
 
 #include <ft2build.h>
@@ -32,7 +32,7 @@
 
 FT_END_HEADER
 
-#endif /* __CFFDRIVER_H__ */
+#endif /* CFFDRIVER_H_ */
 
 
 /* END */
diff --git a/src/cff/cfferrs.h b/src/cff/cfferrs.h
index 543bdb0..b2e1bfa 100644
--- a/src/cff/cfferrs.h
+++ b/src/cff/cfferrs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __CFFERRS_H__
-#define __CFFERRS_H__
+#ifndef CFFERRS_H_
+#define CFFERRS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  CFF_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __CFFERRS_H__ */
+#endif /* CFFERRS_H_ */
 
 
 /* END */
diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c
index 43054f8..c58471c 100644
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (body).                                        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,13 +20,13 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_OUTLINE_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
-#include "cffobjs.h"
 #include "cffload.h"
 #include "cffgload.h"
-#include "cf2ft.h"      /* for cf2_decoder_parse_charstrings */
 
 #include "cfferrs.h"
 
@@ -41,618 +41,6 @@
 #define FT_COMPONENT  trace_cffgload
 
 
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-
-  typedef enum  CFF_Operator_
-  {
-    cff_op_unknown = 0,
-
-    cff_op_rmoveto,
-    cff_op_hmoveto,
-    cff_op_vmoveto,
-
-    cff_op_rlineto,
-    cff_op_hlineto,
-    cff_op_vlineto,
-
-    cff_op_rrcurveto,
-    cff_op_hhcurveto,
-    cff_op_hvcurveto,
-    cff_op_rcurveline,
-    cff_op_rlinecurve,
-    cff_op_vhcurveto,
-    cff_op_vvcurveto,
-
-    cff_op_flex,
-    cff_op_hflex,
-    cff_op_hflex1,
-    cff_op_flex1,
-
-    cff_op_endchar,
-
-    cff_op_hstem,
-    cff_op_vstem,
-    cff_op_hstemhm,
-    cff_op_vstemhm,
-
-    cff_op_hintmask,
-    cff_op_cntrmask,
-    cff_op_dotsection,  /* deprecated, acts as no-op */
-
-    cff_op_abs,
-    cff_op_add,
-    cff_op_sub,
-    cff_op_div,
-    cff_op_neg,
-    cff_op_random,
-    cff_op_mul,
-    cff_op_sqrt,
-
-    cff_op_blend,
-
-    cff_op_drop,
-    cff_op_exch,
-    cff_op_index,
-    cff_op_roll,
-    cff_op_dup,
-
-    cff_op_put,
-    cff_op_get,
-    cff_op_store,
-    cff_op_load,
-
-    cff_op_and,
-    cff_op_or,
-    cff_op_not,
-    cff_op_eq,
-    cff_op_ifelse,
-
-    cff_op_callsubr,
-    cff_op_callgsubr,
-    cff_op_return,
-
-    /* Type 1 opcodes: invalid but seen in real life */
-    cff_op_hsbw,
-    cff_op_closepath,
-    cff_op_callothersubr,
-    cff_op_pop,
-    cff_op_seac,
-    cff_op_sbw,
-    cff_op_setcurrentpoint,
-
-    /* do not remove */
-    cff_op_max
-
-  } CFF_Operator;
-
-
-#define CFF_COUNT_CHECK_WIDTH  0x80
-#define CFF_COUNT_EXACT        0x40
-#define CFF_COUNT_CLEAR_STACK  0x20
-
-  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */
-  /* used for checking the width and requested numbers of arguments    */
-  /* only; they are set to zero afterwards                             */
-
-  /* the other two flags are informative only and unused currently     */
-
-  static const FT_Byte  cff_argument_counts[] =
-  {
-    0,  /* unknown */
-
-    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
-    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
-    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
-
-    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-
-    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-    0 | CFF_COUNT_CLEAR_STACK,
-
-    13, /* flex */
-    7,
-    9,
-    11,
-
-    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
-
-    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
-    2 | CFF_COUNT_CHECK_WIDTH,
-    2 | CFF_COUNT_CHECK_WIDTH,
-    2 | CFF_COUNT_CHECK_WIDTH,
-
-    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
-    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
-    0, /* dotsection */
-
-    1, /* abs */
-    2,
-    2,
-    2,
-    1,
-    0,
-    2,
-    1,
-
-    1, /* blend */
-
-    1, /* drop */
-    2,
-    1,
-    2,
-    1,
-
-    2, /* put */
-    1,
-    4,
-    3,
-
-    2, /* and */
-    2,
-    1,
-    2,
-    4,
-
-    1, /* callsubr */
-    1,
-    0,
-
-    2, /* hsbw */
-    0,
-    0,
-    0,
-    5, /* seac */
-    4, /* sbw */
-    2  /* setcurrentpoint */
-  };
-
-#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /**********                                                      *********/
-  /**********                                                      *********/
-  /**********             GENERIC CHARSTRING PARSING               *********/
-  /**********                                                      *********/
-  /**********                                                      *********/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_builder_init                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given glyph builder.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    builder :: A pointer to the glyph builder to initialize.           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face    :: The current face object.                                */
-  /*                                                                       */
-  /*    size    :: The current size object.                                */
-  /*                                                                       */
-  /*    glyph   :: The current glyph object.                               */
-  /*                                                                       */
-  /*    hinting :: Whether hinting is active.                              */
-  /*                                                                       */
-  static void
-  cff_builder_init( CFF_Builder*   builder,
-                    TT_Face        face,
-                    CFF_Size       size,
-                    CFF_GlyphSlot  glyph,
-                    FT_Bool        hinting )
-  {
-    builder->path_begun  = 0;
-    builder->load_points = 1;
-
-    builder->face   = face;
-    builder->glyph  = glyph;
-    builder->memory = face->root.memory;
-
-    if ( glyph )
-    {
-      FT_GlyphLoader  loader = glyph->root.internal->loader;
-
-
-      builder->loader  = loader;
-      builder->base    = &loader->base.outline;
-      builder->current = &loader->current.outline;
-      FT_GlyphLoader_Rewind( loader );
-
-      builder->hints_globals = NULL;
-      builder->hints_funcs   = NULL;
-
-      if ( hinting && size )
-      {
-        CFF_Internal  internal = (CFF_Internal)size->root.internal;
-
-
-        builder->hints_globals = (void *)internal->topfont;
-        builder->hints_funcs   = glyph->root.internal->glyph_hints;
-      }
-    }
-
-    builder->pos_x = 0;
-    builder->pos_y = 0;
-
-    builder->left_bearing.x = 0;
-    builder->left_bearing.y = 0;
-    builder->advance.x      = 0;
-    builder->advance.y      = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_builder_done                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given glyph builder.  Its contents can still be used   */
-  /*    after the call, but the function saves important information       */
-  /*    within the corresponding glyph slot.                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    builder :: A pointer to the glyph builder to finalize.             */
-  /*                                                                       */
-  static void
-  cff_builder_done( CFF_Builder*  builder )
-  {
-    CFF_GlyphSlot  glyph = builder->glyph;
-
-
-    if ( glyph )
-      glyph->root.outline = *builder->base;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_compute_bias                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the bias value in dependence of the number of glyph       */
-  /*    subroutines.                                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */
-  /*                          dictionary.                                  */
-  /*                                                                       */
-  /*    num_subrs          :: The number of glyph subroutines.             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The bias value.                                                    */
-  static FT_Int
-  cff_compute_bias( FT_Int   in_charstring_type,
-                    FT_UInt  num_subrs )
-  {
-    FT_Int  result;
-
-
-    if ( in_charstring_type == 1 )
-      result = 0;
-    else if ( num_subrs < 1240 )
-      result = 107;
-    else if ( num_subrs < 33900U )
-      result = 1131;
-    else
-      result = 32768U;
-
-    return result;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_decoder_init                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given glyph decoder.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    decoder :: A pointer to the glyph builder to initialize.           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face      :: The current face object.                              */
-  /*                                                                       */
-  /*    size      :: The current size object.                              */
-  /*                                                                       */
-  /*    slot      :: The current glyph object.                             */
-  /*                                                                       */
-  /*    hinting   :: Whether hinting is active.                            */
-  /*                                                                       */
-  /*    hint_mode :: The hinting mode.                                     */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  cff_decoder_init( CFF_Decoder*    decoder,
-                    TT_Face         face,
-                    CFF_Size        size,
-                    CFF_GlyphSlot   slot,
-                    FT_Bool         hinting,
-                    FT_Render_Mode  hint_mode )
-  {
-    CFF_Font  cff = (CFF_Font)face->extra.data;
-
-
-    /* clear everything */
-    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
-
-    /* initialize builder */
-    cff_builder_init( &decoder->builder, face, size, slot, hinting );
-
-    /* initialize Type2 decoder */
-    decoder->cff          = cff;
-    decoder->num_globals  = cff->global_subrs_index.count;
-    decoder->globals      = cff->global_subrs;
-    decoder->globals_bias = cff_compute_bias(
-                              cff->top_font.font_dict.charstring_type,
-                              decoder->num_globals );
-
-    decoder->hint_mode    = hint_mode;
-  }
-
-
-  /* this function is used to select the subfont */
-  /* and the locals subrs array                  */
-  FT_LOCAL_DEF( FT_Error )
-  cff_decoder_prepare( CFF_Decoder*  decoder,
-                       CFF_Size      size,
-                       FT_UInt       glyph_index )
-  {
-    CFF_Builder  *builder = &decoder->builder;
-    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;
-    CFF_SubFont   sub     = &cff->top_font;
-    FT_Error      error   = FT_Err_Ok;
-
-
-    /* manage CID fonts */
-    if ( cff->num_subfonts )
-    {
-      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
-
-
-      if ( fd_index >= cff->num_subfonts )
-      {
-        FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      FT_TRACE3(( "  in subfont %d:\n", fd_index ));
-
-      sub = cff->subfonts[fd_index];
-
-      if ( builder->hints_funcs && size )
-      {
-        CFF_Internal  internal = (CFF_Internal)size->root.internal;
-
-
-        /* for CFFs without subfonts, this value has already been set */
-        builder->hints_globals = (void *)internal->subfonts[fd_index];
-      }
-    }
-
-    decoder->num_locals    = sub->local_subrs_index.count;
-    decoder->locals        = sub->local_subrs;
-    decoder->locals_bias   = cff_compute_bias(
-                               decoder->cff->top_font.font_dict.charstring_type,
-                               decoder->num_locals );
-
-    decoder->glyph_width   = sub->private_dict.default_width;
-    decoder->nominal_width = sub->private_dict.nominal_width;
-
-    decoder->current_subfont = sub;     /* for Adobe's CFF handler */
-
-  Exit:
-    return error;
-  }
-
-
-  /* check that there is enough space for `count' more points */
-  FT_LOCAL_DEF( FT_Error )
-  cff_check_points( CFF_Builder*  builder,
-                    FT_Int        count )
-  {
-    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
-  }
-
-
-  /* add a new point, do not check space */
-  FT_LOCAL_DEF( void )
-  cff_builder_add_point( CFF_Builder*  builder,
-                         FT_Pos        x,
-                         FT_Pos        y,
-                         FT_Byte       flag )
-  {
-    FT_Outline*  outline = builder->current;
-
-
-    if ( builder->load_points )
-    {
-      FT_Vector*  point   = outline->points + outline->n_points;
-      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
-
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-      CFF_Driver  driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
-
-
-      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
-      {
-        point->x = x >> 16;
-        point->y = y >> 16;
-      }
-      else
-#endif
-      {
-        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
-        point->x = x >> 10;
-        point->y = y >> 10;
-      }
-      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
-    }
-
-    outline->n_points++;
-  }
-
-
-  /* check space for a new on-curve point, then add it */
-  FT_LOCAL_DEF( FT_Error )
-  cff_builder_add_point1( CFF_Builder*  builder,
-                          FT_Pos        x,
-                          FT_Pos        y )
-  {
-    FT_Error  error;
-
-
-    error = cff_check_points( builder, 1 );
-    if ( !error )
-      cff_builder_add_point( builder, x, y, 1 );
-
-    return error;
-  }
-
-
-  /* check space for a new contour, then add it */
-  static FT_Error
-  cff_builder_add_contour( CFF_Builder*  builder )
-  {
-    FT_Outline*  outline = builder->current;
-    FT_Error     error;
-
-
-    if ( !builder->load_points )
-    {
-      outline->n_contours++;
-      return FT_Err_Ok;
-    }
-
-    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
-    if ( !error )
-    {
-      if ( outline->n_contours > 0 )
-        outline->contours[outline->n_contours - 1] =
-          (short)( outline->n_points - 1 );
-
-      outline->n_contours++;
-    }
-
-    return error;
-  }
-
-
-  /* if a path was begun, add its first on-curve point */
-  FT_LOCAL_DEF( FT_Error )
-  cff_builder_start_point( CFF_Builder*  builder,
-                           FT_Pos        x,
-                           FT_Pos        y )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* test whether we are building a new contour */
-    if ( !builder->path_begun )
-    {
-      builder->path_begun = 1;
-      error = cff_builder_add_contour( builder );
-      if ( !error )
-        error = cff_builder_add_point1( builder, x, y );
-    }
-
-    return error;
-  }
-
-
-  /* close the current contour */
-  FT_LOCAL_DEF( void )
-  cff_builder_close_contour( CFF_Builder*  builder )
-  {
-    FT_Outline*  outline = builder->current;
-    FT_Int       first;
-
-
-    if ( !outline )
-      return;
-
-    first = outline->n_contours <= 1
-            ? 0 : outline->contours[outline->n_contours - 2] + 1;
-
-    /* We must not include the last point in the path if it */
-    /* is located on the first point.                       */
-    if ( outline->n_points > 1 )
-    {
-      FT_Vector*  p1      = outline->points + first;
-      FT_Vector*  p2      = outline->points + outline->n_points - 1;
-      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
-
-
-      /* `delete' last point only if it coincides with the first    */
-      /* point and if it is not a control point (which can happen). */
-      if ( p1->x == p2->x && p1->y == p2->y )
-        if ( *control == FT_CURVE_TAG_ON )
-          outline->n_points--;
-    }
-
-    if ( outline->n_contours > 0 )
-    {
-      /* Don't add contours only consisting of one point, i.e., */
-      /* check whether begin point and last point are the same. */
-      if ( first == outline->n_points - 1 )
-      {
-        outline->n_contours--;
-        outline->n_points--;
-      }
-      else
-        outline->contours[outline->n_contours - 1] =
-          (short)( outline->n_points - 1 );
-    }
-  }
-
-
-  FT_LOCAL_DEF( FT_Int )
-  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
-                                   FT_Int    charcode )
-  {
-    FT_UInt    n;
-    FT_UShort  glyph_sid;
-
-
-    /* CID-keyed fonts don't have glyph names */
-    if ( !cff->charset.sids )
-      return -1;
-
-    /* check range of standard char code */
-    if ( charcode < 0 || charcode > 255 )
-      return -1;
-
-    /* Get code to SID mapping from `cff_standard_encoding'. */
-    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
-
-    for ( n = 0; n < cff->num_glyphs; n++ )
-    {
-      if ( cff->charset.sids[n] == glyph_sid )
-        return (FT_Int)n;
-    }
-
-    return -1;
-  }
-
-
   FT_LOCAL_DEF( FT_Error )
   cff_get_glyph_data( TT_Face    face,
                       FT_UInt    glyph_index,
@@ -680,7 +68,7 @@
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
     {
-      CFF_Font  cff  = (CFF_Font)(face->extra.data);
+      CFF_Font  cff = (CFF_Font)(face->extra.data);
 
 
       return cff_index_access_element( &cff->charstrings_index, glyph_index,
@@ -724,1811 +112,6 @@
   }
 
 
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-
-  static FT_Error
-  cff_operator_seac( CFF_Decoder*  decoder,
-                     FT_Pos        asb,
-                     FT_Pos        adx,
-                     FT_Pos        ady,
-                     FT_Int        bchar,
-                     FT_Int        achar )
-  {
-    FT_Error      error;
-    CFF_Builder*  builder = &decoder->builder;
-    FT_Int        bchar_index, achar_index;
-    TT_Face       face = decoder->builder.face;
-    FT_Vector     left_bearing, advance;
-    FT_Byte*      charstring;
-    FT_ULong      charstring_len;
-    FT_Pos        glyph_width;
-
-
-    if ( decoder->seac )
-    {
-      FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
-      return FT_THROW( Syntax_Error );
-    }
-
-    adx += decoder->builder.left_bearing.x;
-    ady += decoder->builder.left_bearing.y;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    /* Incremental fonts don't necessarily have valid charsets.        */
-    /* They use the character code, not the glyph index, in this case. */
-    if ( face->root.internal->incremental_interface )
-    {
-      bchar_index = bchar;
-      achar_index = achar;
-    }
-    else
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-    {
-      CFF_Font cff = (CFF_Font)(face->extra.data);
-
-
-      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
-      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
-    }
-
-    if ( bchar_index < 0 || achar_index < 0 )
-    {
-      FT_ERROR(( "cff_operator_seac:"
-                 " invalid seac character code arguments\n" ));
-      return FT_THROW( Syntax_Error );
-    }
-
-    /* If we are trying to load a composite glyph, do not load the */
-    /* accent character and return the array of subglyphs.         */
-    if ( builder->no_recurse )
-    {
-      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;
-      FT_GlyphLoader  loader = glyph->internal->loader;
-      FT_SubGlyph     subg;
-
-
-      /* reallocate subglyph array if necessary */
-      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
-      if ( error )
-        goto Exit;
-
-      subg = loader->current.subglyphs;
-
-      /* subglyph 0 = base character */
-      subg->index = bchar_index;
-      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
-                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
-      subg->arg1  = 0;
-      subg->arg2  = 0;
-      subg++;
-
-      /* subglyph 1 = accent character */
-      subg->index = achar_index;
-      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
-      subg->arg1  = (FT_Int)( adx >> 16 );
-      subg->arg2  = (FT_Int)( ady >> 16 );
-
-      /* set up remaining glyph fields */
-      glyph->num_subglyphs = 2;
-      glyph->subglyphs     = loader->base.subglyphs;
-      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
-
-      loader->current.num_subglyphs = 2;
-    }
-
-    FT_GlyphLoader_Prepare( builder->loader );
-
-    /* First load `bchar' in builder */
-    error = cff_get_glyph_data( face, (FT_UInt)bchar_index,
-                                &charstring, &charstring_len );
-    if ( !error )
-    {
-      /* the seac operator must not be nested */
-      decoder->seac = TRUE;
-      error = cff_decoder_parse_charstrings( decoder, charstring,
-                                             charstring_len );
-      decoder->seac = FALSE;
-
-      cff_free_glyph_data( face, &charstring, charstring_len );
-
-      if ( error )
-        goto Exit;
-    }
-
-    /* Save the left bearing, advance and glyph width of the base */
-    /* character as they will be erased by the next load.         */
-
-    left_bearing = builder->left_bearing;
-    advance      = builder->advance;
-    glyph_width  = decoder->glyph_width;
-
-    builder->left_bearing.x = 0;
-    builder->left_bearing.y = 0;
-
-    builder->pos_x = adx - asb;
-    builder->pos_y = ady;
-
-    /* Now load `achar' on top of the base outline. */
-    error = cff_get_glyph_data( face, (FT_UInt)achar_index,
-                                &charstring, &charstring_len );
-    if ( !error )
-    {
-      /* the seac operator must not be nested */
-      decoder->seac = TRUE;
-      error = cff_decoder_parse_charstrings( decoder, charstring,
-                                             charstring_len );
-      decoder->seac = FALSE;
-
-      cff_free_glyph_data( face, &charstring, charstring_len );
-
-      if ( error )
-        goto Exit;
-    }
-
-    /* Restore the left side bearing, advance and glyph width */
-    /* of the base character.                                 */
-    builder->left_bearing = left_bearing;
-    builder->advance      = advance;
-    decoder->glyph_width  = glyph_width;
-
-    builder->pos_x = 0;
-    builder->pos_y = 0;
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_decoder_parse_charstrings                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Parses a given Type 2 charstrings program.                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    decoder         :: The current Type 1 decoder.                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    charstring_base :: The base of the charstring stream.              */
-  /*                                                                       */
-  /*    charstring_len  :: The length in bytes of the charstring stream.   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len )
-  {
-    FT_Error           error;
-    CFF_Decoder_Zone*  zone;
-    FT_Byte*           ip;
-    FT_Byte*           limit;
-    CFF_Builder*       builder = &decoder->builder;
-    FT_Pos             x, y;
-    FT_Fixed           seed;
-    FT_Fixed*          stack;
-    FT_Int             charstring_type =
-                         decoder->cff->top_font.font_dict.charstring_type;
-
-    T2_Hints_Funcs     hinter;
-
-
-    /* set default width */
-    decoder->num_hints  = 0;
-    decoder->read_width = 1;
-
-    /* compute random seed from stack address of parameter */
-    seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed            ^
-                         (FT_Offset)(char*)&decoder         ^
-                         (FT_Offset)(char*)&charstring_base ) &
-                         FT_ULONG_MAX                         );
-    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
-    if ( seed == 0 )
-      seed = 0x7384;
-
-    /* initialize the decoder */
-    decoder->top  = decoder->stack;
-    decoder->zone = decoder->zones;
-    zone          = decoder->zones;
-    stack         = decoder->top;
-
-    hinter = (T2_Hints_Funcs)builder->hints_funcs;
-
-    builder->path_begun = 0;
-
-    zone->base           = charstring_base;
-    limit = zone->limit  = charstring_base + charstring_len;
-    ip    = zone->cursor = zone->base;
-
-    error = FT_Err_Ok;
-
-    x = builder->pos_x;
-    y = builder->pos_y;
-
-    /* begin hints recording session, if any */
-    if ( hinter )
-      hinter->open( hinter->hints );
-
-    /* now execute loop */
-    while ( ip < limit )
-    {
-      CFF_Operator  op;
-      FT_Byte       v;
-
-
-      /********************************************************************/
-      /*                                                                  */
-      /* Decode operator or operand                                       */
-      /*                                                                  */
-      v = *ip++;
-      if ( v >= 32 || v == 28 )
-      {
-        FT_Int    shift = 16;
-        FT_Int32  val;
-
-
-        /* this is an operand, push it on the stack */
-
-        /* if we use shifts, all computations are done with unsigned */
-        /* values; the conversion to a signed value is the last step */
-        if ( v == 28 )
-        {
-          if ( ip + 1 >= limit )
-            goto Syntax_Error;
-          val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
-          ip += 2;
-        }
-        else if ( v < 247 )
-          val = (FT_Int32)v - 139;
-        else if ( v < 251 )
-        {
-          if ( ip >= limit )
-            goto Syntax_Error;
-          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
-        }
-        else if ( v < 255 )
-        {
-          if ( ip >= limit )
-            goto Syntax_Error;
-          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
-        }
-        else
-        {
-          if ( ip + 3 >= limit )
-            goto Syntax_Error;
-          val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
-                            ( (FT_UInt32)ip[1] << 16 ) |
-                            ( (FT_UInt32)ip[2] <<  8 ) |
-                              (FT_UInt32)ip[3]         );
-          ip    += 4;
-          if ( charstring_type == 2 )
-            shift = 0;
-        }
-        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
-          goto Stack_Overflow;
-
-        val             = (FT_Int32)( (FT_UInt32)val << shift );
-        *decoder->top++ = val;
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( !( val & 0xFFFFL ) )
-          FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
-        else
-          FT_TRACE4(( " %.2f", val / 65536.0 ));
-#endif
-
-      }
-      else
-      {
-        /* The specification says that normally arguments are to be taken */
-        /* from the bottom of the stack.  However, this seems not to be   */
-        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
-        /* arguments similar to a PS interpreter.                         */
-
-        FT_Fixed*  args     = decoder->top;
-        FT_Int     num_args = (FT_Int)( args - decoder->stack );
-        FT_Int     req_args;
-
-
-        /* find operator */
-        op = cff_op_unknown;
-
-        switch ( v )
-        {
-        case 1:
-          op = cff_op_hstem;
-          break;
-        case 3:
-          op = cff_op_vstem;
-          break;
-        case 4:
-          op = cff_op_vmoveto;
-          break;
-        case 5:
-          op = cff_op_rlineto;
-          break;
-        case 6:
-          op = cff_op_hlineto;
-          break;
-        case 7:
-          op = cff_op_vlineto;
-          break;
-        case 8:
-          op = cff_op_rrcurveto;
-          break;
-        case 9:
-          op = cff_op_closepath;
-          break;
-        case 10:
-          op = cff_op_callsubr;
-          break;
-        case 11:
-          op = cff_op_return;
-          break;
-        case 12:
-          {
-            if ( ip >= limit )
-              goto Syntax_Error;
-            v = *ip++;
-
-            switch ( v )
-            {
-            case 0:
-              op = cff_op_dotsection;
-              break;
-            case 1: /* this is actually the Type1 vstem3 operator */
-              op = cff_op_vstem;
-              break;
-            case 2: /* this is actually the Type1 hstem3 operator */
-              op = cff_op_hstem;
-              break;
-            case 3:
-              op = cff_op_and;
-              break;
-            case 4:
-              op = cff_op_or;
-              break;
-            case 5:
-              op = cff_op_not;
-              break;
-            case 6:
-              op = cff_op_seac;
-              break;
-            case 7:
-              op = cff_op_sbw;
-              break;
-            case 8:
-              op = cff_op_store;
-              break;
-            case 9:
-              op = cff_op_abs;
-              break;
-            case 10:
-              op = cff_op_add;
-              break;
-            case 11:
-              op = cff_op_sub;
-              break;
-            case 12:
-              op = cff_op_div;
-              break;
-            case 13:
-              op = cff_op_load;
-              break;
-            case 14:
-              op = cff_op_neg;
-              break;
-            case 15:
-              op = cff_op_eq;
-              break;
-            case 16:
-              op = cff_op_callothersubr;
-              break;
-            case 17:
-              op = cff_op_pop;
-              break;
-            case 18:
-              op = cff_op_drop;
-              break;
-            case 20:
-              op = cff_op_put;
-              break;
-            case 21:
-              op = cff_op_get;
-              break;
-            case 22:
-              op = cff_op_ifelse;
-              break;
-            case 23:
-              op = cff_op_random;
-              break;
-            case 24:
-              op = cff_op_mul;
-              break;
-            case 26:
-              op = cff_op_sqrt;
-              break;
-            case 27:
-              op = cff_op_dup;
-              break;
-            case 28:
-              op = cff_op_exch;
-              break;
-            case 29:
-              op = cff_op_index;
-              break;
-            case 30:
-              op = cff_op_roll;
-              break;
-            case 33:
-              op = cff_op_setcurrentpoint;
-              break;
-            case 34:
-              op = cff_op_hflex;
-              break;
-            case 35:
-              op = cff_op_flex;
-              break;
-            case 36:
-              op = cff_op_hflex1;
-              break;
-            case 37:
-              op = cff_op_flex1;
-              break;
-            default:
-              FT_TRACE4(( " unknown op (12, %d)\n", v ));
-              break;
-            }
-          }
-          break;
-        case 13:
-          op = cff_op_hsbw;
-          break;
-        case 14:
-          op = cff_op_endchar;
-          break;
-        case 16:
-          op = cff_op_blend;
-          break;
-        case 18:
-          op = cff_op_hstemhm;
-          break;
-        case 19:
-          op = cff_op_hintmask;
-          break;
-        case 20:
-          op = cff_op_cntrmask;
-          break;
-        case 21:
-          op = cff_op_rmoveto;
-          break;
-        case 22:
-          op = cff_op_hmoveto;
-          break;
-        case 23:
-          op = cff_op_vstemhm;
-          break;
-        case 24:
-          op = cff_op_rcurveline;
-          break;
-        case 25:
-          op = cff_op_rlinecurve;
-          break;
-        case 26:
-          op = cff_op_vvcurveto;
-          break;
-        case 27:
-          op = cff_op_hhcurveto;
-          break;
-        case 29:
-          op = cff_op_callgsubr;
-          break;
-        case 30:
-          op = cff_op_vhcurveto;
-          break;
-        case 31:
-          op = cff_op_hvcurveto;
-          break;
-        default:
-          FT_TRACE4(( " unknown op (%d)\n", v ));
-          break;
-        }
-
-        if ( op == cff_op_unknown )
-          continue;
-
-        /* check arguments */
-        req_args = cff_argument_counts[op];
-        if ( req_args & CFF_COUNT_CHECK_WIDTH )
-        {
-          if ( num_args > 0 && decoder->read_width )
-          {
-            /* If `nominal_width' is non-zero, the number is really a      */
-            /* difference against `nominal_width'.  Else, the number here  */
-            /* is truly a width, not a difference against `nominal_width'. */
-            /* If the font does not set `nominal_width', then              */
-            /* `nominal_width' defaults to zero, and so we can set         */
-            /* `glyph_width' to `nominal_width' plus number on the stack   */
-            /* -- for either case.                                         */
-
-            FT_Int  set_width_ok;
-
-
-            switch ( op )
-            {
-            case cff_op_hmoveto:
-            case cff_op_vmoveto:
-              set_width_ok = num_args & 2;
-              break;
-
-            case cff_op_hstem:
-            case cff_op_vstem:
-            case cff_op_hstemhm:
-            case cff_op_vstemhm:
-            case cff_op_rmoveto:
-            case cff_op_hintmask:
-            case cff_op_cntrmask:
-              set_width_ok = num_args & 1;
-              break;
-
-            case cff_op_endchar:
-              /* If there is a width specified for endchar, we either have */
-              /* 1 argument or 5 arguments.  We like to argue.             */
-              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
-              break;
-
-            default:
-              set_width_ok = 0;
-              break;
-            }
-
-            if ( set_width_ok )
-            {
-              decoder->glyph_width = decoder->nominal_width +
-                                       ( stack[0] >> 16 );
-
-              if ( decoder->width_only )
-              {
-                /* we only want the advance width; stop here */
-                break;
-              }
-
-              /* Consumed an argument. */
-              num_args--;
-            }
-          }
-
-          decoder->read_width = 0;
-          req_args            = 0;
-        }
-
-        req_args &= 0x000F;
-        if ( num_args < req_args )
-          goto Stack_Underflow;
-        args     -= req_args;
-        num_args -= req_args;
-
-        /* At this point, `args' points to the first argument of the  */
-        /* operand in case `req_args' isn't zero.  Otherwise, we have */
-        /* to adjust `args' manually.                                 */
-
-        /* Note that we only pop arguments from the stack which we    */
-        /* really need and can digest so that we can continue in case */
-        /* of superfluous stack elements.                             */
-
-        switch ( op )
-        {
-        case cff_op_hstem:
-        case cff_op_vstem:
-        case cff_op_hstemhm:
-        case cff_op_vstemhm:
-          /* the number of arguments is always even here */
-          FT_TRACE4((
-              op == cff_op_hstem   ? " hstem\n"   :
-            ( op == cff_op_vstem   ? " vstem\n"   :
-            ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
-
-          if ( hinter )
-            hinter->stems( hinter->hints,
-                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
-                           num_args / 2,
-                           args - ( num_args & ~1 ) );
-
-          decoder->num_hints += num_args / 2;
-          args = stack;
-          break;
-
-        case cff_op_hintmask:
-        case cff_op_cntrmask:
-          FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
-
-          /* implement vstem when needed --                        */
-          /* the specification doesn't say it, but this also works */
-          /* with the 'cntrmask' operator                          */
-          /*                                                       */
-          if ( num_args > 0 )
-          {
-            if ( hinter )
-              hinter->stems( hinter->hints,
-                             0,
-                             num_args / 2,
-                             args - ( num_args & ~1 ) );
-
-            decoder->num_hints += num_args / 2;
-          }
-
-          /* In a valid charstring there must be at least one byte */
-          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */
-          /* instruction).  Additionally, there must be space for  */
-          /* `num_hints' bits.                                     */
-
-          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
-            goto Syntax_Error;
-
-          if ( hinter )
-          {
-            if ( op == cff_op_hintmask )
-              hinter->hintmask( hinter->hints,
-                                (FT_UInt)builder->current->n_points,
-                                (FT_UInt)decoder->num_hints,
-                                ip );
-            else
-              hinter->counter( hinter->hints,
-                               (FT_UInt)decoder->num_hints,
-                               ip );
-          }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-          {
-            FT_UInt maskbyte;
-
-
-            FT_TRACE4(( " (maskbytes:" ));
-
-            for ( maskbyte = 0;
-                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
-                  maskbyte++, ip++ )
-              FT_TRACE4(( " 0x%02X", *ip ));
-
-            FT_TRACE4(( ")\n" ));
-          }
-#else
-          ip += ( decoder->num_hints + 7 ) >> 3;
-#endif
-          args = stack;
-          break;
-
-        case cff_op_rmoveto:
-          FT_TRACE4(( " rmoveto\n" ));
-
-          cff_builder_close_contour( builder );
-          builder->path_begun = 0;
-          x   += args[-2];
-          y   += args[-1];
-          args = stack;
-          break;
-
-        case cff_op_vmoveto:
-          FT_TRACE4(( " vmoveto\n" ));
-
-          cff_builder_close_contour( builder );
-          builder->path_begun = 0;
-          y   += args[-1];
-          args = stack;
-          break;
-
-        case cff_op_hmoveto:
-          FT_TRACE4(( " hmoveto\n" ));
-
-          cff_builder_close_contour( builder );
-          builder->path_begun = 0;
-          x   += args[-1];
-          args = stack;
-          break;
-
-        case cff_op_rlineto:
-          FT_TRACE4(( " rlineto\n" ));
-
-          if ( cff_builder_start_point( builder, x, y )  ||
-               cff_check_points( builder, num_args / 2 ) )
-            goto Fail;
-
-          if ( num_args < 2 )
-            goto Stack_Underflow;
-
-          args -= num_args & ~1;
-          while ( args < decoder->top )
-          {
-            x += args[0];
-            y += args[1];
-            cff_builder_add_point( builder, x, y, 1 );
-            args += 2;
-          }
-          args = stack;
-          break;
-
-        case cff_op_hlineto:
-        case cff_op_vlineto:
-          {
-            FT_Int  phase = ( op == cff_op_hlineto );
-
-
-            FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
-                                             : " vlineto\n" ));
-
-            if ( num_args < 0 )
-              goto Stack_Underflow;
-
-            /* there exist subsetted fonts (found in PDFs) */
-            /* which call `hlineto' without arguments      */
-            if ( num_args == 0 )
-              break;
-
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, num_args )    )
-              goto Fail;
-
-            args = stack;
-            while ( args < decoder->top )
-            {
-              if ( phase )
-                x += args[0];
-              else
-                y += args[0];
-
-              if ( cff_builder_add_point1( builder, x, y ) )
-                goto Fail;
-
-              args++;
-              phase ^= 1;
-            }
-            args = stack;
-          }
-          break;
-
-        case cff_op_rrcurveto:
-          {
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( " rrcurveto\n" ));
-
-            if ( num_args < 6 )
-              goto Stack_Underflow;
-
-            nargs = num_args - num_args % 6;
-
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, nargs / 2 )   )
-              goto Fail;
-
-            args -= nargs;
-            while ( args < decoder->top )
-            {
-              x += args[0];
-              y += args[1];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[2];
-              y += args[3];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[4];
-              y += args[5];
-              cff_builder_add_point( builder, x, y, 1 );
-              args += 6;
-            }
-            args = stack;
-          }
-          break;
-
-        case cff_op_vvcurveto:
-          {
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( " vvcurveto\n" ));
-
-            if ( num_args < 4 )
-              goto Stack_Underflow;
-
-            /* if num_args isn't of the form 4n or 4n+1, */
-            /* we enforce it by clearing the second bit  */
-
-            nargs = num_args & ~2;
-
-            if ( cff_builder_start_point( builder, x, y ) )
-              goto Fail;
-
-            args -= nargs;
-
-            if ( nargs & 1 )
-            {
-              x += args[0];
-              args++;
-              nargs--;
-            }
-
-            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
-              goto Fail;
-
-            while ( args < decoder->top )
-            {
-              y += args[0];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[1];
-              y += args[2];
-              cff_builder_add_point( builder, x, y, 0 );
-              y += args[3];
-              cff_builder_add_point( builder, x, y, 1 );
-              args += 4;
-            }
-            args = stack;
-          }
-          break;
-
-        case cff_op_hhcurveto:
-          {
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( " hhcurveto\n" ));
-
-            if ( num_args < 4 )
-              goto Stack_Underflow;
-
-            /* if num_args isn't of the form 4n or 4n+1, */
-            /* we enforce it by clearing the second bit  */
-
-            nargs = num_args & ~2;
-
-            if ( cff_builder_start_point( builder, x, y ) )
-              goto Fail;
-
-            args -= nargs;
-            if ( nargs & 1 )
-            {
-              y += args[0];
-              args++;
-              nargs--;
-            }
-
-            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
-              goto Fail;
-
-            while ( args < decoder->top )
-            {
-              x += args[0];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[1];
-              y += args[2];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[3];
-              cff_builder_add_point( builder, x, y, 1 );
-              args += 4;
-            }
-            args = stack;
-          }
-          break;
-
-        case cff_op_vhcurveto:
-        case cff_op_hvcurveto:
-          {
-            FT_Int  phase;
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
-                                               : " hvcurveto\n" ));
-
-            if ( cff_builder_start_point( builder, x, y ) )
-              goto Fail;
-
-            if ( num_args < 4 )
-              goto Stack_Underflow;
-
-            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
-            /* we enforce it by clearing the second bit               */
-
-            nargs = num_args & ~2;
-
-            args -= nargs;
-            if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
-              goto Stack_Underflow;
-
-            phase = ( op == cff_op_hvcurveto );
-
-            while ( nargs >= 4 )
-            {
-              nargs -= 4;
-              if ( phase )
-              {
-                x += args[0];
-                cff_builder_add_point( builder, x, y, 0 );
-                x += args[1];
-                y += args[2];
-                cff_builder_add_point( builder, x, y, 0 );
-                y += args[3];
-                if ( nargs == 1 )
-                  x += args[4];
-                cff_builder_add_point( builder, x, y, 1 );
-              }
-              else
-              {
-                y += args[0];
-                cff_builder_add_point( builder, x, y, 0 );
-                x += args[1];
-                y += args[2];
-                cff_builder_add_point( builder, x, y, 0 );
-                x += args[3];
-                if ( nargs == 1 )
-                  y += args[4];
-                cff_builder_add_point( builder, x, y, 1 );
-              }
-              args  += 4;
-              phase ^= 1;
-            }
-            args = stack;
-          }
-          break;
-
-        case cff_op_rlinecurve:
-          {
-            FT_Int  num_lines;
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( " rlinecurve\n" ));
-
-            if ( num_args < 8 )
-              goto Stack_Underflow;
-
-            nargs     = num_args & ~1;
-            num_lines = ( nargs - 6 ) / 2;
-
-            if ( cff_builder_start_point( builder, x, y )   ||
-                 cff_check_points( builder, num_lines + 3 ) )
-              goto Fail;
-
-            args -= nargs;
-
-            /* first, add the line segments */
-            while ( num_lines > 0 )
-            {
-              x += args[0];
-              y += args[1];
-              cff_builder_add_point( builder, x, y, 1 );
-              args += 2;
-              num_lines--;
-            }
-
-            /* then the curve */
-            x += args[0];
-            y += args[1];
-            cff_builder_add_point( builder, x, y, 0 );
-            x += args[2];
-            y += args[3];
-            cff_builder_add_point( builder, x, y, 0 );
-            x += args[4];
-            y += args[5];
-            cff_builder_add_point( builder, x, y, 1 );
-            args = stack;
-          }
-          break;
-
-        case cff_op_rcurveline:
-          {
-            FT_Int  num_curves;
-            FT_Int  nargs;
-
-
-            FT_TRACE4(( " rcurveline\n" ));
-
-            if ( num_args < 8 )
-              goto Stack_Underflow;
-
-            nargs      = num_args - 2;
-            nargs      = nargs - nargs % 6 + 2;
-            num_curves = ( nargs - 2 ) / 6;
-
-            if ( cff_builder_start_point( builder, x, y )        ||
-                 cff_check_points( builder, num_curves * 3 + 2 ) )
-              goto Fail;
-
-            args -= nargs;
-
-            /* first, add the curves */
-            while ( num_curves > 0 )
-            {
-              x += args[0];
-              y += args[1];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[2];
-              y += args[3];
-              cff_builder_add_point( builder, x, y, 0 );
-              x += args[4];
-              y += args[5];
-              cff_builder_add_point( builder, x, y, 1 );
-              args += 6;
-              num_curves--;
-            }
-
-            /* then the final line */
-            x += args[0];
-            y += args[1];
-            cff_builder_add_point( builder, x, y, 1 );
-            args = stack;
-          }
-          break;
-
-        case cff_op_hflex1:
-          {
-            FT_Pos start_y;
-
-
-            FT_TRACE4(( " hflex1\n" ));
-
-            /* adding five more points: 4 control points, 1 on-curve point */
-            /* -- make sure we have enough space for the start point if it */
-            /* needs to be added                                           */
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, 6 )           )
-              goto Fail;
-
-            /* record the starting point's y position for later use */
-            start_y = y;
-
-            /* first control point */
-            x += args[0];
-            y += args[1];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* second control point */
-            x += args[2];
-            y += args[3];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* join point; on curve, with y-value the same as the last */
-            /* control point's y-value                                 */
-            x += args[4];
-            cff_builder_add_point( builder, x, y, 1 );
-
-            /* third control point, with y-value the same as the join */
-            /* point's y-value                                        */
-            x += args[5];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* fourth control point */
-            x += args[6];
-            y += args[7];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* ending point, with y-value the same as the start   */
-            x += args[8];
-            y  = start_y;
-            cff_builder_add_point( builder, x, y, 1 );
-
-            args = stack;
-            break;
-          }
-
-        case cff_op_hflex:
-          {
-            FT_Pos start_y;
-
-
-            FT_TRACE4(( " hflex\n" ));
-
-            /* adding six more points; 4 control points, 2 on-curve points */
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, 6 )           )
-              goto Fail;
-
-            /* record the starting point's y-position for later use */
-            start_y = y;
-
-            /* first control point */
-            x += args[0];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* second control point */
-            x += args[1];
-            y += args[2];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* join point; on curve, with y-value the same as the last */
-            /* control point's y-value                                 */
-            x += args[3];
-            cff_builder_add_point( builder, x, y, 1 );
-
-            /* third control point, with y-value the same as the join */
-            /* point's y-value                                        */
-            x += args[4];
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* fourth control point */
-            x += args[5];
-            y  = start_y;
-            cff_builder_add_point( builder, x, y, 0 );
-
-            /* ending point, with y-value the same as the start point's */
-            /* y-value -- we don't add this point, though               */
-            x += args[6];
-            cff_builder_add_point( builder, x, y, 1 );
-
-            args = stack;
-            break;
-          }
-
-        case cff_op_flex1:
-          {
-            FT_Pos     start_x, start_y; /* record start x, y values for */
-                                         /* alter use                    */
-            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */
-                                         /* algorithm below              */
-            FT_Int     horizontal, count;
-            FT_Fixed*  temp;
-
-
-            FT_TRACE4(( " flex1\n" ));
-
-            /* adding six more points; 4 control points, 2 on-curve points */
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, 6 )           )
-              goto Fail;
-
-            /* record the starting point's x, y position for later use */
-            start_x = x;
-            start_y = y;
-
-            /* XXX: figure out whether this is supposed to be a horizontal */
-            /*      or vertical flex; the Type 2 specification is vague... */
-
-            temp = args;
-
-            /* grab up to the last argument */
-            for ( count = 5; count > 0; count-- )
-            {
-              dx += temp[0];
-              dy += temp[1];
-              temp += 2;
-            }
-
-            if ( dx < 0 )
-              dx = -dx;
-            if ( dy < 0 )
-              dy = -dy;
-
-            /* strange test, but here it is... */
-            horizontal = ( dx > dy );
-
-            for ( count = 5; count > 0; count-- )
-            {
-              x += args[0];
-              y += args[1];
-              cff_builder_add_point( builder, x, y,
-                                     (FT_Bool)( count == 3 ) );
-              args += 2;
-            }
-
-            /* is last operand an x- or y-delta? */
-            if ( horizontal )
-            {
-              x += args[0];
-              y  = start_y;
-            }
-            else
-            {
-              x  = start_x;
-              y += args[0];
-            }
-
-            cff_builder_add_point( builder, x, y, 1 );
-
-            args = stack;
-            break;
-           }
-
-        case cff_op_flex:
-          {
-            FT_UInt  count;
-
-
-            FT_TRACE4(( " flex\n" ));
-
-            if ( cff_builder_start_point( builder, x, y ) ||
-                 cff_check_points( builder, 6 )           )
-              goto Fail;
-
-            for ( count = 6; count > 0; count-- )
-            {
-              x += args[0];
-              y += args[1];
-              cff_builder_add_point( builder, x, y,
-                                     (FT_Bool)( count == 4 || count == 1 ) );
-              args += 2;
-            }
-
-            args = stack;
-          }
-          break;
-
-        case cff_op_seac:
-            FT_TRACE4(( " seac\n" ));
-
-            error = cff_operator_seac( decoder,
-                                       args[0], args[1], args[2],
-                                       (FT_Int)( args[3] >> 16 ),
-                                       (FT_Int)( args[4] >> 16 ) );
-
-            /* add current outline to the glyph slot */
-            FT_GlyphLoader_Add( builder->loader );
-
-            /* return now! */
-            FT_TRACE4(( "\n" ));
-            return error;
-
-        case cff_op_endchar:
-          FT_TRACE4(( " endchar\n" ));
-
-          /* We are going to emulate the seac operator. */
-          if ( num_args >= 4 )
-          {
-            /* Save glyph width so that the subglyphs don't overwrite it. */
-            FT_Pos  glyph_width = decoder->glyph_width;
-
-
-            error = cff_operator_seac( decoder,
-                                       0L, args[-4], args[-3],
-                                       (FT_Int)( args[-2] >> 16 ),
-                                       (FT_Int)( args[-1] >> 16 ) );
-
-            decoder->glyph_width = glyph_width;
-          }
-          else
-          {
-            cff_builder_close_contour( builder );
-
-            /* close hints recording session */
-            if ( hinter )
-            {
-              if ( hinter->close( hinter->hints,
-                                  (FT_UInt)builder->current->n_points ) )
-                goto Syntax_Error;
-
-              /* apply hints to the loaded glyph outline now */
-              error = hinter->apply( hinter->hints,
-                                     builder->current,
-                                     (PSH_Globals)builder->hints_globals,
-                                     decoder->hint_mode );
-              if ( error )
-                goto Fail;
-            }
-
-            /* add current outline to the glyph slot */
-            FT_GlyphLoader_Add( builder->loader );
-          }
-
-          /* return now! */
-          FT_TRACE4(( "\n" ));
-          return error;
-
-        case cff_op_abs:
-          FT_TRACE4(( " abs\n" ));
-
-          if ( args[0] < 0 )
-            args[0] = -args[0];
-          args++;
-          break;
-
-        case cff_op_add:
-          FT_TRACE4(( " add\n" ));
-
-          args[0] += args[1];
-          args++;
-          break;
-
-        case cff_op_sub:
-          FT_TRACE4(( " sub\n" ));
-
-          args[0] -= args[1];
-          args++;
-          break;
-
-        case cff_op_div:
-          FT_TRACE4(( " div\n" ));
-
-          args[0] = FT_DivFix( args[0], args[1] );
-          args++;
-          break;
-
-        case cff_op_neg:
-          FT_TRACE4(( " neg\n" ));
-
-          args[0] = -args[0];
-          args++;
-          break;
-
-        case cff_op_random:
-          {
-            FT_Fixed  Rand;
-
-
-            FT_TRACE4(( " rand\n" ));
-
-            Rand = seed;
-            if ( Rand >= 0x8000L )
-              Rand++;
-
-            args[0] = Rand;
-            seed    = FT_MulFix( seed, 0x10000L - seed );
-            if ( seed == 0 )
-              seed += 0x2873;
-            args++;
-          }
-          break;
-
-        case cff_op_mul:
-          FT_TRACE4(( " mul\n" ));
-
-          args[0] = FT_MulFix( args[0], args[1] );
-          args++;
-          break;
-
-        case cff_op_sqrt:
-          FT_TRACE4(( " sqrt\n" ));
-
-          if ( args[0] > 0 )
-          {
-            FT_Int    count = 9;
-            FT_Fixed  root  = args[0];
-            FT_Fixed  new_root;
-
-
-            for (;;)
-            {
-              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
-              if ( new_root == root || count <= 0 )
-                break;
-              root = new_root;
-            }
-            args[0] = new_root;
-          }
-          else
-            args[0] = 0;
-          args++;
-          break;
-
-        case cff_op_drop:
-          /* nothing */
-          FT_TRACE4(( " drop\n" ));
-
-          break;
-
-        case cff_op_exch:
-          {
-            FT_Fixed  tmp;
-
-
-            FT_TRACE4(( " exch\n" ));
-
-            tmp     = args[0];
-            args[0] = args[1];
-            args[1] = tmp;
-            args   += 2;
-          }
-          break;
-
-        case cff_op_index:
-          {
-            FT_Int  idx = (FT_Int)( args[0] >> 16 );
-
-
-            FT_TRACE4(( " index\n" ));
-
-            if ( idx < 0 )
-              idx = 0;
-            else if ( idx > num_args - 2 )
-              idx = num_args - 2;
-            args[0] = args[-( idx + 1 )];
-            args++;
-          }
-          break;
-
-        case cff_op_roll:
-          {
-            FT_Int  count = (FT_Int)( args[0] >> 16 );
-            FT_Int  idx   = (FT_Int)( args[1] >> 16 );
-
-
-            FT_TRACE4(( " roll\n" ));
-
-            if ( count <= 0 )
-              count = 1;
-
-            args -= count;
-            if ( args < stack )
-              goto Stack_Underflow;
-
-            if ( idx >= 0 )
-            {
-              while ( idx > 0 )
-              {
-                FT_Fixed  tmp = args[count - 1];
-                FT_Int    i;
-
-
-                for ( i = count - 2; i >= 0; i-- )
-                  args[i + 1] = args[i];
-                args[0] = tmp;
-                idx--;
-              }
-            }
-            else
-            {
-              while ( idx < 0 )
-              {
-                FT_Fixed  tmp = args[0];
-                FT_Int    i;
-
-
-                for ( i = 0; i < count - 1; i++ )
-                  args[i] = args[i + 1];
-                args[count - 1] = tmp;
-                idx++;
-              }
-            }
-            args += count;
-          }
-          break;
-
-        case cff_op_dup:
-          FT_TRACE4(( " dup\n" ));
-
-          args[1] = args[0];
-          args += 2;
-          break;
-
-        case cff_op_put:
-          {
-            FT_Fixed  val = args[0];
-            FT_Int    idx = (FT_Int)( args[1] >> 16 );
-
-
-            FT_TRACE4(( " put\n" ));
-
-            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
-              decoder->buildchar[idx] = val;
-          }
-          break;
-
-        case cff_op_get:
-          {
-            FT_Int    idx = (FT_Int)( args[0] >> 16 );
-            FT_Fixed  val = 0;
-
-
-            FT_TRACE4(( " get\n" ));
-
-            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
-              val = decoder->buildchar[idx];
-
-            args[0] = val;
-            args++;
-          }
-          break;
-
-        case cff_op_store:
-          FT_TRACE4(( " store\n"));
-
-          goto Unimplemented;
-
-        case cff_op_load:
-          FT_TRACE4(( " load\n" ));
-
-          goto Unimplemented;
-
-        case cff_op_dotsection:
-          /* this operator is deprecated and ignored by the parser */
-          FT_TRACE4(( " dotsection\n" ));
-          break;
-
-        case cff_op_closepath:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " closepath (invalid op)\n" ));
-
-          args = stack;
-          break;
-
-        case cff_op_hsbw:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " hsbw (invalid op)\n" ));
-
-          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
-
-          decoder->builder.left_bearing.x = args[0];
-          decoder->builder.left_bearing.y = 0;
-
-          x    = decoder->builder.pos_x + args[0];
-          y    = decoder->builder.pos_y;
-          args = stack;
-          break;
-
-        case cff_op_sbw:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " sbw (invalid op)\n" ));
-
-          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
-
-          decoder->builder.left_bearing.x = args[0];
-          decoder->builder.left_bearing.y = args[1];
-
-          x    = decoder->builder.pos_x + args[0];
-          y    = decoder->builder.pos_y + args[1];
-          args = stack;
-          break;
-
-        case cff_op_setcurrentpoint:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
-
-          x    = decoder->builder.pos_x + args[0];
-          y    = decoder->builder.pos_y + args[1];
-          args = stack;
-          break;
-
-        case cff_op_callothersubr:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " callothersubr (invalid op)\n" ));
-
-          /* subsequent `pop' operands should add the arguments,       */
-          /* this is the implementation described for `unknown' other  */
-          /* subroutines in the Type1 spec.                            */
-          /*                                                           */
-          /* XXX Fix return arguments (see discussion below).          */
-          args -= 2 + ( args[-2] >> 16 );
-          if ( args < stack )
-            goto Stack_Underflow;
-          break;
-
-        case cff_op_pop:
-          /* this is an invalid Type 2 operator; however, there        */
-          /* exist fonts which are incorrectly converted from probably */
-          /* Type 1 to CFF, and some parsers seem to accept it         */
-
-          FT_TRACE4(( " pop (invalid op)\n" ));
-
-          /* XXX Increasing `args' is wrong: After a certain number of */
-          /* `pop's we get a stack overflow.  Reason for doing it is   */
-          /* code like this (actually found in a CFF font):            */
-          /*                                                           */
-          /*   17 1 3 callothersubr                                    */
-          /*   pop                                                     */
-          /*   callsubr                                                */
-          /*                                                           */
-          /* Since we handle `callothersubr' as a no-op, and           */
-          /* `callsubr' needs at least one argument, `pop' can't be a  */
-          /* no-op too as it basically should be.                      */
-          /*                                                           */
-          /* The right solution would be to provide real support for   */
-          /* `callothersubr' as done in `t1decode.c', however, given   */
-          /* the fact that CFF fonts with `pop' are invalid, it is     */
-          /* questionable whether it is worth the time.                */
-          args++;
-          break;
-
-        case cff_op_and:
-          {
-            FT_Fixed  cond = args[0] && args[1];
-
-
-            FT_TRACE4(( " and\n" ));
-
-            args[0] = cond ? 0x10000L : 0;
-            args++;
-          }
-          break;
-
-        case cff_op_or:
-          {
-            FT_Fixed  cond = args[0] || args[1];
-
-
-            FT_TRACE4(( " or\n" ));
-
-            args[0] = cond ? 0x10000L : 0;
-            args++;
-          }
-          break;
-
-        case cff_op_eq:
-          {
-            FT_Fixed  cond = !args[0];
-
-
-            FT_TRACE4(( " eq\n" ));
-
-            args[0] = cond ? 0x10000L : 0;
-            args++;
-          }
-          break;
-
-        case cff_op_ifelse:
-          {
-            FT_Fixed  cond = ( args[2] <= args[3] );
-
-
-            FT_TRACE4(( " ifelse\n" ));
-
-            if ( !cond )
-              args[0] = args[1];
-            args++;
-          }
-          break;
-
-        case cff_op_callsubr:
-          {
-            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
-                                      decoder->locals_bias );
-
-
-            FT_TRACE4(( " callsubr (idx %d, entering level %d)\n",
-                        idx,
-                        zone - decoder->zones + 1 ));
-
-            if ( idx >= decoder->num_locals )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " invalid local subr index\n" ));
-              goto Syntax_Error;
-            }
-
-            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " too many nested subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            zone->cursor = ip;  /* save current instruction pointer */
-
-            zone++;
-            zone->base   = decoder->locals[idx];
-            zone->limit  = decoder->locals[idx + 1];
-            zone->cursor = zone->base;
-
-            if ( !zone->base || zone->limit == zone->base )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " invoking empty subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            decoder->zone = zone;
-            ip            = zone->base;
-            limit         = zone->limit;
-          }
-          break;
-
-        case cff_op_callgsubr:
-          {
-            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
-                                      decoder->globals_bias );
-
-
-            FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n",
-                        idx,
-                        zone - decoder->zones + 1 ));
-
-            if ( idx >= decoder->num_globals )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " invalid global subr index\n" ));
-              goto Syntax_Error;
-            }
-
-            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " too many nested subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            zone->cursor = ip;  /* save current instruction pointer */
-
-            zone++;
-            zone->base   = decoder->globals[idx];
-            zone->limit  = decoder->globals[idx + 1];
-            zone->cursor = zone->base;
-
-            if ( !zone->base || zone->limit == zone->base )
-            {
-              FT_ERROR(( "cff_decoder_parse_charstrings:"
-                         " invoking empty subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            decoder->zone = zone;
-            ip            = zone->base;
-            limit         = zone->limit;
-          }
-          break;
-
-        case cff_op_return:
-          FT_TRACE4(( " return (leaving level %d)\n",
-                      decoder->zone - decoder->zones ));
-
-          if ( decoder->zone <= decoder->zones )
-          {
-            FT_ERROR(( "cff_decoder_parse_charstrings:"
-                       " unexpected return\n" ));
-            goto Syntax_Error;
-          }
-
-          decoder->zone--;
-          zone  = decoder->zone;
-          ip    = zone->cursor;
-          limit = zone->limit;
-          break;
-
-        default:
-        Unimplemented:
-          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
-
-          if ( ip[-1] == 12 )
-            FT_ERROR(( " %d", ip[0] ));
-          FT_ERROR(( "\n" ));
-
-          return FT_THROW( Unimplemented_Feature );
-        }
-
-        decoder->top = args;
-
-        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
-          goto Stack_Overflow;
-
-      } /* general operator processing */
-
-    } /* while ip < limit */
-
-    FT_TRACE4(( "..end..\n\n" ));
-
-  Fail:
-    return error;
-
-  Syntax_Error:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
-    return FT_THROW( Invalid_File_Format );
-
-  Stack_Underflow:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
-    return FT_THROW( Too_Few_Arguments );
-
-  Stack_Overflow:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
-    return FT_THROW( Stack_Overflow );
-  }
-
-#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
-
-
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
@@ -2559,11 +142,14 @@
     FT_Int       glyph_index;
     CFF_Font     cff = (CFF_Font)face->other;
 
+    PSAux_Service            psaux         = (PSAux_Service)face->psaux;
+    const CFF_Decoder_Funcs  decoder_funcs = psaux->cff_decoder_funcs;
+
 
     *max_advance = 0;
 
     /* Initialize load decoder */
-    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+    decoder_funcs->init( &decoder, face, 0, 0, 0, 0, 0, 0 );
 
     decoder.builder.metrics_only = 1;
     decoder.builder.load_points  = 0;
@@ -2582,11 +168,12 @@
                                   &charstring, &charstring_len );
       if ( !error )
       {
-        error = cff_decoder_prepare( &decoder, size, glyph_index );
+        error = decoder_funcs->prepare( &decoder, size, glyph_index );
         if ( !error )
-          error = cff_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len );
+          error = decoder_funcs->parse_charstrings_old( &decoder,
+                                                        charstring,
+                                                        charstring_len,
+                                                        0 );
 
         cff_free_glyph_data( face, &charstring, &charstring_len );
       }
@@ -2612,10 +199,14 @@
   {
     FT_Error     error;
     CFF_Decoder  decoder;
+    PS_Decoder   psdecoder;
     TT_Face      face = (TT_Face)glyph->root.face;
     FT_Bool      hinting, scaled, force_scaling;
     CFF_Font     cff  = (CFF_Font)face->extra.data;
 
+    PSAux_Service            psaux         = (PSAux_Service)face->psaux;
+    const CFF_Decoder_Funcs  decoder_funcs = psaux->cff_decoder_funcs;
+
     FT_Matrix    font_matrix;
     FT_Vector    font_offset;
 
@@ -2805,7 +396,7 @@
 
     {
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );
+      PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
 #endif
 
 
@@ -2813,9 +404,12 @@
       FT_ULong  charstring_len;
 
 
-      cff_decoder_init( &decoder, face, size, glyph, hinting,
-                        FT_LOAD_TARGET_MODE( load_flags ) );
+      decoder_funcs->init( &decoder, face, size, glyph, hinting,
+                           FT_LOAD_TARGET_MODE( load_flags ),
+                           cff_get_glyph_data,
+                           cff_free_glyph_data );
 
+      /* this is for pure CFFs */
       if ( load_flags & FT_LOAD_ADVANCE_ONLY )
         decoder.width_only = TRUE;
 
@@ -2828,22 +422,25 @@
       if ( error )
         goto Glyph_Build_Finished;
 
-      error = cff_decoder_prepare( &decoder, size, glyph_index );
+      error = decoder_funcs->prepare( &decoder, size, glyph_index );
       if ( error )
         goto Glyph_Build_Finished;
 
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
       /* choose which CFF renderer to use */
-      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
-        error = cff_decoder_parse_charstrings( &decoder,
-                                               charstring,
-                                               charstring_len );
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE )
+        error = decoder_funcs->parse_charstrings_old( &decoder,
+                                                      charstring,
+                                                      charstring_len,
+                                                      0 );
       else
 #endif
       {
-        error = cf2_decoder_parse_charstrings( &decoder,
-                                               charstring,
-                                               charstring_len );
+        psaux->ps_decoder_init( &psdecoder, &decoder, FALSE );
+
+        error = decoder_funcs->parse_charstrings( &psdecoder,
+                                                  charstring,
+                                                  charstring_len );
 
         /* Adobe's engine uses 16.16 numbers everywhere;              */
         /* as a consequence, glyphs larger than 2000ppem get rejected */
@@ -2856,9 +453,9 @@
           force_scaling = TRUE;
           glyph->hint   = hinting;
 
-          error = cf2_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len );
+          error = decoder_funcs->parse_charstrings( &psdecoder,
+                                                    charstring,
+                                                    charstring_len );
         }
       }
 
@@ -2896,7 +493,7 @@
   Glyph_Build_Finished:
       /* save new glyph tables, if no error */
       if ( !error )
-        cff_builder_done( &decoder.builder );
+        decoder.builder.funcs.done( &decoder.builder );
       /* XXX: anything to do for broken glyph entry? */
     }
 
@@ -2949,7 +546,6 @@
       {
         FT_BBox            cbox;
         FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
-        FT_Vector          advance;
         FT_Bool            has_vertical_info;
 
 
@@ -3014,26 +610,27 @@
 
         glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
 
-        if ( !( font_matrix.xx == 0x10000L &&
-                font_matrix.yy == 0x10000L &&
-                font_matrix.xy == 0        &&
-                font_matrix.yx == 0        ) )
+        /* apply the font matrix, if any */
+        if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
+             font_matrix.xy != 0        || font_matrix.yx != 0        )
+        {
           FT_Outline_Transform( &glyph->root.outline, &font_matrix );
 
-        if ( !( font_offset.x == 0 &&
-                font_offset.y == 0 ) )
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance,
+                                            font_matrix.xx );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance,
+                                            font_matrix.yy );
+        }
+
+        if ( font_offset.x || font_offset.y )
+        {
           FT_Outline_Translate( &glyph->root.outline,
-                                font_offset.x, font_offset.y );
+                                font_offset.x,
+                                font_offset.y );
 
-        advance.x = metrics->horiAdvance;
-        advance.y = 0;
-        FT_Vector_Transform( &advance, &font_matrix );
-        metrics->horiAdvance = advance.x + font_offset.x;
-
-        advance.x = 0;
-        advance.y = metrics->vertAdvance;
-        FT_Vector_Transform( &advance, &font_matrix );
-        metrics->vertAdvance = advance.y + font_offset.y;
+          metrics->horiAdvance += font_offset.x;
+          metrics->vertAdvance += font_offset.y;
+        }
 
         if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
         {
@@ -3064,9 +661,7 @@
         metrics->width  = cbox.xMax - cbox.xMin;
         metrics->height = cbox.yMax - cbox.yMin;
 
-        if ( !face->horizontal.number_Of_HMetrics )
-          metrics->horiBearingX = cbox.xMin;
-
+        metrics->horiBearingX = cbox.xMin;
         metrics->horiBearingY = cbox.yMax;
 
         if ( has_vertical_info )
diff --git a/src/cff/cffgload.h b/src/cff/cffgload.h
index 5f2655f..803f397 100644
--- a/src/cff/cffgload.h
+++ b/src/cff/cffgload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,125 +16,17 @@
 /***************************************************************************/
 
 
-#ifndef __CFFGLOAD_H__
-#define __CFFGLOAD_H__
+#ifndef CFFGLOAD_H_
+#define CFFGLOAD_H_
 
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
-#include "cffobjs.h"
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 
 FT_BEGIN_HEADER
 
-
-#define CFF_MAX_OPERANDS        48
-#define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
-                                    /* only 10 are allowed but there exist */
-                                    /* fonts like `HiraKakuProN-W3.ttf'    */
-                                    /* (Hiragino Kaku Gothic ProN W3;      */
-                                    /* 8.2d6e1; 2014-12-19) that exceed    */
-                                    /* this limit                          */
-#define CFF_MAX_TRANS_ELEMENTS  32
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Structure>                                                           */
-  /*    CFF_Builder                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*     A structure used during glyph loading to store its outline.       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    memory        :: The current memory object.                        */
-  /*                                                                       */
-  /*    face          :: The current face object.                          */
-  /*                                                                       */
-  /*    glyph         :: The current glyph slot.                           */
-  /*                                                                       */
-  /*    loader        :: The current glyph loader.                         */
-  /*                                                                       */
-  /*    base          :: The base glyph outline.                           */
-  /*                                                                       */
-  /*    current       :: The current glyph outline.                        */
-  /*                                                                       */
-  /*    pos_x         :: The horizontal translation (if composite glyph).  */
-  /*                                                                       */
-  /*    pos_y         :: The vertical translation (if composite glyph).    */
-  /*                                                                       */
-  /*    left_bearing  :: The left side bearing point.                      */
-  /*                                                                       */
-  /*    advance       :: The horizontal advance vector.                    */
-  /*                                                                       */
-  /*    bbox          :: Unused.                                           */
-  /*                                                                       */
-  /*    path_begun    :: A flag which indicates that a new path has begun. */
-  /*                                                                       */
-  /*    load_points   :: If this flag is not set, no points are loaded.    */
-  /*                                                                       */
-  /*    no_recurse    :: Set but not used.                                 */
-  /*                                                                       */
-  /*    metrics_only  :: A boolean indicating that we only want to compute */
-  /*                     the metrics of a given glyph, not load all of its */
-  /*                     points.                                           */
-  /*                                                                       */
-  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */
-  /*                                                                       */
-  /*    hints_globals :: Auxiliary pointer for hinting.                    */
-  /*                                                                       */
-  typedef struct  CFF_Builder_
-  {
-    FT_Memory       memory;
-    TT_Face         face;
-    CFF_GlyphSlot   glyph;
-    FT_GlyphLoader  loader;
-    FT_Outline*     base;
-    FT_Outline*     current;
-
-    FT_Pos          pos_x;
-    FT_Pos          pos_y;
-
-    FT_Vector       left_bearing;
-    FT_Vector       advance;
-
-    FT_BBox         bbox;          /* bounding box */
-    FT_Bool         path_begun;
-    FT_Bool         load_points;
-    FT_Bool         no_recurse;
-
-    FT_Bool         metrics_only;
-
-    void*           hints_funcs;    /* hinter-specific */
-    void*           hints_globals;  /* hinter-specific */
-
-  } CFF_Builder;
-
-
-  FT_LOCAL( FT_Error )
-  cff_check_points( CFF_Builder*  builder,
-                    FT_Int        count );
-
-  FT_LOCAL( void )
-  cff_builder_add_point( CFF_Builder*  builder,
-                         FT_Pos        x,
-                         FT_Pos        y,
-                         FT_Byte       flag );
-  FT_LOCAL( FT_Error )
-  cff_builder_add_point1( CFF_Builder*  builder,
-                          FT_Pos        x,
-                          FT_Pos        y );
-  FT_LOCAL( FT_Error )
-  cff_builder_start_point( CFF_Builder*  builder,
-                           FT_Pos        x,
-                           FT_Pos        y );
-  FT_LOCAL( void )
-  cff_builder_close_contour( CFF_Builder*  builder );
-
-
-  FT_LOCAL( FT_Int )
-  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
-                                   FT_Int    charcode );
   FT_LOCAL( FT_Error )
   cff_get_glyph_data( TT_Face    face,
                       FT_UInt    glyph_index,
@@ -146,74 +38,6 @@
                        FT_ULong   length );
 
 
-  /* execution context charstring zone */
-
-  typedef struct  CFF_Decoder_Zone_
-  {
-    FT_Byte*  base;
-    FT_Byte*  limit;
-    FT_Byte*  cursor;
-
-  } CFF_Decoder_Zone;
-
-
-  typedef struct  CFF_Decoder_
-  {
-    CFF_Builder        builder;
-    CFF_Font           cff;
-
-    FT_Fixed           stack[CFF_MAX_OPERANDS + 1];
-    FT_Fixed*          top;
-
-    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
-    CFF_Decoder_Zone*  zone;
-
-    FT_Int             flex_state;
-    FT_Int             num_flex_vectors;
-    FT_Vector          flex_vectors[7];
-
-    FT_Pos             glyph_width;
-    FT_Pos             nominal_width;
-
-    FT_Bool            read_width;
-    FT_Bool            width_only;
-    FT_Int             num_hints;
-    FT_Fixed           buildchar[CFF_MAX_TRANS_ELEMENTS];
-
-    FT_UInt            num_locals;
-    FT_UInt            num_globals;
-
-    FT_Int             locals_bias;
-    FT_Int             globals_bias;
-
-    FT_Byte**          locals;
-    FT_Byte**          globals;
-
-    FT_Byte**          glyph_names;   /* for pure CFF fonts only  */
-    FT_UInt            num_glyphs;    /* number of glyphs in font */
-
-    FT_Render_Mode     hint_mode;
-
-    FT_Bool            seac;
-
-    CFF_SubFont        current_subfont; /* for current glyph_index */
-
-  } CFF_Decoder;
-
-
-  FT_LOCAL( void )
-  cff_decoder_init( CFF_Decoder*    decoder,
-                    TT_Face         face,
-                    CFF_Size        size,
-                    CFF_GlyphSlot   slot,
-                    FT_Bool         hinting,
-                    FT_Render_Mode  hint_mode );
-
-  FT_LOCAL( FT_Error )
-  cff_decoder_prepare( CFF_Decoder*  decoder,
-                       CFF_Size      size,
-                       FT_UInt       glyph_index );
-
 #if 0  /* unused until we support pure CFF fonts */
 
   /* Compute the maximum advance width of a font through quick parsing */
@@ -223,12 +47,6 @@
 
 #endif /* 0 */
 
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-  FT_LOCAL( FT_Error )
-  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len );
-#endif
 
   FT_LOCAL( FT_Error )
   cff_slot_load( CFF_GlyphSlot  glyph,
@@ -239,7 +57,7 @@
 
 FT_END_HEADER
 
-#endif /* __CFFGLOAD_H__ */
+#endif /* CFFGLOAD_H_ */
 
 
 /* END */
diff --git a/src/cff/cffload.c b/src/cff/cffload.c
index fcb7348..1c6fe51 100644
--- a/src/cff/cffload.c
+++ b/src/cff/cffload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType and CFF data/program tables loader (body).                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,12 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#endif
 
 #include "cffload.h"
 #include "cffparse.h"
@@ -29,6 +35,9 @@
 #include "cfferrs.h"
 
 
+#define FT_FIXED_ONE  ( (FT_Fixed)0x10000 )
+
+
 #if 1
 
   static const FT_UShort  cff_isoadobe_charset[229] =
@@ -225,19 +234,33 @@
   static FT_Error
   cff_index_init( CFF_Index  idx,
                   FT_Stream  stream,
-                  FT_Bool    load )
+                  FT_Bool    load,
+                  FT_Bool    cff2 )
   {
     FT_Error   error;
     FT_Memory  memory = stream->memory;
-    FT_UShort  count;
+    FT_UInt    count;
 
 
-    FT_MEM_ZERO( idx, sizeof ( *idx ) );
+    FT_ZERO( idx );
 
     idx->stream = stream;
     idx->start  = FT_STREAM_POS();
-    if ( !FT_READ_USHORT( count ) &&
-         count > 0                )
+
+    if ( cff2 )
+    {
+      if ( FT_READ_ULONG( count ) )
+        goto Exit;
+      idx->hdr_size = 5;
+    }
+    else
+    {
+      if ( FT_READ_USHORT( count ) )
+        goto Exit;
+      idx->hdr_size = 3;
+    }
+
+    if ( count > 0 )
     {
       FT_Byte   offsize;
       FT_ULong  size;
@@ -258,7 +281,7 @@
       idx->off_size = offsize;
       size          = (FT_ULong)( count + 1 ) * offsize;
 
-      idx->data_offset = idx->start + 3 + size;
+      idx->data_offset = idx->start + idx->hdr_size + size;
 
       if ( FT_STREAM_SKIP( size - offsize ) )
         goto Exit;
@@ -310,7 +333,7 @@
         FT_FRAME_RELEASE( idx->bytes );
 
       FT_FREE( idx->offsets );
-      FT_MEM_ZERO( idx, sizeof ( *idx ) );
+      FT_ZERO( idx );
     }
   }
 
@@ -323,7 +346,7 @@
     FT_Memory  memory = stream->memory;
 
 
-    if ( idx->count > 0 && idx->offsets == NULL )
+    if ( idx->count > 0 && !idx->offsets )
     {
       FT_Byte    offsize = idx->off_size;
       FT_ULong   data_size;
@@ -335,7 +358,7 @@
       data_size = (FT_ULong)( idx->count + 1 ) * offsize;
 
       if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
-           FT_STREAM_SEEK( idx->start + 3 )             ||
+           FT_STREAM_SEEK( idx->start + idx->hdr_size ) ||
            FT_FRAME_ENTER( data_size )                  )
         goto Exit;
 
@@ -382,28 +405,31 @@
   static FT_Error
   cff_index_get_pointers( CFF_Index   idx,
                           FT_Byte***  table,
-                          FT_Byte**   pool )
+                          FT_Byte**   pool,
+                          FT_ULong*   pool_size )
   {
     FT_Error   error     = FT_Err_Ok;
     FT_Memory  memory    = idx->stream->memory;
 
     FT_Byte**  t         = NULL;
     FT_Byte*   new_bytes = NULL;
+    FT_ULong   new_size;
 
 
     *table = NULL;
 
-    if ( idx->offsets == NULL )
+    if ( !idx->offsets )
     {
       error = cff_index_load_offsets( idx );
       if ( error )
         goto Exit;
     }
 
-    if ( idx->count > 0                                        &&
-         !FT_NEW_ARRAY( t, idx->count + 1 )                    &&
-         ( !pool || !FT_ALLOC( new_bytes,
-                               idx->data_size + idx->count ) ) )
+    new_size = idx->data_size + idx->count;
+
+    if ( idx->count > 0                                &&
+         !FT_NEW_ARRAY( t, idx->count + 1 )            &&
+         ( !pool || !FT_ALLOC( new_bytes, new_size ) ) )
     {
       FT_ULong  n, cur_offset;
       FT_ULong  extra = 0;
@@ -459,6 +485,8 @@
 
       if ( pool )
         *pool = new_bytes;
+      if ( pool_size )
+        *pool_size = new_size;
     }
 
   Exit:
@@ -488,7 +516,7 @@
         FT_ULong  pos = element * idx->off_size;
 
 
-        if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
+        if ( FT_STREAM_SEEK( idx->start + idx->hdr_size + pos ) )
           goto Exit;
 
         off1 = cff_index_read_offset( idx, &error );
@@ -501,8 +529,8 @@
           {
             element++;
             off2 = cff_index_read_offset( idx, &error );
-          }
-          while ( off2 == 0 && element < idx->count );
+
+          } while ( off2 == 0 && element < idx->count );
         }
       }
       else   /* use offsets table */
@@ -584,20 +612,26 @@
                       FT_UInt   element )
   {
     CFF_Index   idx = &font->name_index;
-    FT_Memory   memory = idx->stream->memory;
+    FT_Memory   memory;
     FT_Byte*    bytes;
     FT_ULong    byte_len;
     FT_Error    error;
     FT_String*  name = 0;
 
 
+    if ( !idx->stream )  /* CFF2 does not include a name index */
+      goto Exit;
+
+    memory = idx->stream->memory;
+
     error = cff_index_access_element( idx, element, &bytes, &byte_len );
     if ( error )
       goto Exit;
 
     if ( !FT_ALLOC( name, byte_len + 1 ) )
     {
-      FT_MEM_COPY( name, bytes, byte_len );
+      if ( byte_len )
+        FT_MEM_COPY( name, bytes, byte_len );
       name[byte_len] = 0;
     }
     cff_index_forget_element( idx, &bytes );
@@ -719,6 +753,11 @@
     FT_Byte  fd = 0;
 
 
+    /* if there is no FDSelect, return zero               */
+    /* Note: CFF2 with just one Font Dict has no FDSelect */
+    if ( !fdselect->data )
+      goto Exit;
+
     switch ( fdselect->format )
     {
     case 0:
@@ -771,6 +810,7 @@
       ;
     }
 
+  Exit:
     return fd;
   }
 
@@ -809,7 +849,7 @@
     /* When multiple GIDs map to the same CID, we choose the lowest */
     /* GID.  This is not described in any spec, but it matches the  */
     /* behaviour of recent Acroread versions.                       */
-    for ( j = (FT_Long)num_glyphs - 1; j >= 0 ; j-- )
+    for ( j = (FT_Long)num_glyphs - 1; j >= 0; j-- )
       charset->cids[charset->sids[j]] = (FT_UShort)j;
 
     charset->max_cid    = max_cid;
@@ -871,8 +911,8 @@
     FT_UShort  glyph_sid;
 
 
-    /* If the the offset is greater than 2, we have to parse the */
-    /* charset table.                                            */
+    /* If the offset is greater than 2, we have to parse the charset */
+    /* table.                                                        */
     if ( offset > 2 )
     {
       FT_UInt  j;
@@ -1049,6 +1089,523 @@
 
 
   static void
+  cff_vstore_done( CFF_VStoreRec*  vstore,
+                   FT_Memory       memory )
+  {
+    FT_UInt  i;
+
+
+    /* free regionList and axisLists */
+    if ( vstore->varRegionList )
+    {
+      for ( i = 0; i < vstore->regionCount; i++ )
+        FT_FREE( vstore->varRegionList[i].axisList );
+    }
+    FT_FREE( vstore->varRegionList );
+
+    /* free varData and indices */
+    if ( vstore->varData )
+    {
+      for ( i = 0; i < vstore->dataCount; i++ )
+        FT_FREE( vstore->varData[i].regionIndices );
+    }
+    FT_FREE( vstore->varData );
+  }
+
+
+  /* convert 2.14 to Fixed */
+  #define FT_fdot14ToFixed( x )  ( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
+
+
+  static FT_Error
+  cff_vstore_load( CFF_VStoreRec*  vstore,
+                   FT_Stream       stream,
+                   FT_ULong        base_offset,
+                   FT_ULong        offset )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = FT_ERR( Invalid_File_Format );
+
+    FT_ULong*  dataOffsetArray = NULL;
+    FT_UInt    i, j;
+
+
+    /* no offset means no vstore to parse */
+    if ( offset )
+    {
+      FT_UInt   vsOffset;
+      FT_UInt   format;
+      FT_ULong  regionListOffset;
+
+
+      /* we need to parse the table to determine its size; */
+      /* skip table length                                 */
+      if ( FT_STREAM_SEEK( base_offset + offset ) ||
+           FT_STREAM_SKIP( 2 )                    )
+        goto Exit;
+
+      /* actual variation store begins after the length */
+      vsOffset = FT_STREAM_POS();
+
+      /* check the header */
+      if ( FT_READ_USHORT( format ) )
+        goto Exit;
+      if ( format != 1 )
+      {
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* read top level fields */
+      if ( FT_READ_ULONG( regionListOffset )   ||
+           FT_READ_USHORT( vstore->dataCount ) )
+        goto Exit;
+
+      /* make temporary copy of item variation data offsets; */
+      /* we'll parse region list first, then come back       */
+      if ( FT_NEW_ARRAY( dataOffsetArray, vstore->dataCount ) )
+        goto Exit;
+
+      for ( i = 0; i < vstore->dataCount; i++ )
+      {
+        if ( FT_READ_ULONG( dataOffsetArray[i] ) )
+          goto Exit;
+      }
+
+      /* parse regionList and axisLists */
+      if ( FT_STREAM_SEEK( vsOffset + regionListOffset ) ||
+           FT_READ_USHORT( vstore->axisCount )           ||
+           FT_READ_USHORT( vstore->regionCount )         )
+        goto Exit;
+
+      if ( FT_NEW_ARRAY( vstore->varRegionList, vstore->regionCount ) )
+        goto Exit;
+
+      for ( i = 0; i < vstore->regionCount; i++ )
+      {
+        CFF_VarRegion*  region = &vstore->varRegionList[i];
+
+
+        if ( FT_NEW_ARRAY( region->axisList, vstore->axisCount ) )
+          goto Exit;
+
+        for ( j = 0; j < vstore->axisCount; j++ )
+        {
+          CFF_AxisCoords*  axis = &region->axisList[j];
+
+          FT_Int16  start14, peak14, end14;
+
+
+          if ( FT_READ_SHORT( start14 ) ||
+               FT_READ_SHORT( peak14 )  ||
+               FT_READ_SHORT( end14 )   )
+            goto Exit;
+
+          axis->startCoord = FT_fdot14ToFixed( start14 );
+          axis->peakCoord  = FT_fdot14ToFixed( peak14 );
+          axis->endCoord   = FT_fdot14ToFixed( end14 );
+        }
+      }
+
+      /* use dataOffsetArray now to parse varData items */
+      if ( FT_NEW_ARRAY( vstore->varData, vstore->dataCount ) )
+        goto Exit;
+
+      for ( i = 0; i < vstore->dataCount; i++ )
+      {
+        CFF_VarData*  data = &vstore->varData[i];
+
+
+        if ( FT_STREAM_SEEK( vsOffset + dataOffsetArray[i] ) )
+          goto Exit;
+
+        /* ignore `itemCount' and `shortDeltaCount' */
+        /* because CFF2 has no delta sets           */
+        if ( FT_STREAM_SKIP( 4 ) )
+          goto Exit;
+
+        /* Note: just record values; consistency is checked later    */
+        /*       by cff_blend_build_vector when it consumes `vstore' */
+
+        if ( FT_READ_USHORT( data->regionIdxCount ) )
+          goto Exit;
+
+        if ( FT_NEW_ARRAY( data->regionIndices, data->regionIdxCount ) )
+          goto Exit;
+
+        for ( j = 0; j < data->regionIdxCount; j++ )
+        {
+          if ( FT_READ_USHORT( data->regionIndices[j] ) )
+            goto Exit;
+        }
+      }
+    }
+
+    error = FT_Err_Ok;
+
+  Exit:
+    FT_FREE( dataOffsetArray );
+    if ( error )
+      cff_vstore_done( vstore, memory );
+
+    return error;
+  }
+
+
+  /* Clear blend stack (after blend values are consumed). */
+  /*                                                      */
+  /* TODO: Should do this in cff_run_parse, but subFont   */
+  /*       ref is not available there.                    */
+  /*                                                      */
+  /* Allocation is not changed when stack is cleared.     */
+  FT_LOCAL_DEF( void )
+  cff_blend_clear( CFF_SubFont  subFont )
+  {
+    subFont->blend_top  = subFont->blend_stack;
+    subFont->blend_used = 0;
+  }
+
+
+  /* Blend numOperands on the stack,                       */
+  /* store results into the first numBlends values,        */
+  /* then pop remaining arguments.                         */
+  /*                                                       */
+  /* This is comparable to `cf2_doBlend' but               */
+  /* the cffparse stack is different and can't be written. */
+  /* Blended values are written to a different buffer,     */
+  /* using reserved operator 255.                          */
+  /*                                                       */
+  /* Blend calculation is done in 16.16 fixed point.       */
+  FT_LOCAL_DEF( FT_Error )
+  cff_blend_doBlend( CFF_SubFont  subFont,
+                     CFF_Parser   parser,
+                     FT_UInt      numBlends )
+  {
+    FT_UInt  delta;
+    FT_UInt  base;
+    FT_UInt  i, j;
+    FT_UInt  size;
+
+    CFF_Blend  blend = &subFont->blend;
+
+    FT_Memory  memory = subFont->blend.font->memory; /* for FT_REALLOC */
+    FT_Error   error  = FT_Err_Ok;                   /* for FT_REALLOC */
+
+    /* compute expected number of operands for this blend */
+    FT_UInt  numOperands = (FT_UInt)( numBlends * blend->lenBV );
+    FT_UInt  count       = (FT_UInt)( parser->top - 1 - parser->stack );
+
+
+    if ( numOperands > count )
+    {
+      FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n",
+                  count,
+                  count == 1 ? "" : "s" ));
+
+      error = FT_THROW( Stack_Underflow );
+      goto Exit;
+    }
+
+    /* check whether we have room for `numBlends' values at `blend_top' */
+    size = 5 * numBlends;           /* add 5 bytes per entry    */
+    if ( subFont->blend_used + size > subFont->blend_alloc )
+    {
+      FT_Byte*  blend_stack_old = subFont->blend_stack;
+      FT_Byte*  blend_top_old   = subFont->blend_top;
+
+
+      /* increase or allocate `blend_stack' and reset `blend_top'; */
+      /* prepare to append `numBlends' values to the buffer        */
+      if ( FT_REALLOC( subFont->blend_stack,
+                       subFont->blend_alloc,
+                       subFont->blend_alloc + size ) )
+        goto Exit;
+
+      subFont->blend_top    = subFont->blend_stack + subFont->blend_used;
+      subFont->blend_alloc += size;
+
+      /* iterate over the parser stack and adjust pointers */
+      /* if the reallocated buffer has a different address */
+      if ( blend_stack_old                         &&
+           subFont->blend_stack != blend_stack_old )
+      {
+        FT_PtrDist  offset = subFont->blend_stack - blend_stack_old;
+        FT_Byte**   p;
+
+
+        for ( p = parser->stack; p < parser->top; p++ )
+        {
+          if ( *p >= blend_stack_old && *p < blend_top_old )
+            *p += offset;
+        }
+      }
+    }
+    subFont->blend_used += size;
+
+    base  = count - numOperands;     /* index of first blend arg */
+    delta = base + numBlends;        /* index of first delta arg */
+
+    for ( i = 0; i < numBlends; i++ )
+    {
+      const FT_Int32*  weight = &blend->BV[1];
+      FT_UInt32        sum;
+
+
+      /* convert inputs to 16.16 fixed point */
+      sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000;
+
+      for ( j = 1; j < blend->lenBV; j++ )
+        sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++;
+
+      /* point parser stack to new value on blend_stack */
+      parser->stack[i + base] = subFont->blend_top;
+
+      /* Push blended result as Type 2 5-byte fixed point number.  This */
+      /* will not conflict with actual DICTs because 255 is a reserved  */
+      /* opcode in both CFF and CFF2 DICTs.  See `cff_parse_num' for    */
+      /* decode of this, which rounds to an integer.                    */
+      *subFont->blend_top++ = 255;
+      *subFont->blend_top++ = (FT_Byte)( sum >> 24 );
+      *subFont->blend_top++ = (FT_Byte)( sum >> 16 );
+      *subFont->blend_top++ = (FT_Byte)( sum >>  8 );
+      *subFont->blend_top++ = (FT_Byte)sum;
+    }
+
+    /* leave only numBlends results on parser stack */
+    parser->top = &parser->stack[base + numBlends];
+
+  Exit:
+    return error;
+  }
+
+
+  /* Compute a blend vector from variation store index and normalized  */
+  /* vector based on pseudo-code in OpenType Font Variations Overview. */
+  /*                                                                   */
+  /* Note: lenNDV == 0 produces a default blend vector, (1,0,0,...).   */
+  FT_LOCAL_DEF( FT_Error )
+  cff_blend_build_vector( CFF_Blend  blend,
+                          FT_UInt    vsindex,
+                          FT_UInt    lenNDV,
+                          FT_Fixed*  NDV )
+  {
+    FT_Error   error  = FT_Err_Ok;            /* for FT_REALLOC */
+    FT_Memory  memory = blend->font->memory;  /* for FT_REALLOC */
+
+    FT_UInt       len;
+    CFF_VStore    vs;
+    CFF_VarData*  varData;
+    FT_UInt       master;
+
+
+    FT_ASSERT( lenNDV == 0 || NDV );
+
+    blend->builtBV = FALSE;
+
+    vs = &blend->font->vstore;
+
+    /* VStore and fvar must be consistent */
+    if ( lenNDV != 0 && lenNDV != vs->axisCount )
+    {
+      FT_TRACE4(( " cff_blend_build_vector: Axis count mismatch\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( vsindex >= vs->dataCount )
+    {
+      FT_TRACE4(( " cff_blend_build_vector: vsindex out of range\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* select the item variation data structure */
+    varData = &vs->varData[vsindex];
+
+    /* prepare buffer for the blend vector */
+    len = varData->regionIdxCount + 1;    /* add 1 for default component */
+    if ( FT_REALLOC( blend->BV,
+                     blend->lenBV * sizeof( *blend->BV ),
+                     len * sizeof( *blend->BV ) ) )
+      goto Exit;
+
+    blend->lenBV = len;
+
+    /* outer loop steps through master designs to be blended */
+    for ( master = 0; master < len; master++ )
+    {
+      FT_UInt         j;
+      FT_UInt         idx;
+      CFF_VarRegion*  varRegion;
+
+
+      /* default factor is always one */
+      if ( master == 0 )
+      {
+        blend->BV[master] = FT_FIXED_ONE;
+        FT_TRACE4(( "   build blend vector len %d\n"
+                    "   [ %f ",
+                    len,
+                    blend->BV[master] / 65536.0 ));
+        continue;
+      }
+
+      /* VStore array does not include default master, so subtract one */
+      idx       = varData->regionIndices[master - 1];
+      varRegion = &vs->varRegionList[idx];
+
+      if ( idx >= vs->regionCount )
+      {
+        FT_TRACE4(( " cff_blend_build_vector:"
+                    " region index out of range\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* Note: `lenNDV' could be zero.                              */
+      /*       In that case, build default blend vector (1,0,0...). */
+      if ( !lenNDV )
+      {
+        blend->BV[master] = 0;
+        continue;
+      }
+
+      /* In the normal case, initialize each component to 1 */
+      /* before inner loop.                                 */
+      blend->BV[master] = FT_FIXED_ONE; /* default */
+
+      /* inner loop steps through axes in this region */
+      for ( j = 0; j < lenNDV; j++ )
+      {
+        CFF_AxisCoords*  axis = &varRegion->axisList[j];
+        FT_Fixed         axisScalar;
+
+
+        /* compute the scalar contribution of this axis; */
+        /* ignore invalid ranges                         */
+        if ( axis->startCoord > axis->peakCoord ||
+             axis->peakCoord > axis->endCoord   )
+          axisScalar = FT_FIXED_ONE;
+
+        else if ( axis->startCoord < 0 &&
+                  axis->endCoord > 0   &&
+                  axis->peakCoord != 0 )
+          axisScalar = FT_FIXED_ONE;
+
+        /* peak of 0 means ignore this axis */
+        else if ( axis->peakCoord == 0 )
+          axisScalar = FT_FIXED_ONE;
+
+        /* ignore this region if coords are out of range */
+        else if ( NDV[j] < axis->startCoord ||
+                  NDV[j] > axis->endCoord   )
+          axisScalar = 0;
+
+        /* calculate a proportional factor */
+        else
+        {
+          if ( NDV[j] == axis->peakCoord )
+            axisScalar = FT_FIXED_ONE;
+          else if ( NDV[j] < axis->peakCoord )
+            axisScalar = FT_DivFix( NDV[j] - axis->startCoord,
+                                    axis->peakCoord - axis->startCoord );
+          else
+            axisScalar = FT_DivFix( axis->endCoord - NDV[j],
+                                    axis->endCoord - axis->peakCoord );
+        }
+
+        /* take product of all the axis scalars */
+        blend->BV[master] = FT_MulFix( blend->BV[master], axisScalar );
+      }
+
+      FT_TRACE4(( ", %f ",
+                  blend->BV[master] / 65536.0 ));
+    }
+
+    FT_TRACE4(( "]\n" ));
+
+    /* record the parameters used to build the blend vector */
+    blend->lastVsindex = vsindex;
+
+    if ( lenNDV != 0 )
+    {
+      /* user has set a normalized vector */
+      if ( FT_REALLOC( blend->lastNDV,
+                       blend->lenNDV * sizeof ( *NDV ),
+                       lenNDV * sizeof ( *NDV ) ) )
+        goto Exit;
+
+      FT_MEM_COPY( blend->lastNDV,
+                   NDV,
+                   lenNDV * sizeof ( *NDV ) );
+    }
+
+    blend->lenNDV  = lenNDV;
+    blend->builtBV = TRUE;
+
+  Exit:
+    return error;
+  }
+
+
+  /* `lenNDV' is zero for default vector;           */
+  /* return TRUE if blend vector needs to be built. */
+  FT_LOCAL_DEF( FT_Bool )
+  cff_blend_check_vector( CFF_Blend  blend,
+                          FT_UInt    vsindex,
+                          FT_UInt    lenNDV,
+                          FT_Fixed*  NDV )
+  {
+    if ( !blend->builtBV                                ||
+         blend->lastVsindex != vsindex                  ||
+         blend->lenNDV != lenNDV                        ||
+         ( lenNDV                                     &&
+           ft_memcmp( NDV,
+                      blend->lastNDV,
+                      lenNDV * sizeof ( *NDV ) ) != 0 ) )
+    {
+      /* need to build blend vector */
+      return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_get_var_blend( CFF_Face     face,
+                     FT_UInt     *num_coords,
+                     FT_Fixed*   *coords,
+                     FT_Fixed*   *normalizedcoords,
+                     FT_MM_Var*  *mm_var )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->get_var_blend( FT_FACE( face ),
+                              num_coords,
+                              coords,
+                              normalizedcoords,
+                              mm_var );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_done_blend( CFF_Face  face )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    if (mm)
+      mm->done_blend( FT_FACE( face ) );
+  }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+  static void
   cff_encoding_done( CFF_Encoding  encoding )
   {
     encoding->format = 0;
@@ -1300,26 +1857,156 @@
   }
 
 
+  /* Parse private dictionary; first call is always from `cff_face_init', */
+  /* so NDV has not been set for CFF2 variation.                          */
+  /*                                                                      */
+  /* `cff_slot_load' must call this function each time NDV changes.       */
+  FT_LOCAL_DEF( FT_Error )
+  cff_load_private_dict( CFF_Font     font,
+                         CFF_SubFont  subfont,
+                         FT_UInt      lenNDV,
+                         FT_Fixed*    NDV )
+  {
+    FT_Error         error  = FT_Err_Ok;
+    CFF_ParserRec    parser;
+    CFF_FontRecDict  top    = &subfont->font_dict;
+    CFF_Private      priv   = &subfont->private_dict;
+    FT_Stream        stream = font->stream;
+    FT_UInt          stackSize;
+
+
+    /* store handle needed to access memory, vstore for blend;    */
+    /* we need this for clean-up even if there is no private DICT */
+    subfont->blend.font   = font;
+    subfont->blend.usedBV = FALSE;  /* clear state */
+
+    if ( !top->private_offset || !top->private_size )
+      goto Exit2;       /* no private DICT, do nothing */
+
+    /* set defaults */
+    FT_ZERO( priv );
+
+    priv->blue_shift       = 7;
+    priv->blue_fuzz        = 1;
+    priv->lenIV            = -1;
+    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+    /* provide inputs for blend calculations */
+    priv->subfont   = subfont;
+    subfont->lenNDV = lenNDV;
+    subfont->NDV    = NDV;
+
+    /* add 1 for the operator */
+    stackSize = font->cff2 ? font->top_font.font_dict.maxstack + 1
+                           : CFF_MAX_STACK_DEPTH + 1;
+
+    if ( cff_parser_init( &parser,
+                          font->cff2 ? CFF2_CODE_PRIVATE : CFF_CODE_PRIVATE,
+                          priv,
+                          font->library,
+                          stackSize,
+                          top->num_designs,
+                          top->num_axes ) )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( font->base_offset + top->private_offset ) ||
+         FT_FRAME_ENTER( top->private_size )                       )
+      goto Exit;
+
+    FT_TRACE4(( " private dictionary:\n" ));
+    error = cff_parser_run( &parser,
+                            (FT_Byte*)stream->cursor,
+                            (FT_Byte*)stream->limit );
+    FT_FRAME_EXIT();
+
+    if ( error )
+      goto Exit;
+
+    /* ensure that `num_blue_values' is even */
+    priv->num_blue_values &= ~1;
+
+    /* sanitize `initialRandomSeed' to be a positive value, if necessary;  */
+    /* this is not mandated by the specification but by our implementation */
+    if ( priv->initial_random_seed < 0 )
+      priv->initial_random_seed = -priv->initial_random_seed;
+    else if ( priv->initial_random_seed == 0 )
+      priv->initial_random_seed = 987654321;
+
+    /* some sanitizing to avoid overflows later on; */
+    /* the upper limits are ad-hoc values           */
+    if ( priv->blue_shift > 1000 || priv->blue_shift < 0 )
+    {
+      FT_TRACE2(( "cff_load_private_dict:"
+                  " setting unlikely BlueShift value %d to default (7)\n",
+                  priv->blue_shift ));
+      priv->blue_shift = 7;
+    }
+
+    if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 )
+    {
+      FT_TRACE2(( "cff_load_private_dict:"
+                  " setting unlikely BlueFuzz value %d to default (1)\n",
+                  priv->blue_fuzz ));
+      priv->blue_fuzz = 1;
+    }
+
+  Exit:
+    /* clean up */
+    cff_blend_clear( subfont ); /* clear blend stack */
+    cff_parser_done( &parser ); /* free parser stack */
+
+  Exit2:
+    /* no clean up (parser not initialized) */
+    return error;
+  }
+
+
+  /* There are 3 ways to call this function, distinguished by code.  */
+  /*                                                                 */
+  /* . CFF_CODE_TOPDICT for either a CFF Top DICT or a CFF Font DICT */
+  /* . CFF2_CODE_TOPDICT for CFF2 Top DICT                           */
+  /* . CFF2_CODE_FONTDICT for CFF2 Font DICT                         */
+
   static FT_Error
-  cff_subfont_load( CFF_SubFont  font,
+  cff_subfont_load( CFF_SubFont  subfont,
                     CFF_Index    idx,
                     FT_UInt      font_index,
                     FT_Stream    stream,
                     FT_ULong     base_offset,
-                    FT_Library   library )
+                    FT_UInt      code,
+                    CFF_Font     font,
+                    CFF_Face     face )
   {
     FT_Error         error;
     CFF_ParserRec    parser;
     FT_Byte*         dict = NULL;
     FT_ULong         dict_len;
-    CFF_FontRecDict  top  = &font->font_dict;
-    CFF_Private      priv = &font->private_dict;
+    CFF_FontRecDict  top  = &subfont->font_dict;
+    CFF_Private      priv = &subfont->private_dict;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+    FT_Bool  cff2      = FT_BOOL( code == CFF2_CODE_TOPDICT  ||
+                                  code == CFF2_CODE_FONTDICT );
+    FT_UInt  stackSize = cff2 ? CFF2_DEFAULT_STACK
+                              : CFF_MAX_STACK_DEPTH;
 
 
-    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
+    /* Note: We use default stack size for CFF2 Font DICT because        */
+    /*       Top and Font DICTs are not allowed to have blend operators. */
+    error = cff_parser_init( &parser,
+                             code,
+                             &subfont->font_dict,
+                             font->library,
+                             stackSize,
+                             0,
+                             0 );
+    if ( error )
+      goto Exit;
 
     /* set defaults */
-    FT_MEM_ZERO( top, sizeof ( *top ) );
+    FT_ZERO( top );
 
     top->underline_position  = -( 100L << 16 );
     top->underline_thickness = 50L << 16;
@@ -1342,14 +2029,35 @@
     top->cid_ordering        = 0xFFFFU;
     top->cid_font_name       = 0xFFFFU;
 
-    error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+    /* set default stack size */
+    top->maxstack            = cff2 ? CFF2_DEFAULT_STACK : 48;
+
+    if ( idx->count )   /* count is nonzero for a real index */
+      error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+    else
+    {
+      /* CFF2 has a fake top dict index;     */
+      /* simulate `cff_index_access_element' */
+
+      /* Note: macros implicitly use `stream' and set `error' */
+      if ( FT_STREAM_SEEK( idx->data_offset )       ||
+           FT_FRAME_EXTRACT( idx->data_size, dict ) )
+        goto Exit;
+
+      dict_len = idx->data_size;
+    }
+
     if ( !error )
     {
       FT_TRACE4(( " top dictionary:\n" ));
       error = cff_parser_run( &parser, dict, dict + dict_len );
     }
 
-    cff_index_forget_element( idx, &dict );
+    /* clean up regardless of error */
+    if ( idx->count )
+      cff_index_forget_element( idx, &dict );
+    else
+      FT_FRAME_RELEASE( dict );
 
     if ( error )
       goto Exit;
@@ -1358,34 +2066,63 @@
     if ( top->cid_registry != 0xFFFFU )
       goto Exit;
 
-    /* parse the private dictionary, if any */
-    if ( top->private_offset && top->private_size )
+    /* Parse the private dictionary, if any.                   */
+    /*                                                         */
+    /* CFF2 does not have a private dictionary in the Top DICT */
+    /* but may have one in a Font DICT.  We need to parse      */
+    /* the latter here in order to load any local subrs.       */
+    error = cff_load_private_dict( font, subfont, 0, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( !cff2 )
     {
-      /* set defaults */
-      FT_MEM_ZERO( priv, sizeof ( *priv ) );
+      /*
+       * Initialize the random number generator.
+       *
+       * . If we have a face-specific seed, use it.
+       *   If non-zero, update it to a positive value.
+       *
+       * . Otherwise, use the seed from the CFF driver.
+       *   If non-zero, update it to a positive value.
+       *
+       * . If the random value is zero, use the seed given by the subfont's
+       *   `initialRandomSeed' value.
+       *
+       */
+      if ( face->root.internal->random_seed == -1 )
+      {
+        PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
 
-      priv->blue_shift       = 7;
-      priv->blue_fuzz        = 1;
-      priv->lenIV            = -1;
-      priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
-      priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
 
-      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );
+        subfont->random = (FT_UInt32)driver->random_seed;
+        if ( driver->random_seed )
+        {
+          do
+          {
+            driver->random_seed =
+              (FT_Int32)psaux->cff_random( (FT_UInt32)driver->random_seed );
 
-      if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
-           FT_FRAME_ENTER( font->font_dict.private_size )                 )
-        goto Exit;
+          } while ( driver->random_seed < 0 );
+        }
+      }
+      else
+      {
+        subfont->random = (FT_UInt32)face->root.internal->random_seed;
+        if ( face->root.internal->random_seed )
+        {
+          do
+          {
+            face->root.internal->random_seed =
+              (FT_Int32)psaux->cff_random(
+                (FT_UInt32)face->root.internal->random_seed );
 
-      FT_TRACE4(( " private dictionary:\n" ));
-      error = cff_parser_run( &parser,
-                              (FT_Byte*)stream->cursor,
-                              (FT_Byte*)stream->limit );
-      FT_FRAME_EXIT();
-      if ( error )
-        goto Exit;
+          } while ( face->root.internal->random_seed < 0 );
+        }
+      }
 
-      /* ensure that `num_blue_values' is even */
-      priv->num_blue_values &= ~1;
+      if ( !subfont->random )
+        subfont->random = (FT_UInt32)priv->initial_random_seed;
     }
 
     /* read the local subrs, if any */
@@ -1395,17 +2132,19 @@
                            priv->local_subrs_offset ) )
         goto Exit;
 
-      error = cff_index_init( &font->local_subrs_index, stream, 1 );
+      error = cff_index_init( &subfont->local_subrs_index, stream, 1, cff2 );
       if ( error )
         goto Exit;
 
-      error = cff_index_get_pointers( &font->local_subrs_index,
-                                      &font->local_subrs, NULL );
+      error = cff_index_get_pointers( &subfont->local_subrs_index,
+                                      &subfont->local_subrs, NULL, NULL );
       if ( error )
         goto Exit;
     }
 
   Exit:
+    cff_parser_done( &parser ); /* free parser stack */
+
     return error;
   }
 
@@ -1418,6 +2157,10 @@
     {
       cff_index_done( &subfont->local_subrs_index );
       FT_FREE( subfont->local_subrs );
+
+      FT_FREE( subfont->blend.lastNDV );
+      FT_FREE( subfont->blend.BV );
+      FT_FREE( subfont->blend_stack );
     }
   }
 
@@ -1427,18 +2170,19 @@
                  FT_Stream  stream,
                  FT_Int     face_index,
                  CFF_Font   font,
-                 FT_Bool    pure_cff )
+                 CFF_Face   face,
+                 FT_Bool    pure_cff,
+                 FT_Bool    cff2 )
   {
     static const FT_Frame_Field  cff_header_fields[] =
     {
 #undef  FT_STRUCTURE
 #define FT_STRUCTURE  CFF_FontRec
 
-      FT_FRAME_START( 4 ),
+      FT_FRAME_START( 3 ),
         FT_FRAME_BYTE( version_major ),
         FT_FRAME_BYTE( version_minor ),
         FT_FRAME_BYTE( header_size ),
-        FT_FRAME_BYTE( absolute_offsize ),
       FT_FRAME_END
     };
 
@@ -1453,51 +2197,142 @@
     FT_ZERO( font );
     FT_ZERO( &string_index );
 
-    font->stream = stream;
-    font->memory = memory;
-    dict         = &font->top_font.font_dict;
-    base_offset  = FT_STREAM_POS();
+    dict        = &font->top_font.font_dict;
+    base_offset = FT_STREAM_POS();
+
+    font->library     = library;
+    font->stream      = stream;
+    font->memory      = memory;
+    font->cff2        = cff2;
+    font->base_offset = base_offset;
 
     /* read CFF font header */
     if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
       goto Exit;
 
-    /* check format */
-    if ( font->version_major   != 1 ||
-         font->header_size      < 4 ||
-         font->absolute_offsize > 4 )
+    if ( cff2 )
     {
-      FT_TRACE2(( "  not a CFF font header\n" ));
-      error = FT_THROW( Unknown_File_Format );
-      goto Exit;
+      if ( font->version_major != 2 ||
+           font->header_size < 5    )
+      {
+        FT_TRACE2(( "  not a CFF2 font header\n" ));
+        error = FT_THROW( Unknown_File_Format );
+        goto Exit;
+      }
+
+      if ( FT_READ_USHORT( font->top_dict_length ) )
+        goto Exit;
+    }
+    else
+    {
+      FT_Byte  absolute_offset;
+
+
+      if ( FT_READ_BYTE( absolute_offset ) )
+        goto Exit;
+
+      if ( font->version_major != 1 ||
+           font->header_size < 4    ||
+           absolute_offset > 4      )
+      {
+        FT_TRACE2(( "  not a CFF font header\n" ));
+        error = FT_THROW( Unknown_File_Format );
+        goto Exit;
+      }
     }
 
     /* skip the rest of the header */
-    if ( FT_STREAM_SKIP( font->header_size - 4 ) )
+    if ( FT_STREAM_SEEK( base_offset + font->header_size ) )
+    {
+      /* For pure CFFs we have read only four bytes so far.  Contrary to */
+      /* other formats like SFNT those bytes doesn't define a signature; */
+      /* it is thus possible that the font isn't a CFF at all.           */
+      if ( pure_cff )
+      {
+        FT_TRACE2(( "  not a CFF file\n" ));
+        error = FT_THROW( Unknown_File_Format );
+      }
       goto Exit;
+    }
 
-    /* read the name, top dict, string and global subrs index */
-    if ( FT_SET_ERROR( cff_index_init( &font->name_index,
-                                       stream, 0 ) )                  ||
-         FT_SET_ERROR( cff_index_init( &font->font_dict_index,
-                                       stream, 0 ) )                  ||
-         FT_SET_ERROR( cff_index_init( &string_index,
-                                       stream, 1 ) )                  ||
-         FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
-                                       stream, 1 ) )                  ||
-         FT_SET_ERROR( cff_index_get_pointers( &string_index,
-                                               &font->strings,
-                                               &font->string_pool ) ) )
-      goto Exit;
+    if ( cff2 )
+    {
+      /* For CFF2, the top dict data immediately follow the header    */
+      /* and the length is stored in the header `offSize' field;      */
+      /* there is no index for it.                                    */
+      /*                                                              */
+      /* Use the `font_dict_index' to save the current position       */
+      /* and length of data, but leave count at zero as an indicator. */
+      FT_ZERO( &font->font_dict_index );
+
+      font->font_dict_index.data_offset = FT_STREAM_POS();
+      font->font_dict_index.data_size   = font->top_dict_length;
+
+      /* skip the top dict data for now, we will parse it later */
+      if ( FT_STREAM_SKIP( font->top_dict_length ) )
+        goto Exit;
+
+      /* next, read the global subrs index */
+      if ( FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+                                         stream, 1, cff2 ) ) )
+        goto Exit;
+    }
+    else
+    {
+      /* for CFF, read the name, top dict, string and global subrs index */
+      if ( FT_SET_ERROR( cff_index_init( &font->name_index,
+                                         stream, 0, cff2 ) ) )
+      {
+        if ( pure_cff )
+        {
+          FT_TRACE2(( "  not a CFF file\n" ));
+          error = FT_THROW( Unknown_File_Format );
+        }
+        goto Exit;
+      }
+
+      /* if we have an empty font name,      */
+      /* it must be the only font in the CFF */
+      if ( font->name_index.count > 1                          &&
+           font->name_index.data_size < font->name_index.count )
+      {
+        /* for pure CFFs, we still haven't checked enough bytes */
+        /* to be sure that it is a CFF at all                   */
+        error = pure_cff ? FT_THROW( Unknown_File_Format )
+                         : FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      if ( FT_SET_ERROR( cff_index_init( &font->font_dict_index,
+                                         stream, 0, cff2 ) )                 ||
+           FT_SET_ERROR( cff_index_init( &string_index,
+                                         stream, 1, cff2 ) )                 ||
+           FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+                                         stream, 1, cff2 ) )                 ||
+           FT_SET_ERROR( cff_index_get_pointers( &string_index,
+                                                 &font->strings,
+                                                 &font->string_pool,
+                                                 &font->string_pool_size ) ) )
+        goto Exit;
+
+      /* there must be a Top DICT index entry for each name index entry */
+      if ( font->name_index.count > font->font_dict_index.count )
+      {
+        FT_ERROR(( "cff_font_load:"
+                   " not enough entries in Top DICT index\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
 
     font->num_strings = string_index.count;
 
     if ( pure_cff )
     {
       /* well, we don't really forget the `disabled' fonts... */
-      subfont_index = (FT_UInt)face_index;
+      subfont_index = (FT_UInt)( face_index & 0xFFFF );
 
-      if ( subfont_index >= font->name_index.count )
+      if ( face_index > 0 && subfont_index >= font->name_index.count )
       {
         FT_ERROR(( "cff_font_load:"
                    " invalid subfont index for pure CFF font (%d)\n",
@@ -1534,34 +2369,48 @@
                               subfont_index,
                               stream,
                               base_offset,
-                              library );
+                              cff2 ? CFF2_CODE_TOPDICT : CFF_CODE_TOPDICT,
+                              font,
+                              face );
     if ( error )
       goto Exit;
 
     if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
       goto Exit;
 
-    error = cff_index_init( &font->charstrings_index, stream, 0 );
+    error = cff_index_init( &font->charstrings_index, stream, 0, cff2 );
     if ( error )
       goto Exit;
 
-    /* now, check for a CID font */
-    if ( dict->cid_registry != 0xFFFFU )
+    /* now, check for a CID or CFF2 font */
+    if ( dict->cid_registry != 0xFFFFU ||
+         cff2                          )
     {
       CFF_IndexRec  fd_index;
       CFF_SubFont   sub = NULL;
       FT_UInt       idx;
 
 
+      /* for CFF2, read the Variation Store if available;                 */
+      /* this must follow the Top DICT parse and precede any Private DICT */
+      error = cff_vstore_load( &font->vstore,
+                               stream,
+                               base_offset,
+                               dict->vstore_offset );
+      if ( error )
+        goto Exit;
+
       /* this is a CID-keyed font, we must now allocate a table of */
       /* sub-fonts, then load each of them separately              */
       if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
         goto Exit;
 
-      error = cff_index_init( &fd_index, stream, 0 );
+      error = cff_index_init( &fd_index, stream, 0, cff2 );
       if ( error )
         goto Exit;
 
+      /* Font Dicts are not limited to 256 for CFF2. */
+      /* TODO: support this for CFF2                 */
       if ( fd_index.count > CFF_MAX_CID_FONTS )
       {
         FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
@@ -1582,17 +2431,26 @@
       {
         sub = font->subfonts[idx];
         FT_TRACE4(( "parsing subfont %u\n", idx ));
-        error = cff_subfont_load( sub, &fd_index, idx,
-                                  stream, base_offset, library );
+        error = cff_subfont_load( sub,
+                                  &fd_index,
+                                  idx,
+                                  stream,
+                                  base_offset,
+                                  cff2 ? CFF2_CODE_FONTDICT
+                                       : CFF_CODE_TOPDICT,
+                                  font,
+                                  face );
         if ( error )
           goto Fail_CID;
       }
 
-      /* now load the FD Select array */
-      error = CFF_Load_FD_Select( &font->fd_select,
-                                  font->charstrings_index.count,
-                                  stream,
-                                  base_offset + dict->cid_fd_select_offset );
+      /* now load the FD Select array;               */
+      /* CFF2 omits FDSelect if there is only one FD */
+      if ( !cff2 || fd_index.count > 1 )
+        error = CFF_Load_FD_Select( &font->fd_select,
+                                    font->charstrings_index.count,
+                                    stream,
+                                    base_offset + dict->cid_fd_select_offset );
 
     Fail_CID:
       cff_index_done( &fd_index );
@@ -1614,13 +2472,13 @@
     font->num_glyphs = font->charstrings_index.count;
 
     error = cff_index_get_pointers( &font->global_subrs_index,
-                                    &font->global_subrs, NULL );
+                                    &font->global_subrs, NULL, NULL );
 
     if ( error )
       goto Exit;
 
     /* read the Charset and Encoding tables if available */
-    if ( font->num_glyphs > 0 )
+    if ( !cff2 && font->num_glyphs > 0 )
     {
       FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
 
@@ -1668,7 +2526,7 @@
     cff_index_done( &font->charstrings_index );
 
     /* release font dictionaries, but only if working with */
-    /* a CID keyed CFF font                                */
+    /* a CID keyed CFF font or a CFF2 font                 */
     if ( font->num_subfonts > 0 )
     {
       for ( idx = 0; idx < font->num_subfonts; idx++ )
@@ -1680,6 +2538,7 @@
 
     cff_encoding_done( &font->encoding );
     cff_charset_done( &font->charset, font->stream );
+    cff_vstore_done( &font->vstore, memory );
 
     cff_subfont_done( memory, &font->top_font );
 
@@ -1697,6 +2556,8 @@
       font->cf2_instance.finalizer( font->cf2_instance.data );
       FT_FREE( font->cf2_instance.data );
     }
+
+    FT_FREE( font->font_extra );
   }
 
 
diff --git a/src/cff/cffload.h b/src/cff/cffload.h
index 459e7b0..14d14e2 100644
--- a/src/cff/cffload.h
+++ b/src/cff/cffload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType & CFF data/program tables loader (specification).           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,12 +16,14 @@
 /***************************************************************************/
 
 
-#ifndef __CFFLOAD_H__
-#define __CFFLOAD_H__
+#ifndef CFFLOAD_H_
+#define CFFLOAD_H_
 
 
 #include <ft2build.h>
-#include "cfftypes.h"
+#include FT_INTERNAL_CFF_TYPES_H
+#include "cffparse.h"
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H  /* for CFF_Face */
 
 
 FT_BEGIN_HEADER
@@ -60,24 +62,64 @@
 
 
   FT_LOCAL( FT_Error )
-  cff_font_load( FT_Library library,
-                 FT_Stream  stream,
-                 FT_Int     face_index,
-                 CFF_Font   font,
-                 FT_Bool    pure_cff );
+  cff_font_load( FT_Library  library,
+                 FT_Stream   stream,
+                 FT_Int      face_index,
+                 CFF_Font    font,
+                 CFF_Face    face,
+                 FT_Bool     pure_cff,
+                 FT_Bool     cff2 );
 
   FT_LOCAL( void )
   cff_font_done( CFF_Font  font );
 
 
+  FT_LOCAL( FT_Error )
+  cff_load_private_dict( CFF_Font     font,
+                         CFF_SubFont  subfont,
+                         FT_UInt      lenNDV,
+                         FT_Fixed*    NDV );
+
   FT_LOCAL( FT_Byte )
   cff_fd_select_get( CFF_FDSelect  fdselect,
                      FT_UInt       glyph_index );
 
+  FT_LOCAL( FT_Bool )
+  cff_blend_check_vector( CFF_Blend  blend,
+                          FT_UInt    vsindex,
+                          FT_UInt    lenNDV,
+                          FT_Fixed*  NDV );
+
+  FT_LOCAL( FT_Error )
+  cff_blend_build_vector( CFF_Blend  blend,
+                          FT_UInt    vsindex,
+                          FT_UInt    lenNDV,
+                          FT_Fixed*  NDV );
+
+  FT_LOCAL( void )
+  cff_blend_clear( CFF_SubFont  subFont );
+
+  FT_LOCAL( FT_Error )
+  cff_blend_doBlend( CFF_SubFont  subfont,
+                     CFF_Parser   parser,
+                     FT_UInt      numBlends );
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_LOCAL( FT_Error )
+  cff_get_var_blend( CFF_Face     face,
+                     FT_UInt     *num_coords,
+                     FT_Fixed*   *coords,
+                     FT_Fixed*   *normalizedcoords,
+                     FT_MM_Var*  *mm_var );
+
+  FT_LOCAL( void )
+  cff_done_blend( CFF_Face  face );
+#endif
+
 
 FT_END_HEADER
 
-#endif /* __CFFLOAD_H__ */
+#endif /* CFFLOAD_H_ */
 
 
 /* END */
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index 4a1ef11..a2d7aec 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType objects manager (body).                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,8 +25,15 @@
 #include FT_TRUETYPE_IDS_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_INTERNAL_SFNT_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
+#endif
+
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 #include "cffobjs.h"
 #include "cffload.h"
 #include "cffcmap.h"
@@ -34,6 +41,9 @@
 
 #include "cfferrs.h"
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
 
   /*************************************************************************/
   /*                                                                       */
@@ -49,9 +59,6 @@
   /*                                                                       */
   /*                            SIZE FUNCTIONS                             */
   /*                                                                       */
-  /*  Note that we store the global hints in the size's `internal' root    */
-  /*  field.                                                               */
-  /*                                                                       */
   /*************************************************************************/
 
 
@@ -75,10 +82,11 @@
   FT_LOCAL_DEF( void )
   cff_size_done( FT_Size  cffsize )        /* CFF_Size */
   {
+    FT_Memory     memory   = cffsize->face->memory;
     CFF_Size      size     = (CFF_Size)cffsize;
     CFF_Face      face     = (CFF_Face)size->root.face;
     CFF_Font      font     = (CFF_Font)face->extra.data;
-    CFF_Internal  internal = (CFF_Internal)cffsize->internal;
+    CFF_Internal  internal = (CFF_Internal)cffsize->internal->module_data;
 
 
     if ( internal )
@@ -98,7 +106,7 @@
           funcs->destroy( internal->subfonts[i - 1] );
       }
 
-      /* `internal' is freed by destroy_size (in ftobjs.c) */
+      FT_FREE( internal );
     }
   }
 
@@ -114,7 +122,7 @@
     FT_UInt      n, count;
 
 
-    FT_MEM_ZERO( priv, sizeof ( *priv ) );
+    FT_ZERO( priv );
 
     count = priv->num_blue_values = cpriv->num_blue_values;
     for ( n = 0; n < count; n++ )
@@ -194,7 +202,7 @@
           goto Exit;
       }
 
-      cffsize->internal = (FT_Size_Internal)(void*)internal;
+      cffsize->internal->module_data = internal;
     }
 
     size->strike_index = 0xFFFFFFFFUL;
@@ -224,7 +232,7 @@
     {
       CFF_Face      face     = (CFF_Face)size->face;
       CFF_Font      font     = (CFF_Font)face->extra.data;
-      CFF_Internal  internal = (CFF_Internal)size->internal;
+      CFF_Internal  internal = (CFF_Internal)size->internal->module_data;
 
       FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
       FT_UInt  i;
@@ -296,7 +304,7 @@
     {
       CFF_Face      cffface  = (CFF_Face)size->face;
       CFF_Font      font     = (CFF_Font)cffface->extra.data;
-      CFF_Internal  internal = (CFF_Internal)size->internal;
+      CFF_Internal  internal = (CFF_Internal)size->internal->module_data;
 
       FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
       FT_UInt  i;
@@ -405,7 +413,7 @@
   remove_subset_prefix( FT_String*  name )
   {
     FT_Int32  idx             = 0;
-    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;
+    FT_Int32  length          = (FT_Int32)ft_strlen( name ) + 1;
     FT_Bool   continue_search = 1;
 
 
@@ -442,15 +450,15 @@
     FT_Int32  family_name_length, style_name_length;
 
 
-    family_name_length = (FT_Int32)strlen( family_name );
-    style_name_length  = (FT_Int32)strlen( style_name );
+    family_name_length = (FT_Int32)ft_strlen( family_name );
+    style_name_length  = (FT_Int32)ft_strlen( style_name );
 
     if ( family_name_length > style_name_length )
     {
       FT_Int  idx;
 
 
-      for ( idx = 1; idx <= style_name_length; ++idx )
+      for ( idx = 1; idx <= style_name_length; idx++ )
       {
         if ( family_name[family_name_length - idx] !=
              style_name[style_name_length - idx] )
@@ -469,7 +477,7 @@
                   family_name[idx] == ' ' ||
                   family_name[idx] == '_' ||
                   family_name[idx] == '+' ) )
-          --idx;
+          idx--;
 
         if ( idx > 0 )
           family_name[idx + 1] = '\0';
@@ -490,13 +498,16 @@
     SFNT_Service        sfnt;
     FT_Service_PsCMaps  psnames;
     PSHinter_Service    pshinter;
+    PSAux_Service       psaux;
+    FT_Service_CFFLoad  cffload;
     FT_Bool             pure_cff    = 1;
+    FT_Bool             cff2        = 0;
     FT_Bool             sfnt_format = 0;
     FT_Library          library     = cffface->driver->root.library;
 
 
-    sfnt = (SFNT_Service)FT_Get_Module_Interface(
-             library, "sfnt" );
+    sfnt = (SFNT_Service)FT_Get_Module_Interface( library,
+                                                  "sfnt" );
     if ( !sfnt )
     {
       FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
@@ -506,8 +517,20 @@
 
     FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
 
-    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
-                 library, "pshinter" );
+    pshinter = (PSHinter_Service)FT_Get_Module_Interface( library,
+                                                          "pshinter" );
+
+    psaux = (PSAux_Service)FT_Get_Module_Interface( library,
+                                                    "psaux" );
+    if ( !psaux )
+    {
+      FT_ERROR(( "cff_face_init: cannot access `psaux' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+    face->psaux = psaux;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD );
 
     FT_TRACE2(( "CFF driver\n" ));
 
@@ -516,6 +539,7 @@
       goto Exit;
 
     /* check whether we have a valid OpenType file */
+    FT_TRACE2(( "  " ));
     error = sfnt->init_face( stream, face, face_index, num_params, params );
     if ( !error )
     {
@@ -553,8 +577,18 @@
           goto Exit;
       }
 
-      /* now load the CFF part of the file */
-      error = face->goto_table( face, TTAG_CFF, stream, 0 );
+      /* now load the CFF part of the file; */
+      /* give priority to CFF2              */
+      error = face->goto_table( face, TTAG_CFF2, stream, 0 );
+      if ( !error )
+      {
+        cff2          = 1;
+        face->is_cff2 = cff2;
+      }
+
+      if ( FT_ERR_EQ( error, Table_Missing ) )
+        error = face->goto_table( face, TTAG_CFF, stream, 0 );
+
       if ( error )
         goto Exit;
     }
@@ -579,14 +613,29 @@
         goto Exit;
 
       face->extra.data = cff;
-      error = cff_font_load( library, stream, face_index, cff, pure_cff );
+      error = cff_font_load( library,
+                             stream,
+                             face_index,
+                             cff,
+                             face,
+                             pure_cff,
+                             cff2 );
       if ( error )
         goto Exit;
 
+      /* if we are performing a simple font format check, exit immediately */
+      /* (this is here for pure CFF)                                       */
+      if ( face_index < 0 )
+      {
+        cffface->num_faces = (FT_Long)cff->num_faces;
+        return FT_Err_Ok;
+      }
+
       cff->pshinter = pshinter;
       cff->psnames  = psnames;
+      cff->cffload  = cffload;
 
-      cffface->face_index = face_index;
+      cffface->face_index = face_index & 0xFFFF;
 
       /* Complement the root flags with some interesting information. */
       /* Note that this is only necessary for pure CFF and CEF fonts; */
@@ -617,22 +666,78 @@
         FT_TRACE4(( "SIDs\n" ));
 
         /* dump string index, including default strings for convenience */
-        for ( idx = 0; idx < cff->num_strings + 390; idx++ )
+        for ( idx = 0; idx <= 390; idx++ )
         {
           s = cff_index_get_sid_string( cff, idx );
           if ( s )
-            FT_TRACE4(("  %5d %s\n", idx, s ));
+            FT_TRACE4(( "  %5d %s\n", idx, s ));
+        }
+
+        /* In Multiple Master CFFs, two SIDs hold the Normalize Design  */
+        /* Vector (NDV) and Convert Design Vector (CDV) charstrings,    */
+        /* which may contain NULL bytes in the middle of the data, too. */
+        /* We thus access `cff->strings' directly.                      */
+        for ( idx = 1; idx < cff->num_strings; idx++ )
+        {
+          FT_Byte*    s1    = cff->strings[idx - 1];
+          FT_Byte*    s2    = cff->strings[idx];
+          FT_PtrDist  s1len = s2 - s1 - 1; /* without the final NULL byte */
+          FT_PtrDist  l;
+
+
+          FT_TRACE4(( "  %5d ", idx + 390 ));
+          for ( l = 0; l < s1len; l++ )
+            FT_TRACE4(( "%c", s1[l] ));
+          FT_TRACE4(( "\n" ));
+        }
+
+        /* print last element */
+        if ( cff->num_strings )
+        {
+          FT_Byte*    s1    = cff->strings[cff->num_strings - 1];
+          FT_Byte*    s2    = cff->string_pool + cff->string_pool_size;
+          FT_PtrDist  s1len = s2 - s1 - 1;
+          FT_PtrDist  l;
+
+
+          FT_TRACE4(( "  %5d ", cff->num_strings + 390 ));
+          for ( l = 0; l < s1len; l++ )
+            FT_TRACE4(( "%c", s1[l] ));
+          FT_TRACE4(( "\n" ));
         }
       }
 #endif /* FT_DEBUG_LEVEL_TRACE */
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      {
+        FT_Service_MultiMasters       mm  = (FT_Service_MultiMasters)face->mm;
+        FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
+
+        FT_UInt  instance_index = (FT_UInt)face_index >> 16;
+
+
+        if ( FT_HAS_MULTIPLE_MASTERS( cffface ) &&
+             mm                                 &&
+             instance_index > 0                 )
+        {
+          error = mm->set_instance( cffface, instance_index );
+          if ( error )
+            goto Exit;
+
+          if ( var )
+            var->metrics_adjust( cffface );
+        }
+      }
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
       if ( !dict->has_font_matrix )
         dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
 
-      /* Normalize the font matrix so that `matrix->xx' is 1; the */
-      /* scaling is done with `units_per_em' then (at this point, */
-      /* it already contains the scaling factor, but without      */
-      /* normalization of the matrix).                            */
+      /* Normalize the font matrix so that `matrix->yy' is 1; if  */
+      /* it is zero, we use `matrix->yx' instead.  The scaling is */
+      /* done with `units_per_em' then (at this point, it already */
+      /* contains the scaling factor, but without normalization   */
+      /* of the matrix).                                          */
       /*                                                          */
       /* Note that the offsets must be expressed in integer font  */
       /* units.                                                   */
@@ -641,9 +746,12 @@
         FT_Matrix*  matrix = &dict->font_matrix;
         FT_Vector*  offset = &dict->font_offset;
         FT_ULong*   upm    = &dict->units_per_em;
-        FT_Fixed    temp   = FT_ABS( matrix->yy );
+        FT_Fixed    temp;
 
 
+        temp = matrix->yy ? FT_ABS( matrix->yy )
+                          : FT_ABS( matrix->yx );
+
         if ( temp != 0x10000L )
         {
           *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp );
@@ -711,7 +819,10 @@
         matrix = &sub->font_matrix;
         offset = &sub->font_offset;
         upm    = &sub->units_per_em;
-        temp   = FT_ABS( matrix->yy );
+
+        temp = matrix->yy ? FT_ABS( matrix->yy )
+                          : FT_ABS( matrix->yx );
+
 
         if ( temp != 0x10000L )
         {
@@ -757,7 +868,8 @@
 
         cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
         if ( cffface->height < cffface->ascender - cffface->descender )
-          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
+          cffface->height = (FT_Short)( cffface->ascender -
+                                        cffface->descender );
 
         cffface->underline_position  =
           (FT_Short)( dict->underline_position >> 16 );
@@ -765,27 +877,33 @@
           (FT_Short)( dict->underline_thickness >> 16 );
 
         /* retrieve font family & style name */
-        cffface->family_name = cff_index_get_name( cff,
-                                                   (FT_UInt)face_index );
+        if ( dict->family_name )
+        {
+          char*  family_name;
+
+
+          family_name = cff_index_get_sid_string( cff, dict->family_name );
+          if ( family_name )
+            cffface->family_name = cff_strcpy( memory, family_name );
+        }
+
+        if ( !cffface->family_name )
+        {
+          cffface->family_name = cff_index_get_name(
+                                   cff,
+                                   (FT_UInt)( face_index & 0xFFFF ) );
+          if ( cffface->family_name )
+            remove_subset_prefix( cffface->family_name );
+        }
+
         if ( cffface->family_name )
         {
           char*  full   = cff_index_get_sid_string( cff,
                                                     dict->full_name );
           char*  fullp  = full;
           char*  family = cffface->family_name;
-          char*  family_name = NULL;
 
 
-          remove_subset_prefix( cffface->family_name );
-
-          if ( dict->family_name )
-          {
-            family_name = cff_index_get_sid_string( cff,
-                                                    dict->family_name );
-            if ( family_name )
-              family = family_name;
-          }
-
           /* We try to extract the style name from the full name.   */
           /* We need to ignore spaces and dashes during the search. */
           if ( full && family )
@@ -900,7 +1018,6 @@
         cffface->style_flags = flags;
       }
 
-
 #ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
       /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
       /* has unset this flag because of the 3.0 `post' table.          */
@@ -911,7 +1028,6 @@
       if ( dict->cid_registry != 0xFFFFU && pure_cff )
         cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
 
-
       /*******************************************************************/
       /*                                                                 */
       /* Compute char maps.                                              */
@@ -962,7 +1078,7 @@
         error = FT_Err_Ok;
 
         /* if no Unicode charmap was previously selected, select this one */
-        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
+        if ( !cffface->charmap && nn != (FT_UInt)cffface->num_charmaps )
           cffface->charmap = cffface->charmaps[nn];
 
       Skip_Unicode:
@@ -1030,23 +1146,30 @@
         FT_FREE( face->extra.data );
       }
     }
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    cff_done_blend( face );
+    face->blend = NULL;
+#endif
   }
 
 
   FT_LOCAL_DEF( FT_Error )
   cff_driver_init( FT_Module  module )        /* CFF_Driver */
   {
-    CFF_Driver  driver = (CFF_Driver)module;
+    PS_Driver  driver = (PS_Driver)module;
+
+    FT_UInt32  seed;
 
 
     /* set default property values, cf. `ftcffdrv.h' */
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-    driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
+    driver->hinting_engine = FT_HINTING_FREETYPE;
 #else
-    driver->hinting_engine = FT_CFF_HINTING_ADOBE;
+    driver->hinting_engine = FT_HINTING_ADOBE;
 #endif
 
-    driver->no_stem_darkening = FALSE;
+    driver->no_stem_darkening = TRUE;
 
     driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
     driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
@@ -1057,6 +1180,18 @@
     driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
     driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
 
+    /* compute random seed from some memory addresses */
+    seed = (FT_UInt32)( (FT_Offset)(char*)&seed          ^
+                        (FT_Offset)(char*)&module        ^
+                        (FT_Offset)(char*)module->memory );
+    seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+    driver->random_seed = (FT_Int32)seed;
+    if ( driver->random_seed < 0 )
+      driver->random_seed = -driver->random_seed;
+    else if ( driver->random_seed == 0 )
+      driver->random_seed = 123456789;
+
     return FT_Err_Ok;
   }
 
diff --git a/src/cff/cffobjs.h b/src/cff/cffobjs.h
index 3cc9531..616a25b 100644
--- a/src/cff/cffobjs.h
+++ b/src/cff/cffobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType objects manager (specification).                            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,116 +16,16 @@
 /***************************************************************************/
 
 
-#ifndef __CFFOBJS_H__
-#define __CFFOBJS_H__
+#ifndef CFFOBJS_H_
+#define CFFOBJS_H_
 
 
 #include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include "cfftypes.h"
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
 
 
 FT_BEGIN_HEADER
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CFF_Driver                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an OpenType driver object.                             */
-  /*                                                                       */
-  typedef struct CFF_DriverRec_*  CFF_Driver;
-
-  typedef TT_Face  CFF_Face;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CFF_Size                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an OpenType size object.                               */
-  /*                                                                       */
-  typedef struct  CFF_SizeRec_
-  {
-    FT_SizeRec  root;
-    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */
-
-  } CFF_SizeRec, *CFF_Size;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CFF_GlyphSlot                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an OpenType glyph slot object.                         */
-  /*                                                                       */
-  typedef struct  CFF_GlyphSlotRec_
-  {
-    FT_GlyphSlotRec  root;
-
-    FT_Bool          hint;
-    FT_Bool          scaled;
-
-    FT_Fixed         x_scale;
-    FT_Fixed         y_scale;
-
-  } CFF_GlyphSlotRec, *CFF_GlyphSlot;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CFF_Internal                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The interface to the `internal' field of `FT_Size'.                */
-  /*                                                                       */
-  typedef struct  CFF_InternalRec_
-  {
-    PSH_Globals  topfont;
-    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];
-
-  } CFF_InternalRec, *CFF_Internal;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Subglyph transformation record.                                       */
-  /*                                                                       */
-  typedef struct  CFF_Transform_
-  {
-    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
-    FT_Fixed    yx, yy;
-    FT_F26Dot6  ox, oy;     /* offsets        */
-
-  } CFF_Transform;
-
-
-  /***********************************************************************/
-  /*                                                                     */
-  /* CFF driver class.                                                   */
-  /*                                                                     */
-  typedef struct  CFF_DriverRec_
-  {
-    FT_DriverRec  root;
-
-    FT_UInt  hinting_engine;
-    FT_Bool  no_stem_darkening;
-
-    FT_Int  darken_params[8];
-
-  } CFF_DriverRec;
-
-
   FT_LOCAL( FT_Error )
   cff_size_init( FT_Size  size );           /* CFF_Size */
 
@@ -171,15 +71,15 @@
   /* Driver functions                                                      */
   /*                                                                       */
   FT_LOCAL( FT_Error )
-  cff_driver_init( FT_Module  module );         /* CFF_Driver */
+  cff_driver_init( FT_Module  module );         /* PS_Driver */
 
   FT_LOCAL( void )
-  cff_driver_done( FT_Module  module );         /* CFF_Driver */
+  cff_driver_done( FT_Module  module );         /* PS_Driver */
 
 
 FT_END_HEADER
 
-#endif /* __CFFOBJS_H__ */
+#endif /* CFFOBJS_H_ */
 
 
 /* END */
diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c
index 063b351..b9611cf 100644
--- a/src/cff/cffparse.c
+++ b/src/cff/cffparse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token stream parser (body)                                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,9 +20,12 @@
 #include "cffparse.h"
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 #include "cfferrs.h"
 #include "cffpic.h"
+#include "cffload.h"
 
 
   /*************************************************************************/
@@ -35,18 +38,52 @@
 #define FT_COMPONENT  trace_cffparse
 
 
-  FT_LOCAL_DEF( void )
+  FT_LOCAL_DEF( FT_Error )
   cff_parser_init( CFF_Parser  parser,
                    FT_UInt     code,
                    void*       object,
-                   FT_Library  library)
+                   FT_Library  library,
+                   FT_UInt     stackSize,
+                   FT_UShort   num_designs,
+                   FT_UShort   num_axes )
   {
-    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+    FT_Memory  memory = library->memory;    /* for FT_NEW_ARRAY */
+    FT_Error   error;                       /* for FT_NEW_ARRAY */
 
+
+    FT_ZERO( parser );
+
+#if 0
     parser->top         = parser->stack;
+#endif
     parser->object_code = code;
     parser->object      = object;
     parser->library     = library;
+    parser->num_designs = num_designs;
+    parser->num_axes    = num_axes;
+
+    /* allocate the stack buffer */
+    if ( FT_NEW_ARRAY( parser->stack, stackSize ) )
+    {
+      FT_FREE( parser->stack );
+      goto Exit;
+    }
+
+    parser->stackSize = stackSize;
+    parser->top       = parser->stack;    /* empty stack */
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_parser_done( CFF_Parser  parser )
+  {
+    FT_Memory  memory = parser->library->memory;    /* for FT_FREE */
+
+
+    FT_FREE( parser->stack );
   }
 
 
@@ -120,6 +157,22 @@
     1000000000L
   };
 
+  /* maximum values allowed for multiplying      */
+  /* with the corresponding `power_tens' element */
+  static const FT_Long power_ten_limits[] =
+  {
+    FT_LONG_MAX / 1L,
+    FT_LONG_MAX / 10L,
+    FT_LONG_MAX / 100L,
+    FT_LONG_MAX / 1000L,
+    FT_LONG_MAX / 10000L,
+    FT_LONG_MAX / 100000L,
+    FT_LONG_MAX / 1000000L,
+    FT_LONG_MAX / 10000000L,
+    FT_LONG_MAX / 100000000L,
+    FT_LONG_MAX / 1000000000L,
+  };
+
 
   /* read a real */
   static FT_Fixed
@@ -397,28 +450,66 @@
 
 
   /* read a number, either integer or real */
-  static FT_Long
-  cff_parse_num( FT_Byte**  d )
+  FT_LOCAL_DEF( FT_Long )
+  cff_parse_num( CFF_Parser  parser,
+                 FT_Byte**   d )
   {
-    return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
-                     :   cff_parse_integer( d[0], d[1] );
+    if ( **d == 30 )
+    {
+      /* binary-coded decimal is truncated to integer */
+      return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16;
+    }
+
+    else if ( **d == 255 )
+    {
+      /* 16.16 fixed point is used internally for CFF2 blend results. */
+      /* Since these are trusted values, a limit check is not needed. */
+
+      /* After the 255, 4 bytes give the number.                 */
+      /* The blend value is converted to integer, with rounding; */
+      /* due to the right-shift we don't need the lowest byte.   */
+#if 0
+      return (FT_Short)(
+               ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
+                   ( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
+                   ( (FT_UInt32)*( d[0] + 3 ) <<  8 ) |
+                     (FT_UInt32)*( d[0] + 4 )         ) + 0x8000U ) >> 16 );
+#else
+      return (FT_Short)(
+               ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) |
+                   ( (FT_UInt32)*( d[0] + 2 ) <<  8 ) |
+                     (FT_UInt32)*( d[0] + 3 )         ) + 0x80U ) >> 8 );
+#endif
+    }
+
+    else
+      return cff_parse_integer( *d, parser->limit );
   }
 
 
   /* read a floating point number, either integer or real */
   static FT_Fixed
-  do_fixed( FT_Byte**  d,
-            FT_Long    scaling )
+  do_fixed( CFF_Parser  parser,
+            FT_Byte**   d,
+            FT_Long     scaling )
   {
     if ( **d == 30 )
-      return cff_parse_real( d[0], d[1], scaling, NULL );
+      return cff_parse_real( *d, parser->limit, scaling, NULL );
     else
     {
-      FT_Long  val = cff_parse_integer( d[0], d[1] );
+      FT_Long  val = cff_parse_integer( *d, parser->limit );
 
 
       if ( scaling )
+      {
+        if ( FT_ABS( val ) > power_ten_limits[scaling] )
+        {
+          val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
+          goto Overflow;
+        }
+
         val *= power_tens[scaling];
+      }
 
       if ( val > 0x7FFF )
       {
@@ -442,19 +533,21 @@
 
   /* read a floating point number, either integer or real */
   static FT_Fixed
-  cff_parse_fixed( FT_Byte**  d )
+  cff_parse_fixed( CFF_Parser  parser,
+                   FT_Byte**   d )
   {
-    return do_fixed( d, 0 );
+    return do_fixed( parser, d, 0 );
   }
 
 
   /* read a floating point number, either integer or real, */
   /* but return `10^scaling' times the number read in      */
   static FT_Fixed
-  cff_parse_fixed_scaled( FT_Byte**  d,
-                          FT_Long    scaling )
+  cff_parse_fixed_scaled( CFF_Parser  parser,
+                          FT_Byte**   d,
+                          FT_Long     scaling )
   {
-    return do_fixed( d, scaling );
+    return do_fixed( parser, d, scaling );
   }
 
 
@@ -462,13 +555,14 @@
   /* and return it as precise as possible -- `scaling' returns */
   /* the scaling factor (as a power of 10)                     */
   static FT_Fixed
-  cff_parse_fixed_dynamic( FT_Byte**  d,
-                           FT_Long*   scaling )
+  cff_parse_fixed_dynamic( CFF_Parser  parser,
+                           FT_Byte**   d,
+                           FT_Long*    scaling )
   {
     FT_ASSERT( scaling );
 
     if ( **d == 30 )
-      return cff_parse_real( d[0], d[1], 0, scaling );
+      return cff_parse_real( *d, parser->limit, 0, scaling );
     else
     {
       FT_Long  number;
@@ -516,7 +610,11 @@
 
     if ( parser->top >= parser->stack + 6 )
     {
-      FT_Long  scaling;
+      FT_Fixed  values[6];
+      FT_Long   scalings[6];
+
+      FT_Long  min_scaling, max_scaling;
+      int      i;
 
 
       error = FT_Err_Ok;
@@ -525,22 +623,36 @@
 
       /* We expect a well-formed font matrix, this is, the matrix elements */
       /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */
-      /* loss of precision, we use the magnitude of element `xx' to scale  */
-      /* all other elements.  The scaling factor is then contained in the  */
-      /* `units_per_em' value.                                             */
+      /* loss of precision, we use the magnitude of the largest matrix     */
+      /* element to scale all other elements.  The scaling factor is then  */
+      /* contained in the `units_per_em' value.                            */
 
-      matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
+      max_scaling = FT_LONG_MIN;
+      min_scaling = FT_LONG_MAX;
 
-      scaling = -scaling;
+      for ( i = 0; i < 6; i++ )
+      {
+        values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] );
+        if ( values[i] )
+        {
+          if ( scalings[i] > max_scaling )
+            max_scaling = scalings[i];
+          if ( scalings[i] < min_scaling )
+            min_scaling = scalings[i];
+        }
+      }
 
-      if ( scaling < 0 || scaling > 9 )
+      if ( max_scaling < -9                  ||
+           max_scaling > 0                   ||
+           ( max_scaling - min_scaling ) < 0 ||
+           ( max_scaling - min_scaling ) > 9 )
       {
         /* Return default matrix in case of unlikely values. */
 
         FT_TRACE1(( "cff_parse_font_matrix:"
-                    " strange scaling value for xx element (%d),\n"
+                    " strange scaling values (minimum %d, maximum %d),\n"
                     "                      "
-                    " using default matrix\n", scaling ));
+                    " using default matrix\n", min_scaling, max_scaling ));
 
         matrix->xx = 0x10000L;
         matrix->yx = 0;
@@ -553,13 +665,42 @@
         goto Exit;
       }
 
-      matrix->yx = cff_parse_fixed_scaled( data++, scaling );
-      matrix->xy = cff_parse_fixed_scaled( data++, scaling );
-      matrix->yy = cff_parse_fixed_scaled( data++, scaling );
-      offset->x  = cff_parse_fixed_scaled( data++, scaling );
-      offset->y  = cff_parse_fixed_scaled( data,   scaling );
+      for ( i = 0; i < 6; i++ )
+      {
+        FT_Fixed  value = values[i];
+        FT_Long   divisor, half_divisor;
 
-      *upm = (FT_ULong)power_tens[scaling];
+
+        if ( !value )
+          continue;
+
+        divisor      = power_tens[max_scaling - scalings[i]];
+        half_divisor = divisor >> 1;
+
+        if ( value < 0 )
+        {
+          if ( FT_LONG_MIN + half_divisor < value )
+            values[i] = ( value - half_divisor ) / divisor;
+          else
+            values[i] = FT_LONG_MIN / divisor;
+        }
+        else
+        {
+          if ( FT_LONG_MAX - half_divisor > value )
+            values[i] = ( value + half_divisor ) / divisor;
+          else
+            values[i] = FT_LONG_MAX / divisor;
+        }
+      }
+
+      matrix->xx = values[0];
+      matrix->yx = values[1];
+      matrix->xy = values[2];
+      matrix->yy = values[3];
+      offset->x  = values[4];
+      offset->y  = values[5];
+
+      *upm = (FT_ULong)power_tens[-max_scaling];
 
       FT_TRACE4(( " [%f %f %f %f %f %f]\n",
                   (double)matrix->xx / *upm / 65536,
@@ -588,10 +729,10 @@
 
     if ( parser->top >= parser->stack + 4 )
     {
-      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
-      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
-      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
-      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );
+      bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
+      bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
+      bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) );
+      bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data   ) );
       error = FT_Err_Ok;
 
       FT_TRACE4(( " [%d %d %d %d]\n",
@@ -620,7 +761,7 @@
       FT_Long  tmp;
 
 
-      tmp = cff_parse_num( data++ );
+      tmp = cff_parse_num( parser, data++ );
       if ( tmp < 0 )
       {
         FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" ));
@@ -629,7 +770,7 @@
       }
       dict->private_size = (FT_ULong)tmp;
 
-      tmp = cff_parse_num( data );
+      tmp = cff_parse_num( parser, data );
       if ( tmp < 0 )
       {
         FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" ));
@@ -649,6 +790,56 @@
   }
 
 
+  /* The `MultipleMaster' operator comes before any  */
+  /* top DICT operators that contain T2 charstrings. */
+
+  static FT_Error
+  cff_parse_multiple_master( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_Error         error;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    /* beautify tracing message */
+    if ( ft_trace_levels[FT_COMPONENT] < 4 )
+      FT_TRACE1(( "Multiple Master CFFs not supported yet,"
+                  " handling first master design only\n" ));
+    else
+      FT_TRACE1(( " (not supported yet,"
+                  " handling first master design only)\n" ));
+#endif
+
+    error = FT_ERR( Stack_Underflow );
+
+    /* currently, we handle only the first argument */
+    if ( parser->top >= parser->stack + 5 )
+    {
+      FT_Long  num_designs = cff_parse_num( parser, parser->stack );
+
+
+      if ( num_designs > 16 || num_designs < 2 )
+      {
+        FT_ERROR(( "cff_parse_multiple_master:"
+                   " Invalid number of designs\n" ));
+        error = FT_THROW( Invalid_File_Format );
+      }
+      else
+      {
+        dict->num_designs   = (FT_UShort)num_designs;
+        dict->num_axes      = (FT_UShort)( parser->top - parser->stack - 4 );
+
+        parser->num_designs = dict->num_designs;
+        parser->num_axes    = dict->num_axes;
+
+        error = FT_Err_Ok;
+      }
+    }
+
+    return error;
+  }
+
+
   static FT_Error
   cff_parse_cid_ros( CFF_Parser  parser )
   {
@@ -661,11 +852,11 @@
 
     if ( parser->top >= parser->stack + 3 )
     {
-      dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
-      dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
+      dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ );
+      dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ );
       if ( **data == 30 )
         FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
-      dict->cid_supplement = cff_parse_num( data );
+      dict->cid_supplement = cff_parse_num( parser, data );
       if ( dict->cid_supplement < 0 )
         FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
                    dict->cid_supplement ));
@@ -681,6 +872,125 @@
   }
 
 
+  static FT_Error
+  cff_parse_vsindex( CFF_Parser  parser )
+  {
+    /* vsindex operator can only be used in a Private DICT */
+    CFF_Private  priv = (CFF_Private)parser->object;
+    FT_Byte**    data = parser->stack;
+    CFF_Blend    blend;
+    FT_Error     error;
+
+
+    if ( !priv || !priv->subfont )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    blend = &priv->subfont->blend;
+
+    if ( blend->usedBV )
+    {
+      FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" ));
+      error = FT_THROW( Syntax_Error );
+      goto Exit;
+    }
+
+    priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ );
+
+    FT_TRACE4(( " %d\n", priv->vsindex ));
+
+    error = FT_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_blend( CFF_Parser  parser )
+  {
+    /* blend operator can only be used in a Private DICT */
+    CFF_Private  priv = (CFF_Private)parser->object;
+    CFF_SubFont  subFont;
+    CFF_Blend    blend;
+    FT_UInt      numBlends;
+    FT_Error     error;
+
+
+    if ( !priv || !priv->subfont )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    subFont = priv->subfont;
+    blend   = &subFont->blend;
+
+    if ( cff_blend_check_vector( blend,
+                                 priv->vsindex,
+                                 subFont->lenNDV,
+                                 subFont->NDV ) )
+    {
+      error = cff_blend_build_vector( blend,
+                                      priv->vsindex,
+                                      subFont->lenNDV,
+                                      subFont->NDV );
+      if ( error )
+        goto Exit;
+    }
+
+    numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 );
+    if ( numBlends > parser->stackSize )
+    {
+      FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    FT_TRACE4(( "   %d value%s blended\n",
+                numBlends,
+                numBlends == 1 ? "" : "s" ));
+
+    error = cff_blend_doBlend( subFont, parser, numBlends );
+
+    blend->usedBV = TRUE;
+
+  Exit:
+    return error;
+  }
+
+
+  /* maxstack operator increases parser and operand stacks for CFF2 */
+  static FT_Error
+  cff_parse_maxstack( CFF_Parser  parser )
+  {
+    /* maxstack operator can only be used in a Top DICT */
+    CFF_FontRecDict  dict  = (CFF_FontRecDict)parser->object;
+    FT_Byte**        data  = parser->stack;
+    FT_Error         error = FT_Err_Ok;
+
+
+    if ( !dict )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ );
+    if ( dict->maxstack > CFF2_MAX_STACK )
+      dict->maxstack = CFF2_MAX_STACK;
+    if ( dict->maxstack < CFF2_DEFAULT_STACK )
+      dict->maxstack = CFF2_DEFAULT_STACK;
+
+    FT_TRACE4(( " %d\n", dict->maxstack ));
+
+  Exit:
+    return error;
+  }
+
+
 #define CFF_FIELD_NUM( code, name, id )             \
           CFF_FIELD( code, name, id, cff_kind_num )
 #define CFF_FIELD_FIXED( code, name, id )             \
@@ -692,9 +1002,6 @@
 #define CFF_FIELD_BOOL( code, name, id )             \
           CFF_FIELD( code, name, id, cff_kind_bool )
 
-#define CFFCODE_TOPDICT  0x1000
-#define CFFCODE_PRIVATE  0x2000
-
 
 #ifndef FT_CONFIG_OPTION_PIC
 
@@ -715,6 +1022,15 @@
             0, 0                             \
           },
 
+#define CFF_FIELD_BLEND( code, id ) \
+          {                         \
+            cff_kind_blend,         \
+            code | CFFCODE,         \
+            0, 0,                   \
+            cff_parse_blend,        \
+            0, 0                    \
+          },
+
 #define CFF_FIELD( code, name, id, kind ) \
           {                               \
             kind,                         \
@@ -758,6 +1074,16 @@
             id                               \
           },
 
+#define CFF_FIELD_BLEND( code, id ) \
+          {                         \
+            cff_kind_blend,         \
+            code | CFFCODE,         \
+            0, 0,                   \
+            cff_parse_blend,        \
+            0, 0,                   \
+            id                      \
+          },
+
 #define CFF_FIELD( code, name, id, kind ) \
           {                               \
             kind,                         \
@@ -824,6 +1150,8 @@
 #define CFF_FIELD_DELTA( code, name, max, id ) i++;
 #undef CFF_FIELD_CALLBACK
 #define CFF_FIELD_CALLBACK( code, name, id ) i++;
+#undef CFF_FIELD_BLEND
+#define CFF_FIELD_BLEND( code, id ) i++;
 
 #include "cfftoken.h"
 
@@ -871,6 +1199,17 @@
           clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
           i++;
 
+#undef  CFF_FIELD_BLEND
+#define CFF_FIELD_BLEND( code_, id_ )              \
+          clazz[i].kind         = cff_kind_blend;  \
+          clazz[i].code         = code_ | CFFCODE; \
+          clazz[i].offset       = 0;               \
+          clazz[i].size         = 0;               \
+          clazz[i].reader       = cff_parse_blend; \
+          clazz[i].array_max    = 0;               \
+          clazz[i].count_offset = 0;               \
+          i++;
+
 #include "cfftoken.h"
 
     clazz[i].kind         = 0;
@@ -921,6 +1260,18 @@
           clazz[i].id           = id_;                              \
           i++;
 
+#undef  CFF_FIELD_BLEND
+#define CFF_FIELD_BLEND( code_, id_ )              \
+          clazz[i].kind         = cff_kind_blend;  \
+          clazz[i].code         = code_ | CFFCODE; \
+          clazz[i].offset       = 0;               \
+          clazz[i].size         = 0;               \
+          clazz[i].reader       = cff_parse_blend; \
+          clazz[i].array_max    = 0;               \
+          clazz[i].count_offset = 0;               \
+          clazz[i].id           = id_;             \
+          i++;
+
 #include "cfftoken.h"
 
     clazz[i].kind         = 0;
@@ -950,9 +1301,14 @@
                   FT_Byte*    start,
                   FT_Byte*    limit )
   {
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    PSAux_Service  psaux;
+#endif
+
     FT_Byte*    p       = start;
     FT_Error    error   = FT_Err_Ok;
     FT_Library  library = parser->library;
+
     FT_UNUSED( library );
 
 
@@ -965,14 +1321,16 @@
     {
       FT_UInt  v = *p;
 
-
-      if ( v >= 27 && v != 31 )
+      /* Opcode 31 is legacy MM T2 operator, not a number.      */
+      /* Opcode 255 is reserved and should not appear in fonts; */
+      /* it is used internally for CFF2 blends.                 */
+      if ( v >= 27 && v != 31 && v != 255 )
       {
         /* it's a number; we will push its position on the stack */
-        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
+        if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
           goto Stack_Overflow;
 
-        *parser->top ++ = p;
+        *parser->top++ = p;
 
         /* now, skip it */
         if ( v == 30 )
@@ -1001,19 +1359,159 @@
         else if ( v > 246 )
           p += 1;
       }
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      else if ( v == 31 )
+      {
+        /* a Type 2 charstring */
+
+        CFF_Decoder  decoder;
+        CFF_FontRec  cff_rec;
+        FT_Byte*     charstring_base;
+        FT_ULong     charstring_len;
+
+        FT_Fixed*  stack;
+        FT_Byte*   q;
+
+
+        charstring_base = ++p;
+
+        /* search `endchar' operator */
+        for (;;)
+        {
+          if ( p >= limit )
+            goto Exit;
+          if ( *p == 14 )
+            break;
+          p++;
+        }
+
+        charstring_len = (FT_ULong)( p - charstring_base ) + 1;
+
+        /* construct CFF_Decoder object */
+        FT_ZERO( &decoder );
+        FT_ZERO( &cff_rec );
+
+        cff_rec.top_font.font_dict.num_designs = parser->num_designs;
+        cff_rec.top_font.font_dict.num_axes    = parser->num_axes;
+        decoder.cff                            = &cff_rec;
+
+        psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" );
+        if ( !psaux )
+        {
+          FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" ));
+          error = FT_THROW( Missing_Module );
+          goto Exit;
+        }
+
+        error = psaux->cff_decoder_funcs->parse_charstrings_old(
+                  &decoder, charstring_base, charstring_len, 1 );
+
+        /* Now copy the stack data in the temporary decoder object,    */
+        /* converting it back to charstring number representations     */
+        /* (this is ugly, I know).                                     */
+        /*                                                             */
+        /* We overwrite the original top DICT charstring under the     */
+        /* assumption that the charstring representation of the result */
+        /* of `cff_decoder_parse_charstrings' is shorter, which should */
+        /* be always true.                                             */
+
+        q     = charstring_base - 1;
+        stack = decoder.stack;
+
+        while ( stack < decoder.top )
+        {
+          FT_ULong  num;
+          FT_Bool   neg;
+
+
+          if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
+            goto Stack_Overflow;
+
+          *parser->top++ = q;
+
+          if ( *stack < 0 )
+          {
+            num = (FT_ULong)-*stack;
+            neg = 1;
+          }
+          else
+          {
+            num = (FT_ULong)*stack;
+            neg = 0;
+          }
+
+          if ( num & 0xFFFFU )
+          {
+            if ( neg )
+              num = (FT_ULong)-num;
+
+            *q++ = 255;
+            *q++ = ( num & 0xFF000000U ) >> 24;
+            *q++ = ( num & 0x00FF0000U ) >> 16;
+            *q++ = ( num & 0x0000FF00U ) >>  8;
+            *q++ =   num & 0x000000FFU;
+          }
+          else
+          {
+            num >>= 16;
+
+            if ( neg )
+            {
+              if ( num <= 107 )
+                *q++ = (FT_Byte)( 139 - num );
+              else if ( num <= 1131 )
+              {
+                *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 );
+                *q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
+              }
+              else
+              {
+                num = (FT_ULong)-num;
+
+                *q++ = 28;
+                *q++ = (FT_Byte)( num >> 8 );
+                *q++ = (FT_Byte)( num & 0xFF );
+              }
+            }
+            else
+            {
+              if ( num <= 107 )
+                *q++ = (FT_Byte)( num + 139 );
+              else if ( num <= 1131 )
+              {
+                *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
+                *q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
+              }
+              else
+              {
+                *q++ = 28;
+                *q++ = (FT_Byte)( num >> 8 );
+                *q++ = (FT_Byte)( num & 0xFF );
+              }
+            }
+          }
+
+          stack++;
+        }
+      }
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
       else
       {
         /* This is not a number, hence it's an operator.  Compute its code */
         /* and look for it in our current list.                            */
 
         FT_UInt                   code;
-        FT_UInt                   num_args = (FT_UInt)
-                                             ( parser->top - parser->stack );
+        FT_UInt                   num_args;
         const CFF_Field_Handler*  field;
 
 
+        if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
+          goto Stack_Overflow;
+
+        num_args     = (FT_UInt)( parser->top - parser->stack );
         *parser->top = p;
-        code = v;
+        code         = v;
+
         if ( v == 12 )
         {
           /* two byte operator */
@@ -1048,15 +1546,15 @@
             case cff_kind_bool:
             case cff_kind_string:
             case cff_kind_num:
-              val = cff_parse_num( parser->stack );
+              val = cff_parse_num( parser, parser->stack );
               goto Store_Number;
 
             case cff_kind_fixed:
-              val = cff_parse_fixed( parser->stack );
+              val = cff_parse_fixed( parser, parser->stack );
               goto Store_Number;
 
             case cff_kind_fixed_thousand:
-              val = cff_parse_fixed_scaled( parser->stack, 3 );
+              val = cff_parse_fixed_scaled( parser, parser->stack, 3 );
 
             Store_Number:
               switch ( field->size )
@@ -1125,7 +1623,7 @@
                 val = 0;
                 while ( num_args > 0 )
                 {
-                  val += cff_parse_num( data++ );
+                  val = ADD_LONG( val, cff_parse_num( parser, data++ ) );
                   switch ( field->size )
                   {
                   case (8 / FT_CHAR_BIT):
@@ -1154,7 +1652,7 @@
               }
               break;
 
-            default:  /* callback */
+            default:  /* callback or blend */
               error = field->reader( parser );
               if ( error )
                 goto Exit;
@@ -1168,7 +1666,10 @@
 
       Found:
         /* clear stack */
-        parser->top = parser->stack;
+        /* TODO: could clear blend stack here,       */
+        /*       but we don't have access to subFont */
+        if ( field->kind != cff_kind_blend )
+          parser->top = parser->stack;
       }
       p++;
     }
diff --git a/src/cff/cffparse.h b/src/cff/cffparse.h
index 8ad02ea..8a8caec 100644
--- a/src/cff/cffparse.h
+++ b/src/cff/cffparse.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token stream parser (specification)                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,45 +16,74 @@
 /***************************************************************************/
 
 
-#ifndef __CFF_PARSE_H__
-#define __CFF_PARSE_H__
+#ifndef CFFPARSE_H_
+#define CFFPARSE_H_
 
 
 #include <ft2build.h>
-#include "cfftypes.h"
+#include FT_INTERNAL_CFF_TYPES_H
 #include FT_INTERNAL_OBJECTS_H
 
 
 FT_BEGIN_HEADER
 
 
+  /* CFF uses constant parser stack size; */
+  /* CFF2 can increase from default 193   */
 #define CFF_MAX_STACK_DEPTH  96
 
-#define CFF_CODE_TOPDICT  0x1000
-#define CFF_CODE_PRIVATE  0x2000
+  /*
+   *  There are plans to remove the `maxstack' operator in a forthcoming
+   *  revision of the CFF2 specification, increasing the (then static) stack
+   *  size to 513.  By making the default stack size equal to the maximum
+   *  stack size, the operator is essentially disabled, which has the
+   *  desired effect in FreeType.
+   */
+#define CFF2_MAX_STACK      513
+#define CFF2_DEFAULT_STACK  513
+
+#define CFF_CODE_TOPDICT    0x1000
+#define CFF_CODE_PRIVATE    0x2000
+#define CFF2_CODE_TOPDICT   0x3000
+#define CFF2_CODE_FONTDICT  0x4000
+#define CFF2_CODE_PRIVATE   0x5000
 
 
   typedef struct  CFF_ParserRec_
   {
-    FT_Library library;
-    FT_Byte*   start;
-    FT_Byte*   limit;
-    FT_Byte*   cursor;
+    FT_Library  library;
+    FT_Byte*    start;
+    FT_Byte*    limit;
+    FT_Byte*    cursor;
 
-    FT_Byte*   stack[CFF_MAX_STACK_DEPTH + 1];
-    FT_Byte**  top;
+    FT_Byte**   stack;
+    FT_Byte**   top;
+    FT_UInt     stackSize;  /* allocated size */
 
-    FT_UInt    object_code;
-    void*      object;
+    FT_UInt     object_code;
+    void*       object;
+
+    FT_UShort   num_designs; /* a copy of `CFF_FontRecDict->num_designs' */
+    FT_UShort   num_axes;    /* a copy of `CFF_FontRecDict->num_axes'    */
 
   } CFF_ParserRec, *CFF_Parser;
 
 
-  FT_LOCAL( void )
+  FT_LOCAL( FT_Long )
+  cff_parse_num( CFF_Parser  parser,
+                 FT_Byte**   d );
+
+  FT_LOCAL( FT_Error )
   cff_parser_init( CFF_Parser  parser,
                    FT_UInt     code,
                    void*       object,
-                   FT_Library  library);
+                   FT_Library  library,
+                   FT_UInt     stackSize,
+                   FT_UShort   num_designs,
+                   FT_UShort   num_axes );
+
+  FT_LOCAL( void )
+  cff_parser_done( CFF_Parser  parser );
 
   FT_LOCAL( FT_Error )
   cff_parser_run( CFF_Parser  parser,
@@ -72,6 +101,7 @@
     cff_kind_bool,
     cff_kind_delta,
     cff_kind_callback,
+    cff_kind_blend,
 
     cff_kind_max  /* do not remove */
   };
@@ -100,7 +130,7 @@
 FT_END_HEADER
 
 
-#endif /* __CFF_PARSE_H__ */
+#endif /* CFFPARSE_H_ */
 
 
 /* END */
diff --git a/src/cff/cffpic.c b/src/cff/cffpic.c
index d40dec5..08b74c7 100644
--- a/src/cff/cffpic.c
+++ b/src/cff/cffpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for cff module.      */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/cff/cffpic.h b/src/cff/cffpic.h
index a29620e..8ba4203 100644
--- a/src/cff/cffpic.h
+++ b/src/cff/cffpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for cff module.      */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,15 +16,12 @@
 /***************************************************************************/
 
 
-#ifndef __CFFPIC_H__
-#define __CFFPIC_H__
+#ifndef CFFPIC_H_
+#define CFFPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
-
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info
@@ -34,6 +31,9 @@
 #define CFF_SERVICE_CID_INFO_GET         cff_service_cid_info
 #define CFF_SERVICE_PROPERTIES_GET       cff_service_properties
 #define CFF_SERVICES_GET                 cff_services
+#define CFF_SERVICE_MULTI_MASTERS_GET    cff_service_multi_masters
+#define CFF_SERVICE_METRICS_VAR_GET      cff_service_metrics_variations
+#define CFF_SERVICE_CFF_LOAD_GET         cff_service_cff_load
 #define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec
 #define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec
 #define CFF_FIELD_HANDLERS_GET           cff_field_handlers
@@ -47,20 +47,27 @@
 #include FT_SERVICE_TT_CMAP_H
 #include FT_SERVICE_CID_H
 #include FT_SERVICE_PROPERTIES_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 
 
+FT_BEGIN_HEADER
+
   typedef struct  CffModulePIC_
   {
-    FT_ServiceDescRec*        cff_services;
-    CFF_Field_Handler*        cff_field_handlers;
-    FT_Service_PsInfoRec      cff_service_ps_info;
-    FT_Service_GlyphDictRec   cff_service_glyph_dict;
-    FT_Service_PsFontNameRec  cff_service_ps_name;
-    FT_Service_TTCMapsRec     cff_service_get_cmap_info;
-    FT_Service_CIDRec         cff_service_cid_info;
-    FT_Service_PropertiesRec  cff_service_properties;
-    FT_CMap_ClassRec          cff_cmap_encoding_class_rec;
-    FT_CMap_ClassRec          cff_cmap_unicode_class_rec;
+    FT_ServiceDescRec*               cff_services;
+    CFF_Field_Handler*               cff_field_handlers;
+    FT_Service_PsInfoRec             cff_service_ps_info;
+    FT_Service_GlyphDictRec          cff_service_glyph_dict;
+    FT_Service_PsFontNameRec         cff_service_ps_name;
+    FT_Service_TTCMapsRec            cff_service_get_cmap_info;
+    FT_Service_CIDRec                cff_service_cid_info;
+    FT_Service_PropertiesRec         cff_service_properties;
+    FT_Service_MultiMastersRec       cff_service_multi_masters;
+    FT_Service_MetricsVariationsRec  cff_service_metrics_variations;
+    FT_Service_CFFLoadRec            cff_service_cff_load;
+    FT_CMap_ClassRec                 cff_cmap_encoding_class_rec;
+    FT_CMap_ClassRec                 cff_cmap_unicode_class_rec;
 
   } CffModulePIC;
 
@@ -82,6 +89,12 @@
           ( GET_PIC( library )->cff_service_properties )
 #define CFF_SERVICES_GET                       \
           ( GET_PIC( library )->cff_services )
+#define CFF_SERVICE_MULTI_MASTERS_GET                       \
+          ( GET_PIC( library )->cff_service_multi_masters )
+#define CFF_SERVICE_METRICS_VAR_GET                              \
+          ( GET_PIC( library )->cff_service_metrics_variations )
+#define CFF_SERVICE_CFF_LOAD_GET                       \
+          ( GET_PIC( library )->cff_service_cff_load )
 #define CFF_CMAP_ENCODING_CLASS_REC_GET                       \
           ( GET_PIC( library )->cff_cmap_encoding_class_rec )
 #define CFF_CMAP_UNICODE_CLASS_REC_GET                       \
@@ -96,13 +109,13 @@
   FT_Error
   cff_driver_class_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
-FT_END_HEADER
-
-#endif /* __CFFPIC_H__ */
+#endif /* CFFPIC_H_ */
 
 
 /* END */
diff --git a/src/cff/cfftoken.h b/src/cff/cfftoken.h
index 5b32076..fec1ca2 100644
--- a/src/cff/cfftoken.h
+++ b/src/cff/cfftoken.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token definitions (specification only).                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,7 +20,7 @@
 #define FT_STRUCTURE  CFF_FontRecDictRec
 
 #undef  CFFCODE
-#define CFFCODE       CFFCODE_TOPDICT
+#define CFFCODE       CFF_CODE_TOPDICT
 
   CFF_FIELD_STRING  ( 0,     version,             "Version" )
   CFF_FIELD_STRING  ( 1,     notice,              "Notice" )
@@ -38,6 +38,9 @@
   CFF_FIELD_NUM     ( 13,    unique_id,           "UniqueID" )
   CFF_FIELD_CALLBACK( 5,     font_bbox,           "FontBBox" )
   CFF_FIELD_NUM     ( 0x108, stroke_width,        "StrokeWidth" )
+#if 0
+  CFF_FIELD_DELTA   ( 14,    xuid, 16,            "XUID" )
+#endif
   CFF_FIELD_NUM     ( 15,    charset_offset,      "charset" )
   CFF_FIELD_NUM     ( 16,    encoding_offset,     "Encoding" )
   CFF_FIELD_NUM     ( 17,    charstrings_offset,  "CharStrings" )
@@ -48,8 +51,13 @@
 #if 0
   CFF_FIELD_STRING  ( 0x116, base_font_name,      "BaseFontName" )
   CFF_FIELD_DELTA   ( 0x117, base_font_blend, 16, "BaseFontBlend" )
+#endif
+
+  /* the next two operators were removed from the Type2 specification */
+  /* in version 16-March-2000                                         */
   CFF_FIELD_CALLBACK( 0x118, multiple_master,     "MultipleMaster" )
-  CFF_FIELD_CALLBACK( 0x119, blend_axis_types,    "BlendAxisTypes" )
+#if 0
+  CFF_FIELD_CALLBACK( 0x11A, blend_axis_types,    "BlendAxisTypes" )
 #endif
 
   CFF_FIELD_CALLBACK( 0x11E, cid_ros,              "ROS" )
@@ -70,7 +78,7 @@
 #undef  FT_STRUCTURE
 #define FT_STRUCTURE  CFF_PrivateRec
 #undef  CFFCODE
-#define CFFCODE       CFFCODE_PRIVATE
+#define CFFCODE       CFF_CODE_PRIVATE
 
   CFF_FIELD_DELTA     ( 6,     blue_values, 14,        "BlueValues" )
   CFF_FIELD_DELTA     ( 7,     other_blues, 10,        "OtherBlues" )
@@ -94,4 +102,49 @@
   CFF_FIELD_NUM       ( 21,    nominal_width,          "nominalWidthX" )
 
 
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRecDictRec
+#undef  CFFCODE
+#define CFFCODE       CFF2_CODE_TOPDICT
+
+  CFF_FIELD_CALLBACK( 0x107, font_matrix,          "FontMatrix" )
+  CFF_FIELD_NUM     ( 17,    charstrings_offset,   "CharStrings" )
+  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  "FDArray" )
+  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, "FDSelect" )
+  CFF_FIELD_NUM     ( 24,    vstore_offset,        "vstore" )
+  CFF_FIELD_CALLBACK( 25,    maxstack,             "maxstack" )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRecDictRec
+#undef  CFFCODE
+#define CFFCODE       CFF2_CODE_FONTDICT
+
+  CFF_FIELD_CALLBACK( 18,    private_dict, "Private" )
+  CFF_FIELD_CALLBACK( 0x107, font_matrix,  "FontMatrix" )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_PrivateRec
+#undef  CFFCODE
+#define CFFCODE       CFF2_CODE_PRIVATE
+
+  CFF_FIELD_DELTA     ( 6,     blue_values, 14,        "BlueValues" )
+  CFF_FIELD_DELTA     ( 7,     other_blues, 10,        "OtherBlues" )
+  CFF_FIELD_DELTA     ( 8,     family_blues, 14,       "FamilyBlues" )
+  CFF_FIELD_DELTA     ( 9,     family_other_blues, 10, "FamilyOtherBlues" )
+  CFF_FIELD_FIXED_1000( 0x109, blue_scale,             "BlueScale" )
+  CFF_FIELD_NUM       ( 0x10A, blue_shift,             "BlueShift" )
+  CFF_FIELD_NUM       ( 0x10B, blue_fuzz,              "BlueFuzz" )
+  CFF_FIELD_NUM       ( 10,    standard_width,         "StdHW" )
+  CFF_FIELD_NUM       ( 11,    standard_height,        "StdVW" )
+  CFF_FIELD_DELTA     ( 0x10C, snap_widths, 13,        "StemSnapH" )
+  CFF_FIELD_DELTA     ( 0x10D, snap_heights, 13,       "StemSnapV" )
+  CFF_FIELD_NUM       ( 0x111, language_group,         "LanguageGroup" )
+  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       "ExpansionFactor" )
+  CFF_FIELD_CALLBACK  ( 22,    vsindex,                "vsindex" )
+  CFF_FIELD_BLEND     ( 23,                            "blend" )
+  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     "Subrs" )
+
+
 /* END */
diff --git a/src/cff/module.mk b/src/cff/module.mk
index ba08ebc..8013d5d 100644
--- a/src/cff/module.mk
+++ b/src/cff/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/cff/rules.mk b/src/cff/rules.mk
index 7f6e857..bce6729 100644
--- a/src/cff/rules.mk
+++ b/src/cff/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -32,27 +32,14 @@
                $(CFF_DIR)/cffload.c  \
                $(CFF_DIR)/cffobjs.c  \
                $(CFF_DIR)/cffparse.c \
-               $(CFF_DIR)/cffpic.c   \
-               $(CFF_DIR)/cf2arrst.c \
-               $(CFF_DIR)/cf2blues.c \
-               $(CFF_DIR)/cf2error.c \
-               $(CFF_DIR)/cf2font.c  \
-               $(CFF_DIR)/cf2ft.c    \
-               $(CFF_DIR)/cf2hints.c \
-               $(CFF_DIR)/cf2intrp.c \
-               $(CFF_DIR)/cf2read.c  \
-               $(CFF_DIR)/cf2stack.c
+               $(CFF_DIR)/cffpic.c
 
 
 # CFF driver headers
 #
 CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \
              $(CFF_DIR)/cfferrs.h   \
-             $(CFF_DIR)/cfftoken.h  \
-             $(CFF_DIR)/cfftypes.h  \
-             $(CFF_DIR)/cf2fixed.h  \
-             $(CFF_DIR)/cf2glue.h   \
-             $(CFF_DIR)/cf2types.h
+             $(CFF_DIR)/cfftoken.h
 
 
 # CFF driver object(s)
diff --git a/src/cid/Jamfile b/src/cid/Jamfile
index af00180..1c232fd 100644
--- a/src/cid/Jamfile
+++ b/src/cid/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/cid Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,12 @@
 
   if $(FT2_MULTI)
   {
-    _sources = cidobjs cidload cidgload cidriver cidparse ;
+    _sources = cidgload
+               cidload
+               cidobjs
+               cidparse
+               cidriver
+               ;
   }
   else
   {
diff --git a/src/cid/ciderrs.h b/src/cid/ciderrs.h
index 5e0e776..a5a86e3 100644
--- a/src/cid/ciderrs.h
+++ b/src/cid/ciderrs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __CIDERRS_H__
-#define __CIDERRS_H__
+#ifndef CIDERRS_H_
+#define CIDERRS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  CID_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __CIDERRS_H__ */
+#endif /* CIDERRS_H_ */
 
 
 /* END */
diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c
index d06293c..d14f9a2 100644
--- a/src/cid/cidgload.c
+++ b/src/cid/cidgload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 Glyph Loader (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,6 +24,10 @@
 #include FT_OUTLINE_H
 #include FT_INTERNAL_CALC_H
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_DRIVER_H
+
 #include "ciderrs.h"
 
 
@@ -52,9 +56,11 @@
     FT_ULong       glyph_length = 0;
     PSAux_Service  psaux        = (PSAux_Service)face->psaux;
 
+    FT_Bool  force_scaling = FALSE;
+
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_InterfaceRec *inc =
-                                  face->root.internal->incremental_interface;
+    FT_Incremental_InterfaceRec  *inc =
+                                   face->root.internal->incremental_interface;
 #endif
 
 
@@ -100,7 +106,7 @@
     /* and charstring offset from the CIDMap.                */
     {
       FT_UInt   entry_len = (FT_UInt)( cid->fd_bytes + cid->gd_bytes );
-      FT_ULong  off1;
+      FT_ULong  off1, off2;
 
 
       if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
@@ -108,18 +114,23 @@
            FT_FRAME_ENTER( 2 * entry_len )                         )
         goto Exit;
 
-      p            = (FT_Byte*)stream->cursor;
-      fd_select    = cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
-      off1         = cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
-      p           += cid->fd_bytes;
-      glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
+      p         = (FT_Byte*)stream->cursor;
+      fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+      off1      = cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
+      p        += cid->fd_bytes;
+      off2      = cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
       FT_FRAME_EXIT();
 
-      if ( fd_select >= (FT_ULong)cid->num_dicts )
+      if ( fd_select >= (FT_ULong)cid->num_dicts ||
+           off2 > stream->size                   ||
+           off1 > off2                           )
       {
+        FT_TRACE0(( "cid_load_glyph: invalid glyph stream offsets\n" ));
         error = FT_THROW( Invalid_Offset );
         goto Exit;
       }
+
+      glyph_length = off2 - off1;
       if ( glyph_length == 0 )
         goto Exit;
       if ( FT_ALLOC( charstring, glyph_length ) )
@@ -137,9 +148,10 @@
 
 
       /* Set up subrs */
-      decoder->num_subrs = cid_subrs->num_subrs;
-      decoder->subrs     = cid_subrs->code;
-      decoder->subrs_len = 0;
+      decoder->num_subrs  = cid_subrs->num_subrs;
+      decoder->subrs      = cid_subrs->code;
+      decoder->subrs_len  = 0;
+      decoder->subrs_hash = NULL;
 
       /* Set up font matrix */
       dict                 = cid->font_dicts + fd_select;
@@ -152,17 +164,69 @@
 
       /* Adjustment for seed bytes. */
       cs_offset = decoder->lenIV >= 0 ? (FT_UInt)decoder->lenIV : 0;
+      if ( cs_offset > glyph_length )
+      {
+        FT_TRACE0(( "cid_load_glyph: invalid glyph stream offsets\n" ));
+        error = FT_THROW( Invalid_Offset );
+        goto Exit;
+      }
 
       /* Decrypt only if lenIV >= 0. */
       if ( decoder->lenIV >= 0 )
         psaux->t1_decrypt( charstring, glyph_length, 4330 );
 
-      error = decoder->funcs.parse_charstrings(
-                decoder, charstring + cs_offset,
-                glyph_length - cs_offset );
-    }
+      /* choose which renderer to use */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+      if ( ( (PS_Driver)FT_FACE_DRIVER( face ) )->hinting_engine ==
+               FT_HINTING_FREETYPE                                  ||
+           decoder->builder.metrics_only                            )
+        error = psaux->t1_decoder_funcs->parse_charstrings_old(
+                  decoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+#else
+      if ( decoder->builder.metrics_only )
+        error = psaux->t1_decoder_funcs->parse_metrics(
+                  decoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+#endif
+      else
+      {
+        PS_Decoder      psdecoder;
+        CFF_SubFontRec  subfont;
 
-    FT_FREE( charstring );
+
+        psaux->ps_decoder_init( &psdecoder, decoder, TRUE );
+
+        psaux->t1_make_subfont( FT_FACE( face ),
+                                &dict->private_dict,
+                                &subfont );
+        psdecoder.current_subfont = &subfont;
+
+        error = psaux->t1_decoder_funcs->parse_charstrings(
+                  &psdecoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+
+        /* Adobe's engine uses 16.16 numbers everywhere;              */
+        /* as a consequence, glyphs larger than 2000ppem get rejected */
+        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+        {
+          /* this time, we retry unhinted and scale up the glyph later on */
+          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+          /* 0x400 for both `x_scale' and `y_scale' in this case)         */
+          ((CID_GlyphSlot)decoder->builder.glyph)->hint = FALSE;
+
+          force_scaling = TRUE;
+
+          error = psaux->t1_decoder_funcs->parse_charstrings(
+                    &psdecoder,
+                    charstring + cs_offset,
+                    glyph_length - cs_offset );
+        }
+      }
+    }
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
@@ -188,6 +252,10 @@
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
   Exit:
+    FT_FREE( charstring );
+
+    ((CID_GlyphSlot)decoder->builder.glyph)->scaled = force_scaling;
+
     return error;
   }
 
@@ -276,10 +344,12 @@
     T1_DecoderRec  decoder;
     CID_Face       face = (CID_Face)cidglyph->face;
     FT_Bool        hinting;
+    FT_Bool        scaled;
 
     PSAux_Service  psaux = (PSAux_Service)face->psaux;
     FT_Matrix      font_matrix;
     FT_Vector      font_offset;
+    FT_Bool        must_finish_decoder = FALSE;
 
 
     if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
@@ -299,7 +369,10 @@
 
     hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
                        ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
 
+    glyph->hint      = hinting;
+    glyph->scaled    = scaled;
     cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = psaux->t1_decoder_funcs->init( &decoder,
@@ -317,6 +390,8 @@
     /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
     /*       if we ever support CID-keyed multiple master fonts     */
 
+    must_finish_decoder = TRUE;
+
     /* set up the decoder */
     decoder.builder.no_recurse = FT_BOOL(
       ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
@@ -325,12 +400,18 @@
     if ( error )
       goto Exit;
 
+    /* copy flags back for forced scaling */
+    hinting = glyph->hint;
+    scaled  = glyph->scaled;
+
     font_matrix = decoder.font_matrix;
     font_offset = decoder.font_offset;
 
     /* save new glyph tables */
     psaux->t1_decoder_funcs->done( &decoder );
 
+    must_finish_decoder = FALSE;
+
     /* now set the metrics -- this is rather simple, as    */
     /* the left side bearing is the xMin, and the top side */
     /* bearing the yMax                                    */
@@ -357,7 +438,6 @@
     {
       FT_BBox            cbox;
       FT_Glyph_Metrics*  metrics = &cidglyph->metrics;
-      FT_Vector          advance;
 
 
       /* copy the _unscaled_ advance width */
@@ -377,24 +457,29 @@
       if ( cidsize->metrics.y_ppem < 24 )
         cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
 
-      /* apply the font matrix */
-      FT_Outline_Transform( &cidglyph->outline, &font_matrix );
+      /* apply the font matrix, if any */
+      if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
+           font_matrix.xy != 0        || font_matrix.yx != 0        )
+      {
+        FT_Outline_Transform( &cidglyph->outline, &font_matrix );
 
-      FT_Outline_Translate( &cidglyph->outline,
-                            font_offset.x,
-                            font_offset.y );
+        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance,
+                                          font_matrix.xx );
+        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance,
+                                          font_matrix.yy );
+      }
 
-      advance.x = metrics->horiAdvance;
-      advance.y = 0;
-      FT_Vector_Transform( &advance, &font_matrix );
-      metrics->horiAdvance = advance.x + font_offset.x;
+      if ( font_offset.x || font_offset.y )
+      {
+        FT_Outline_Translate( &cidglyph->outline,
+                              font_offset.x,
+                              font_offset.y );
 
-      advance.x = 0;
-      advance.y = metrics->vertAdvance;
-      FT_Vector_Transform( &advance, &font_matrix );
-      metrics->vertAdvance = advance.y + font_offset.y;
+        metrics->horiAdvance += font_offset.x;
+        metrics->vertAdvance += font_offset.y;
+      }
 
-      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || scaled )
       {
         /* scale the outline and the metrics */
         FT_Int       n;
@@ -435,6 +520,10 @@
     }
 
   Exit:
+
+    if ( must_finish_decoder )
+      psaux->t1_decoder_funcs->done( &decoder );
+
     return error;
   }
 
diff --git a/src/cid/cidgload.h b/src/cid/cidgload.h
index 4a10ce5..4811852 100644
--- a/src/cid/cidgload.h
+++ b/src/cid/cidgload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CIDGLOAD_H__
-#define __CIDGLOAD_H__
+#ifndef CIDGLOAD_H_
+#define CIDGLOAD_H_
 
 
 #include <ft2build.h>
@@ -45,7 +45,7 @@
 
 FT_END_HEADER
 
-#endif /* __CIDGLOAD_H__ */
+#endif /* CIDGLOAD_H_ */
 
 
 /* END */
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
index 6f35860..27cd09b 100644
--- a/src/cid/cidload.c
+++ b/src/cid/cidload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (body).                                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -167,6 +167,7 @@
       matrix = &dict->font_matrix;
       offset = &dict->font_offset;
 
+      /* input is scaled by 1000 to accommodate default FontMatrix */
       result = cid_parser_to_fixed_array( parser, 6, temp, 3 );
 
       if ( result < 6 )
@@ -180,15 +181,12 @@
         return FT_THROW( Invalid_File_Format );
       }
 
-      /* Set Units per EM based on FontMatrix values.  We set the value to */
-      /* 1000 / temp_scale, because temp_scale was already multiplied by   */
-      /* 1000 (in t1_tofixed, from psobjs.c).                              */
-
-      root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
-
-      /* we need to scale the values by 1.0/temp[3] */
+      /* atypical case */
       if ( temp_scale != 0x10000L )
       {
+        /* set units per EM based on FontMatrix values */
+        root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
         temp[0] = FT_DivFix( temp[0], temp_scale );
         temp[1] = FT_DivFix( temp[1], temp_scale );
         temp[2] = FT_DivFix( temp[2], temp_scale );
@@ -217,6 +215,7 @@
   {
     CID_FaceInfo  cid    = &face->cid;
     FT_Memory     memory = face->root.memory;
+    FT_Stream     stream = parser->stream;
     FT_Error      error  = FT_Err_Ok;
     FT_Long       num_dicts;
 
@@ -229,6 +228,31 @@
       goto Exit;
     }
 
+    /*
+     * A single entry in the FDArray must (at least) contain the following
+     * structure elements.
+     *
+     *   %ADOBeginFontDict              18
+     *   X dict begin                   13
+     *     /FontMatrix [X X X X]        22
+     *     /Private X dict begin        22
+     *     end                           4
+     *   end                             4
+     *   %ADOEndFontDict                16
+     *
+     * This needs 18+13+22+22+4+4+16=99 bytes or more.  Normally, you also
+     * need a `dup X' at the very beginning and a `put' at the end, so a
+     * rough guess using 100 bytes as the minimum is justified.
+     */
+    if ( (FT_ULong)num_dicts > stream->size / 100 )
+    {
+      FT_TRACE0(( "parse_fd_array: adjusting FDArray size"
+                  " (from %d to %d)\n",
+                  num_dicts,
+                  stream->size / 100 ));
+      num_dicts = (FT_Long)( stream->size / 100 );
+    }
+
     if ( !cid->font_dicts )
     {
       FT_Int  n;
@@ -397,7 +421,14 @@
 
         cur = parser->root.cursor;
       }
+
+      if ( !face->cid.num_dicts )
+      {
+        FT_ERROR(( "cid_parse_dict: No font dictionary found\n" ));
+        return FT_THROW( Invalid_File_Format );
+      }
     }
+
     return parser->root.error;
   }
 
@@ -430,12 +461,8 @@
       FT_Byte*      p;
 
 
-      /* Check for possible overflow. */
-      if ( num_subrs == FT_UINT_MAX )
-      {
-        error = FT_THROW( Syntax_Error );
-        goto Fail;
-      }
+      if ( !num_subrs )
+        continue;
 
       /* reallocate offsets array if needed */
       if ( num_subrs + 1 > max_offsets )
@@ -469,14 +496,25 @@
       /* offsets must be ordered */
       for ( count = 1; count <= num_subrs; count++ )
         if ( offsets[count - 1] > offsets[count] )
+        {
+          FT_ERROR(( "cid_read_subrs: offsets are not ordered\n" ));
+          error = FT_THROW( Invalid_File_Format );
           goto Fail;
+        }
+
+      if ( offsets[num_subrs] > stream->size - cid->data_offset )
+      {
+        FT_ERROR(( "cid_read_subrs: too large `subrs' offsets\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Fail;
+      }
 
       /* now, compute the size of subrs charstrings, */
       /* allocate, and read them                     */
       data_len = offsets[num_subrs] - offsets[0];
 
       if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||
-               FT_ALLOC( subr->code[0], data_len )   )
+           FT_ALLOC( subr->code[0], data_len )       )
         goto Fail;
 
       if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
@@ -535,7 +573,7 @@
   {
     FT_UNUSED( face );
 
-    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+    FT_ZERO( loader );
   }
 
 
@@ -656,6 +694,12 @@
     CID_Parser*  parser;
     FT_Memory    memory = face->root.memory;
     FT_Error     error;
+    FT_Int       n;
+
+    CID_FaceInfo  cid = &face->cid;
+
+    FT_ULong  binary_length;
+    FT_ULong  entry_len;
 
 
     cid_init_loader( &loader, face );
@@ -680,22 +724,117 @@
 
     if ( parser->binary_length )
     {
+      if ( parser->binary_length >
+             face->root.stream->size - parser->data_offset )
+      {
+        FT_TRACE0(( "cid_face_open: adjusting length of binary data\n"
+                    "               (from %d to %d bytes)\n",
+                    parser->binary_length,
+                    face->root.stream->size - parser->data_offset ));
+        parser->binary_length = face->root.stream->size -
+                                parser->data_offset;
+      }
+
       /* we must convert the data section from hexadecimal to binary */
-      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||
-           cid_hex_to_binary( face->binary_data, parser->binary_length,
-                              parser->data_offset, face )               )
+      if ( FT_ALLOC( face->binary_data, parser->binary_length )    ||
+           FT_SET_ERROR( cid_hex_to_binary( face->binary_data,
+                                            parser->binary_length,
+                                            parser->data_offset,
+                                            face ) )               )
         goto Exit;
 
       FT_Stream_OpenMemory( face->cid_stream,
                             face->binary_data, parser->binary_length );
-      face->cid.data_offset = 0;
+      cid->data_offset = 0;
     }
     else
     {
-      *face->cid_stream     = *face->root.stream;
-      face->cid.data_offset = loader.parser.data_offset;
+      *face->cid_stream = *face->root.stream;
+      cid->data_offset  = loader.parser.data_offset;
     }
 
+    /* sanity tests */
+
+    if ( cid->fd_bytes < 0 || cid->gd_bytes < 1 )
+    {
+      FT_ERROR(( "cid_parse_dict:"
+                 " Invalid `FDBytes' or `GDBytes' value\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* allow at most 32bit offsets */
+    if ( cid->fd_bytes > 4 || cid->gd_bytes > 4 )
+    {
+      FT_ERROR(( "cid_parse_dict:"
+                 " Values of `FDBytes' or `GDBytes' larger than 4\n"
+                 "               "
+                 " are not supported\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    binary_length = face->cid_stream->size - cid->data_offset;
+    entry_len     = (FT_ULong)( cid->fd_bytes + cid->gd_bytes );
+
+    for ( n = 0; n < cid->num_dicts; n++ )
+    {
+      CID_FaceDict  dict = cid->font_dicts + n;
+
+
+      if ( dict->sd_bytes < 0                        ||
+           ( dict->num_subrs && dict->sd_bytes < 1 ) )
+      {
+        FT_ERROR(( "cid_parse_dict: Invalid `SDBytes' value\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      if ( dict->sd_bytes > 4 )
+      {
+        FT_ERROR(( "cid_parse_dict:"
+                   " Values of `SDBytes' larger than 4"
+                   " are not supported\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      if ( dict->subrmap_offset > binary_length )
+      {
+        FT_ERROR(( "cid_parse_dict: Invalid `SubrMapOffset' value\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* `num_subrs' is scanned as a signed integer */
+      if ( (FT_Int)dict->num_subrs < 0                                     ||
+           ( dict->sd_bytes                                              &&
+             dict->num_subrs > ( binary_length - dict->subrmap_offset ) /
+                                 (FT_UInt)dict->sd_bytes                 ) )
+      {
+        FT_ERROR(( "cid_parse_dict: Invalid `SubrCount' value\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+    }
+
+    if ( cid->cidmap_offset > binary_length )
+    {
+      FT_ERROR(( "cid_parse_dict: Invalid `CIDMapOffset' value\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    if ( entry_len                                            &&
+         cid->cid_count >
+           ( binary_length - cid->cidmap_offset ) / entry_len )
+    {
+      FT_ERROR(( "cid_parse_dict: Invalid `CIDCount' value\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Exit;
+    }
+
+    /* we can now safely proceed */
     error = cid_read_subrs( face );
 
   Exit:
diff --git a/src/cid/cidload.h b/src/cid/cidload.h
index d7776d2..3f8bd08 100644
--- a/src/cid/cidload.h
+++ b/src/cid/cidload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (specification).                         */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CIDLOAD_H__
-#define __CIDLOAD_H__
+#ifndef CIDLOAD_H_
+#define CIDLOAD_H_
 
 
 #include <ft2build.h>
@@ -47,7 +47,7 @@
 
 FT_END_HEADER
 
-#endif /* __CIDLOAD_H__ */
+#endif /* CIDLOAD_H_ */
 
 
 /* END */
diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c
index a3d6895..77afe1c 100644
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID objects manager (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -26,6 +26,7 @@
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_DRIVER_H
 
 #include "ciderrs.h"
 
@@ -113,16 +114,16 @@
     CID_Size  size = (CID_Size)cidsize;
 
 
-    if ( cidsize->internal )
+    if ( cidsize->internal->module_data )
     {
       PSH_Globals_Funcs  funcs;
 
 
       funcs = cid_size_get_globals_funcs( size );
       if ( funcs )
-        funcs->destroy( (PSH_Globals)cidsize->internal );
+        funcs->destroy( (PSH_Globals)cidsize->internal->module_data );
 
-      cidsize->internal = NULL;
+      cidsize->internal->module_data = NULL;
     }
   }
 
@@ -145,7 +146,7 @@
 
       error = funcs->create( cidsize->face->memory, priv, &globals );
       if ( !error )
-        cidsize->internal = (FT_Size_Internal)(void*)globals;
+        cidsize->internal->module_data = globals;
     }
 
     return error;
@@ -164,7 +165,7 @@
     funcs = cid_size_get_globals_funcs( (CID_Size)size );
 
     if ( funcs )
-      funcs->set_scale( (PSH_Globals)size->internal,
+      funcs->set_scale( (PSH_Globals)size->internal->module_data,
                         size->metrics.x_scale,
                         size->metrics.y_scale,
                         0, 0 );
@@ -334,7 +335,7 @@
 
     /* check the face index */
     /* XXX: handle CID fonts with more than a single face */
-    if ( face_index != 0 )
+    if ( ( face_index & 0xFFFF ) != 0 )
     {
       FT_ERROR(( "cid_face_init: invalid face index\n" ));
       error = FT_THROW( Invalid_Argument );
@@ -354,7 +355,7 @@
       cidface->num_glyphs   = (FT_Long)cid->cid_count;
       cidface->num_charmaps = 0;
 
-      cidface->face_index = face_index;
+      cidface->face_index = face_index & 0xFFFF;
 
       cidface->face_flags |= FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
                              FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
@@ -463,9 +464,42 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  cid_driver_init( FT_Module  driver )
+  cid_driver_init( FT_Module  module )
   {
-    FT_UNUSED( driver );
+    PS_Driver  driver = (PS_Driver)module;
+
+    FT_UInt32  seed;
+
+
+    /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_HINTING_FREETYPE;
+#else
+    driver->hinting_engine = FT_HINTING_ADOBE;
+#endif
+
+    driver->no_stem_darkening = TRUE;
+
+    driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
+    driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
+    driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
+    driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
+    driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
+    driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
+    driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
+    driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+
+    /* compute random seed from some memory addresses */
+    seed = (FT_UInt32)( (FT_Offset)(char*)&seed          ^
+                        (FT_Offset)(char*)&module        ^
+                        (FT_Offset)(char*)module->memory );
+    seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+    driver->random_seed = (FT_Int32)seed;
+    if ( driver->random_seed < 0 )
+      driver->random_seed = -driver->random_seed;
+    else if ( driver->random_seed == 0 )
+      driver->random_seed = 123456789;
 
     return FT_Err_Ok;
   }
diff --git a/src/cid/cidobjs.h b/src/cid/cidobjs.h
index e9095ca..0221f01 100644
--- a/src/cid/cidobjs.h
+++ b/src/cid/cidobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID objects manager (specification).                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CIDOBJS_H__
-#define __CIDOBJS_H__
+#ifndef CIDOBJS_H_
+#define CIDOBJS_H_
 
 
 #include <ft2build.h>
@@ -148,7 +148,7 @@
 
 FT_END_HEADER
 
-#endif /* __CIDOBJS_H__ */
+#endif /* CIDOBJS_H_ */
 
 
 /* END */
diff --git a/src/cid/cidparse.c b/src/cid/cidparse.c
index c276949..b1c7f3c 100644
--- a/src/cid/cidparse.c
+++ b/src/cid/cidparse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 parser (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -47,6 +47,12 @@
   /*************************************************************************/
 
 
+#define STARTDATA      "StartData"
+#define STARTDATA_LEN  ( sizeof ( STARTDATA ) - 1 )
+#define SFNTS          "/sfnts"
+#define SFNTS_LEN      ( sizeof ( SFNTS ) - 1 )
+
+
   FT_LOCAL_DEF( FT_Error )
   cid_parser_new( CID_Parser*    parser,
                   FT_Stream      stream,
@@ -59,7 +65,7 @@
     FT_Byte   *arg1, *arg2;
 
 
-    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+    FT_ZERO( parser );
     psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
 
     parser->stream = stream;
@@ -85,9 +91,29 @@
     /* now, read the rest of the file until we find */
     /* `StartData' or `/sfnts'                      */
     {
-      FT_Byte   buffer[256 + 10];
-      FT_ULong  read_len = 256 + 10;
-      FT_Byte*  p        = buffer;
+      /*
+       * The algorithm is as follows (omitting the case with less than 256
+       * bytes to fill for simplicity).
+       *
+       * 1. Fill the buffer with 256 + STARTDATA_LEN bytes.
+       *
+       * 2. Search for the STARTDATA and SFNTS strings at positions
+       *    buffer[0], buffer[1], ...,
+       *    buffer[255 + STARTDATA_LEN - SFNTS_LEN].
+       *
+       * 3. Move the last STARTDATA_LEN bytes to buffer[0].
+       *
+       * 4. Fill the buffer with 256 bytes, starting at STARTDATA_LEN.
+       *
+       * 5. Repeat with step 2.
+       *
+       */
+      FT_Byte  buffer[256 + STARTDATA_LEN + 1];
+
+      /* values for the first loop */
+      FT_ULong  read_len    = 256 + STARTDATA_LEN;
+      FT_ULong  read_offset = 0;
+      FT_Byte*  p           = buffer;
 
 
       for ( offset = FT_STREAM_POS(); ; offset += 256 )
@@ -96,40 +122,48 @@
 
 
         stream_len = stream->size - FT_STREAM_POS();
-        if ( stream_len == 0 )
+
+        read_len = FT_MIN( read_len, stream_len );
+        if ( FT_STREAM_READ( p, read_len ) )
+          goto Exit;
+
+        /* ensure that we do not compare with data beyond the buffer */
+        p[read_len] = '\0';
+
+        limit = p + read_len - SFNTS_LEN;
+
+        for ( p = buffer; p < limit; p++ )
+        {
+          if ( p[0] == 'S'                                           &&
+               ft_strncmp( (char*)p, STARTDATA, STARTDATA_LEN ) == 0 )
+          {
+            /* save offset of binary data after `StartData' */
+            offset += (FT_ULong)( p - buffer ) + STARTDATA_LEN + 1;
+            goto Found;
+          }
+          else if ( p[1] == 's'                                   &&
+                    ft_strncmp( (char*)p, SFNTS, SFNTS_LEN ) == 0 )
+          {
+            offset += (FT_ULong)( p - buffer ) + SFNTS_LEN + 1;
+            goto Found;
+          }
+        }
+
+        if ( read_offset + read_len < STARTDATA_LEN )
         {
           FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" ));
           error = FT_THROW( Invalid_File_Format );
           goto Exit;
         }
 
-        read_len = FT_MIN( read_len, stream_len );
-        if ( FT_STREAM_READ( p, read_len ) )
-          goto Exit;
+        FT_MEM_MOVE( buffer,
+                     buffer + read_offset + read_len - STARTDATA_LEN,
+                     STARTDATA_LEN );
 
-        if ( read_len < 256 )
-          p[read_len]  = '\0';
-
-        limit = p + read_len - 10;
-
-        for ( p = buffer; p < limit; p++ )
-        {
-          if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 )
-          {
-            /* save offset of binary data after `StartData' */
-            offset += (FT_ULong)( p - buffer + 10 );
-            goto Found;
-          }
-          else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
-          {
-            offset += (FT_ULong)( p - buffer + 7 );
-            goto Found;
-          }
-        }
-
-        FT_MEM_MOVE( buffer, p, 10 );
-        read_len = 256;
-        p = buffer + 10;
+        /* values for the next loop */
+        read_len    = 256;
+        read_offset = STARTDATA_LEN;
+        p           = buffer + read_offset;
       }
     }
 
@@ -165,7 +199,7 @@
     limit = parser->root.limit;
     cur   = parser->root.cursor;
 
-    while ( cur < limit )
+    while ( cur <= limit - SFNTS_LEN )
     {
       if ( parser->root.error )
       {
@@ -173,11 +207,13 @@
         goto Exit;
       }
 
-      if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+      if ( cur[0] == 'S'                                           &&
+           cur <= limit - STARTDATA_LEN                            &&
+           ft_strncmp( (char*)cur, STARTDATA, STARTDATA_LEN ) == 0 )
       {
         if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
         {
-          FT_Long  tmp = ft_atol( (const char *)arg2 );
+          FT_Long  tmp = ft_strtol( (const char *)arg2, NULL, 10 );
 
 
           if ( tmp < 0 )
@@ -191,7 +227,8 @@
 
         goto Exit;
       }
-      else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+      else if ( cur[1] == 's'                                   &&
+                ft_strncmp( (char*)cur, SFNTS, SFNTS_LEN ) == 0 )
       {
         FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
         error = FT_THROW( Unknown_File_Format );
@@ -216,6 +253,12 @@
   }
 
 
+#undef STARTDATA
+#undef STARTDATA_LEN
+#undef SFNTS
+#undef SFNTS_LEN
+
+
   FT_LOCAL_DEF( void )
   cid_parser_done( CID_Parser*  parser )
   {
diff --git a/src/cid/cidparse.h b/src/cid/cidparse.h
index f581bb4..61602f7 100644
--- a/src/cid/cidparse.h
+++ b/src/cid/cidparse.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 parser (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CIDPARSE_H__
-#define __CIDPARSE_H__
+#ifndef CIDPARSE_H_
+#define CIDPARSE_H_
 
 
 #include <ft2build.h>
@@ -117,7 +117,7 @@
 
 FT_END_HEADER
 
-#endif /* __CIDPARSE_H__ */
+#endif /* CIDPARSE_H_ */
 
 
 /* END */
diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c
index 07c4cc4..d9faf35 100644
--- a/src/cid/cidriver.c
+++ b/src/cid/cidriver.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID driver interface (body).                                         */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,7 @@
 #include "cidriver.h"
 #include "cidgload.h"
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
 
 #include "ciderrs.h"
 
@@ -27,6 +28,10 @@
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
 #include FT_SERVICE_CID_H
+#include FT_SERVICE_PROPERTIES_H
+#include FT_DRIVER_H
+
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 
   /*************************************************************************/
@@ -59,7 +64,7 @@
 
   static const FT_Service_PsFontNameRec  cid_service_ps_name =
   {
-    (FT_PsName_GetFunc) cid_get_postscript_name
+    (FT_PsName_GetFunc)cid_get_postscript_name    /* get_ps_font_name */
   };
 
 
@@ -88,11 +93,14 @@
 
   static const FT_Service_PsInfoRec  cid_service_ps_info =
   {
-    (PS_GetFontInfoFunc)   cid_ps_get_font_info,
-    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,
-    (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */
-    (PS_GetFontPrivateFunc)NULL,        /* unsupported                */
-    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+    (PS_GetFontInfoFunc)   cid_ps_get_font_info,   /* ps_get_font_info    */
+    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,  /* ps_get_font_extra   */
+    /* unsupported with CID fonts */
+    (PS_HasGlyphNamesFunc) NULL,                   /* ps_has_glyph_names  */
+    /* unsupported                */
+    (PS_GetFontPrivateFunc)NULL,                   /* ps_get_font_private */
+    /* not implemented            */
+    (PS_GetFontValueFunc)  NULL                    /* ps_get_font_value   */
   };
 
 
@@ -155,13 +163,28 @@
 
   static const FT_Service_CIDRec  cid_service_cid_info =
   {
-     (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,
-     (FT_CID_GetIsInternallyCIDKeyedFunc)      cid_get_is_cid,
-     (FT_CID_GetCIDFromGlyphIndexFunc)         cid_get_cid_from_glyph_index
+    (FT_CID_GetRegistryOrderingSupplementFunc)
+      cid_get_ros,                             /* get_ros                  */
+    (FT_CID_GetIsInternallyCIDKeyedFunc)
+      cid_get_is_cid,                          /* get_is_cid               */
+    (FT_CID_GetCIDFromGlyphIndexFunc)
+      cid_get_cid_from_glyph_index             /* get_cid_from_glyph_index */
   };
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    cid_service_properties,
+
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
@@ -172,6 +195,7 @@
     { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },
     { FT_SERVICE_ID_CID,                  &cid_service_cid_info },
+    { FT_SERVICE_ID_PROPERTIES,           &cid_service_properties },
     { NULL, NULL }
   };
 
@@ -190,46 +214,42 @@
   FT_CALLBACK_TABLE_DEF
   const FT_Driver_ClassRec  t1cid_driver_class =
   {
-    /* first of all, the FT_Module_Class fields */
     {
       FT_MODULE_FONT_DRIVER       |
       FT_MODULE_DRIVER_SCALABLE   |
       FT_MODULE_DRIVER_HAS_HINTER,
+      sizeof ( PS_DriverRec ),
 
-      sizeof ( FT_DriverRec ),
       "t1cid",   /* module name           */
       0x10000L,  /* version 1.0 of driver */
       0x20000L,  /* requires FreeType 2.0 */
 
-      0,
+      NULL,    /* module-specific interface */
 
-      cid_driver_init,
-      cid_driver_done,
-      cid_get_interface
+      cid_driver_init,          /* FT_Module_Constructor  module_init   */
+      cid_driver_done,          /* FT_Module_Destructor   module_done   */
+      cid_get_interface         /* FT_Module_Requester    get_interface */
     },
 
-    /* then the other font drivers fields */
     sizeof ( CID_FaceRec ),
     sizeof ( CID_SizeRec ),
     sizeof ( CID_GlyphSlotRec ),
 
-    cid_face_init,
-    cid_face_done,
+    cid_face_init,              /* FT_Face_InitFunc  init_face */
+    cid_face_done,              /* FT_Face_DoneFunc  done_face */
+    cid_size_init,              /* FT_Size_InitFunc  init_size */
+    cid_size_done,              /* FT_Size_DoneFunc  done_size */
+    cid_slot_init,              /* FT_Slot_InitFunc  init_slot */
+    cid_slot_done,              /* FT_Slot_DoneFunc  done_slot */
 
-    cid_size_init,
-    cid_size_done,
-    cid_slot_init,
-    cid_slot_done,
+    cid_slot_load_glyph,        /* FT_Slot_LoadFunc  load_glyph */
 
-    cid_slot_load_glyph,
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
 
-    0,                      /* FT_Face_GetKerningFunc  */
-    0,                      /* FT_Face_AttachFunc      */
-
-    0,                      /* FT_Face_GetAdvancesFunc */
-
-    cid_size_request,
-    0                       /* FT_Size_SelectFunc      */
+    cid_size_request,           /* FT_Size_RequestFunc  request_size */
+    NULL                        /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/cid/cidriver.h b/src/cid/cidriver.h
index e5b8678..59d9ded 100644
--- a/src/cid/cidriver.h
+++ b/src/cid/cidriver.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level CID driver interface (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __CIDRIVER_H__
-#define __CIDRIVER_H__
+#ifndef CIDRIVER_H_
+#define CIDRIVER_H_
 
 
 #include <ft2build.h>
@@ -37,7 +37,7 @@
 
 FT_END_HEADER
 
-#endif /* __CIDRIVER_H__ */
+#endif /* CIDRIVER_H_ */
 
 
 /* END */
diff --git a/src/cid/cidtoken.h b/src/cid/cidtoken.h
index 82eae0c..b0e2dac 100644
--- a/src/cid/cidtoken.h
+++ b/src/cid/cidtoken.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID token definitions (specification only).                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/cid/module.mk b/src/cid/module.mk
index e312a3c..9010e33 100644
--- a/src/cid/module.mk
+++ b/src/cid/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/cid/rules.mk b/src/cid/rules.mk
index 282f2aa..94333bd 100644
--- a/src/cid/rules.mk
+++ b/src/cid/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/cid/type1cid.c b/src/cid/type1cid.c
index 0d54ca7..61770e3 100644
--- a/src/cid/type1cid.c
+++ b/src/cid/type1cid.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType OpenType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,13 +17,13 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "cidparse.c"
+
+#include "cidgload.c"
 #include "cidload.c"
 #include "cidobjs.c"
+#include "cidparse.c"
 #include "cidriver.c"
-#include "cidgload.c"
 
 
 /* END */
diff --git a/src/gxvalid/Jamfile b/src/gxvalid/Jamfile
index 9419067..74f3c51 100644
--- a/src/gxvalid/Jamfile
+++ b/src/gxvalid/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/gxvalid Jamfile
 #
-# Copyright 2005-2015 by
+# Copyright 2005-2018 by
 # suzuki toshiya, Masatake YAMATO and Red Hat K.K.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -17,10 +17,29 @@
 
   if $(FT2_MULTI)
   {
-    _sources = gxvcommn gxvfeat  gxvbsln  gxvtrak  gxvopbd  gxvprop
-               gxvmort  gxvmort0 gxvmort1 gxvmort2 gxvmort4 gxvmort5
-               gxvmorx  gxvmorx0 gxvmorx1 gxvmorx2 gxvmorx4 gxvmorx5
-               gxvlcar  gxvkern  gxvmod   gxvjust  ;
+    _sources = gxvbsln
+               gxvcommn
+               gxvfeat
+               gxvjust
+               gxvkern
+               gxvlcar
+               gxvmod
+               gxvmort
+               gxvmort0
+               gxvmort1
+               gxvmort2
+               gxvmort4
+               gxvmort5
+               gxvmorx
+               gxvmorx0
+               gxvmorx1
+               gxvmorx2
+               gxvmorx4
+               gxvmorx5
+               gxvopbd
+               gxvprop
+               gxvtrak
+               ;
   }
   else
   {
diff --git a/src/gxvalid/README b/src/gxvalid/README
index 60f2fc1..af8128e 100644
--- a/src/gxvalid/README
+++ b/src/gxvalid/README
@@ -9,7 +9,7 @@
   additional tables  in TrueType  font which are  used by  `QuickDraw GX
   Text',  Apple Advanced  Typography  (AAT).  In  addition, gxvalid  can
   validates `kern'  tables which have  been extended for AAT.   Like the
-  otvalid  module,   gxvalid  uses  Freetype   2's  validator  framework
+  otvalid  module,   gxvalid  uses   FreeType  2's  validator  framework
   (ftvalid).
 
   You can link gxvalid with your program; before running your own layout
@@ -287,11 +287,11 @@
   4-5. invalid feature number (117/183)
   -------------------------------------
 
-    The GX/AAT extension can  include 255 different layout features, but
-    popular      layout      features      are      predefined      (see
-    http://developer.apple.com/fonts/Registry/index.html).   Some  fonts
-    include feature  numbers which are incompatible  with the predefined
-    feature registry.
+    The GX/AAT  extension can  include 255 different  layout features,
+    but    popular    layout     features    are    predefined    (see
+    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html).
+    Some fonts include feature numbers which are incompatible with the
+    predefined feature registry.
 
     In our survey, there are 140 fonts including `feat' table.
 
@@ -413,7 +413,7 @@
       format  assured for  Windows  and OS/2  support  is only  subtable
       format  0.  The  Microsoft TrueType  specification  also describes
       subtable format  2, but does  not mention which  platforms support
-      it.  Aubtable formats 1, 3,  and higher are documented as reserved
+      it.  Subtable formats 1, 3,  and higher are documented as reserved
       for future use.  Therefore, the classic version can store subtable
       formats 0 and 2, at least.  `ttfdump.exe', a font tool provided by
       Microsoft,  ignores the  subtable format  written in  the subtable
@@ -518,7 +518,7 @@
 
 ------------------------------------------------------------------------
 
-Copyright 2004-2015 by
+Copyright 2004-2018 by
 suzuki toshiya, Masatake YAMATO, Red hat K.K.,
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
diff --git a/src/gxvalid/gxvalid.c b/src/gxvalid/gxvalid.c
index 7b5b091..d0577a2 100644
--- a/src/gxvalid/gxvalid.c
+++ b/src/gxvalid/gxvalid.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validator for TrueTypeGX/AAT tables (body only).            */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -16,15 +16,17 @@
 /*                                                                         */
 /***************************************************************************/
 
-#define FT_MAKE_OPTION_SINGLE_OBJECT
 
+#define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
 
-#include "gxvfeat.c"
-#include "gxvcommn.c"
 #include "gxvbsln.c"
-#include "gxvtrak.c"
+#include "gxvcommn.c"
+#include "gxvfeat.c"
 #include "gxvjust.c"
+#include "gxvkern.c"
+#include "gxvlcar.c"
+#include "gxvmod.c"
 #include "gxvmort.c"
 #include "gxvmort0.c"
 #include "gxvmort1.c"
@@ -37,11 +39,9 @@
 #include "gxvmorx2.c"
 #include "gxvmorx4.c"
 #include "gxvmorx5.c"
-#include "gxvkern.c"
 #include "gxvopbd.c"
 #include "gxvprop.c"
-#include "gxvlcar.c"
-#include "gxvmod.c"
+#include "gxvtrak.c"
 
 
 /* END */
diff --git a/src/gxvalid/gxvalid.h b/src/gxvalid/gxvalid.h
index 8c227d0..19f0379 100644
--- a/src/gxvalid/gxvalid.h
+++ b/src/gxvalid/gxvalid.h
@@ -2,9 +2,9 @@
 /*                                                                         */
 /*  gxvalid.h                                                              */
 /*                                                                         */
-/*    TrueTyeeGX/AAT table validation (specification only).                */
+/*    TrueTypeGX/AAT table validation (specification only).                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __GXVALID_H__
-#define __GXVALID_H__
+#ifndef GXVALID_H_
+#define GXVALID_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -102,7 +102,7 @@
 FT_END_HEADER
 
 
-#endif /* __GXVALID_H__ */
+#endif /* GXVALID_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvbsln.c b/src/gxvalid/gxvbsln.c
index 1b17a5d..c367d38 100644
--- a/src/gxvalid/gxvbsln.c
+++ b/src/gxvalid/gxvbsln.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT bsln table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvcommn.c b/src/gxvalid/gxvcommn.c
index 93f6ffb..b966011 100644
--- a/src/gxvalid/gxvcommn.c
+++ b/src/gxvalid/gxvcommn.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common tables validation (body).                      */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -454,7 +454,7 @@
   }
 
 
-  /* ================= Segment Single Format 2 Loolup Table ============== */
+  /* ================= Segment Single Format 2 Lookup Table ============== */
   /*
    * Apple spec says:
    *
@@ -789,7 +789,7 @@
       FT_INVALID_FORMAT;
 
     func = fmt_funcs_table[format];
-    if ( func == NULL )
+    if ( !func )
       FT_INVALID_FORMAT;
 
     func( p, limit, gxvalid );
@@ -900,7 +900,7 @@
     for ( i = 0; i < nnames; i++ )
     {
       if ( FT_Get_Sfnt_Name( gxvalid->face, i, &name ) != FT_Err_Ok )
-        continue ;
+        continue;
 
       if ( name.name_id == name_index )
         goto Out;
@@ -972,7 +972,7 @@
       FT_UShort  i;
 
 
-      ft_memset( nGlyphInClass, 0, 256 );
+      FT_MEM_ZERO( nGlyphInClass, 256 );
 
 
       for ( i = 0; i < nGlyphs; i++ )
@@ -1159,13 +1159,9 @@
       case GXV_GLYPHOFFSET_LONG:
         glyphOffset.l = FT_NEXT_LONG( p );
         break;
-
-      default:
-        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
-        goto Exit;
       }
 
-      if ( NULL != gxvalid->statetable.entry_validate_func )
+      if ( gxvalid->statetable.entry_validate_func )
         gxvalid->statetable.entry_validate_func( state,
                                                  flags,
                                                  &glyphOffset,
@@ -1174,7 +1170,6 @@
                                                  gxvalid );
     }
 
-  Exit:
     *length_p = (FT_UShort)( p - table );
 
     GXV_EXIT;
@@ -1249,10 +1244,10 @@
     if ( stateSize > 0xFF )
       FT_INVALID_DATA;
 
-    if ( gxvalid->statetable.optdata_load_func != NULL )
+    if ( gxvalid->statetable.optdata_load_func )
       gxvalid->statetable.optdata_load_func( p, limit, gxvalid );
 
-    if ( gxvalid->statetable.subtable_setup_func != NULL)
+    if ( gxvalid->statetable.subtable_setup_func )
       setup_func = gxvalid->statetable.subtable_setup_func;
     else
       setup_func = gxv_StateTable_subtable_setup;
@@ -1477,7 +1472,7 @@
     if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit )
       FT_INVALID_TOO_SHORT;
 
-    for (entry = 0; entry <= maxEntry ; entry++ )
+    for (entry = 0; entry <= maxEntry; entry++ )
     {
       FT_UShort                        newState_idx;
       FT_UShort                        flags;
@@ -1539,7 +1534,7 @@
         goto Exit;
       }
 
-      if ( NULL != gxvalid->xstatetable.entry_validate_func )
+      if ( gxvalid->xstatetable.entry_validate_func )
         gxvalid->xstatetable.entry_validate_func( state,
                                                   flags,
                                                   &glyphOffset,
@@ -1596,10 +1591,10 @@
 
     GXV_TRACE(( "StateTable Subtables\n" ));
 
-    if ( gxvalid->xstatetable.optdata_load_func != NULL )
+    if ( gxvalid->xstatetable.optdata_load_func )
       gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid );
 
-    if ( gxvalid->xstatetable.subtable_setup_func != NULL )
+    if ( gxvalid->xstatetable.subtable_setup_func )
       setup_func = gxvalid->xstatetable.subtable_setup_func;
     else
       setup_func = gxv_XStateTable_subtable_setup;
diff --git a/src/gxvalid/gxvcommn.h b/src/gxvalid/gxvcommn.h
index b24608c..8e4ff9c 100644
--- a/src/gxvalid/gxvcommn.h
+++ b/src/gxvalid/gxvcommn.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common tables validation (specification).             */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -39,8 +39,8 @@
    */
 
 
-#ifndef __GXVCOMMN_H__
-#define __GXVCOMMN_H__
+#ifndef GXVCOMMN_H_
+#define GXVCOMMN_H_
 
 
 #include <ft2build.h>
@@ -338,7 +338,7 @@
                                                         \
                                                         \
               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
-                FT_TRACE1(("\\x%02x", *b)) ;            \
+                FT_TRACE1(("\\x%02x", *b));             \
             }                                           \
           FT_END_STMNT
 
@@ -350,9 +350,9 @@
                                                         \
               for ( b = p; b < (FT_Bytes)p + len; b++ ) \
                 if ( 0x40 < *b && *b < 0x7E )           \
-                  FT_TRACE1(("%c", *b)) ;               \
+                  FT_TRACE1(("%c", *b));                \
                 else                                    \
-                  FT_TRACE1(("\\x%02x", *b)) ;          \
+                  FT_TRACE1(("\\x%02x", *b));           \
             }                                           \
           FT_END_STMNT
 
@@ -576,7 +576,7 @@
 
 FT_END_HEADER
 
-#endif /* __GXVCOMMN_H__ */
+#endif /* GXVCOMMN_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxverror.h b/src/gxvalid/gxverror.h
index 6bbc23a..d115125 100644
--- a/src/gxvalid/gxverror.h
+++ b/src/gxvalid/gxverror.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT validation module error codes (specification only).   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -32,12 +32,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __GXVERROR_H__
-#define __GXVERROR_H__
+#ifndef GXVERROR_H_
+#define GXVERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  GXV_Err_
@@ -45,7 +45,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __GXVERROR_H__ */
+#endif /* GXVERROR_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvfeat.c b/src/gxvalid/gxvfeat.c
index 0da9777..2c805d1 100644
--- a/src/gxvalid/gxvfeat.c
+++ b/src/gxvalid/gxvfeat.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT feat table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvfeat.h b/src/gxvalid/gxvfeat.h
index b617df5..2d94380 100644
--- a/src/gxvalid/gxvfeat.h
+++ b/src/gxvalid/gxvfeat.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT feat table validation (specification).                */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __GXVFEAT_H__
-#define __GXVFEAT_H__
+#ifndef GXVFEAT_H_
+#define GXVFEAT_H_
 
 
 #include "gxvalid.h"
@@ -167,7 +167,7 @@
   };
 
 
-#endif /* __GXVFEAT_H__ */
+#endif /* GXVFEAT_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvfgen.c b/src/gxvalid/gxvfgen.c
index 75c5e20..840c0f3 100644
--- a/src/gxvalid/gxvfgen.c
+++ b/src/gxvalid/gxvfgen.c
@@ -5,7 +5,7 @@
 /*    Generate feature registry data for gxv `feat' validator.             */
 /*    This program is derived from gxfeatreg.c in gxlayout.                */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  This file may only be used,                                            */
@@ -21,7 +21,7 @@
 /*  gxfeatreg.c                                                            */
 /*                                                                         */
 /*    Database of font features pre-defined by Apple Computer, Inc.        */
-/*    http://developer.apple.com/fonts/Registry/                           */
+/*    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html */
 /*    (body).                                                              */
 /*                                                                         */
 /*  Copyright 2003 by                                                      */
diff --git a/src/gxvalid/gxvjust.c b/src/gxvalid/gxvjust.c
index 55b44bc..00c4293 100644
--- a/src/gxvalid/gxvjust.c
+++ b/src/gxvalid/gxvjust.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT just table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -152,7 +152,7 @@
                                         FT_Bytes       limit,
                                         GXV_Validator  gxvalid )
   {
-    FT_Bytes  p         = table ;
+    FT_Bytes  p         = table;
     FT_Bytes  wdc_end   = table + GXV_JUST_DATA( wdc_offset_max );
     FT_UInt   i;
 
diff --git a/src/gxvalid/gxvkern.c b/src/gxvalid/gxvkern.c
index f257c03..9c0efd7 100644
--- a/src/gxvalid/gxvkern.c
+++ b/src/gxvalid/gxvkern.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT kern table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -693,7 +693,7 @@
 
     GXV_NAME_ENTER( "validating coverage" );
 
-    GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage ));
+    GXV_TRACE(( "interpret coverage 0x%04x by Apple style\n", coverage ));
 
     if ( KERN_IS_NEW( gxvalid ) )
     {
@@ -728,7 +728,7 @@
       }
     }
 
-    GXV_TRACE(( "cannot interprete coverage, broken kern subtable\n" ));
+    GXV_TRACE(( "cannot interpret coverage, broken kern subtable\n" ));
 
   Exit:
     GXV_EXIT;
diff --git a/src/gxvalid/gxvlcar.c b/src/gxvalid/gxvlcar.c
index af589fd..0f261a9 100644
--- a/src/gxvalid/gxvlcar.c
+++ b/src/gxvalid/gxvlcar.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT lcar table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -114,7 +114,7 @@
     +------ lcar --------------------+
     |                                |
     |      +===============+         |
-    |      | looup header  |         |
+    |      | lookup header |         |
     |      +===============+         |
     |      | BinSrchHeader |         |
     |      +===============+         |
diff --git a/src/gxvalid/gxvmod.c b/src/gxvalid/gxvmod.c
index 17a02e7..1a3c862 100644
--- a/src/gxvalid/gxvmod.c
+++ b/src/gxvalid/gxvmod.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType's TrueTypeGX/AAT validation module implementation (body).   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -235,14 +235,14 @@
   static
   const FT_Service_GXvalidateRec  gxvalid_interface =
   {
-    gxv_validate
+    gxv_validate              /* validate */
   };
 
 
   static
   const FT_Service_CKERNvalidateRec  ckernvalid_interface =
   {
-    classic_kern_validate
+    classic_kern_validate     /* validate */
   };
 
 
@@ -274,11 +274,11 @@
     0x10000L,
     0x20000L,
 
-    0,              /* module-specific interface */
+    NULL,              /* module-specific interface */
 
-    (FT_Module_Constructor)0,
-    (FT_Module_Destructor) 0,
-    (FT_Module_Requester)  gxvalid_get_service
+    (FT_Module_Constructor)NULL,                /* module_init   */
+    (FT_Module_Destructor) NULL,                /* module_done   */
+    (FT_Module_Requester)  gxvalid_get_service  /* get_interface */
   };
 
 
diff --git a/src/gxvalid/gxvmod.h b/src/gxvalid/gxvmod.h
index 1ff2cfc..745c62e 100644
--- a/src/gxvalid/gxvmod.h
+++ b/src/gxvalid/gxvmod.h
@@ -5,7 +5,7 @@
 /*    FreeType's TrueTypeGX/AAT validation module implementation           */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -26,8 +26,8 @@
 /***************************************************************************/
 
 
-#ifndef __GXVMOD_H__
-#define __GXVMOD_H__
+#ifndef GXVMOD_H_
+#define GXVMOD_H_
 
 #include <ft2build.h>
 #include FT_MODULE_H
@@ -45,7 +45,7 @@
 
 FT_END_HEADER
 
-#endif /* __GXVMOD_H__ */
+#endif /* GXVMOD_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvmort.c b/src/gxvalid/gxvmort.c
index a9e7a58..b361cb2 100644
--- a/src/gxvalid/gxvmort.c
+++ b/src/gxvalid/gxvmort.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT mort table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -205,7 +205,7 @@
         FT_INVALID_FORMAT;
 
       func = fmt_funcs_table[type];
-      if ( func == NULL )
+      if ( !func )
         GXV_TRACE(( "morx type %d is reserved\n", type ));
 
       func( p, p + rest, gxvalid );
diff --git a/src/gxvalid/gxvmort.h b/src/gxvalid/gxvmort.h
index c95391b..d803064 100644
--- a/src/gxvalid/gxvmort.h
+++ b/src/gxvalid/gxvmort.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common definition for mort table (specification).     */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __GXVMORT_H__
-#define __GXVMORT_H__
+#ifndef GXVMORT_H_
+#define GXVMORT_H_
 
 #include "gxvalid.h"
 #include "gxvcommn.h"
@@ -88,7 +88,7 @@
                                     GXV_Validator  gxvalid );
 
 
-#endif /* __GXVMORT_H__ */
+#endif /* GXVMORT_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvmort0.c b/src/gxvalid/gxvmort0.c
index 0cace35..95cf53d 100644
--- a/src/gxvalid/gxvmort0.c
+++ b/src/gxvalid/gxvmort0.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type0 (Indic Script Rearrangement) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmort1.c b/src/gxvalid/gxvmort1.c
index aa02df5..a7683a1 100644
--- a/src/gxvalid/gxvmort1.c
+++ b/src/gxvalid/gxvmort1.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type1 (Contextual Substitution) subtable.                   */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -192,7 +192,7 @@
 
 
     GXV_NAME_ENTER( "validating contents of substitutionTable" );
-    for ( i = 0; i < num_gids ; i ++ )
+    for ( i = 0; i < num_gids; i++ )
     {
       FT_UShort  dst_gid;
 
diff --git a/src/gxvalid/gxvmort2.c b/src/gxvalid/gxvmort2.c
index 6f56c94..c23c277 100644
--- a/src/gxvalid/gxvmort2.c
+++ b/src/gxvalid/gxvmort2.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type2 (Ligature Substitution) subtable.                     */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmort4.c b/src/gxvalid/gxvmort4.c
index 535f377..9d21a5f 100644
--- a/src/gxvalid/gxvmort4.c
+++ b/src/gxvalid/gxvmort4.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type4 (Non-Contextual Glyph Substitution) subtable.         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmort5.c b/src/gxvalid/gxvmort5.c
index fb2f915..42cb428 100644
--- a/src/gxvalid/gxvmort5.c
+++ b/src/gxvalid/gxvmort5.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type5 (Contextual Glyph Insertion) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmorx.c b/src/gxvalid/gxvmorx.c
index 1c6b3f2..9fd6e6b 100644
--- a/src/gxvalid/gxvmorx.c
+++ b/src/gxvalid/gxvmorx.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT morx table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -98,7 +98,7 @@
         FT_INVALID_FORMAT;
 
       func = fmt_funcs_table[type];
-      if ( func == NULL )
+      if ( !func )
         GXV_TRACE(( "morx type %d is reserved\n", type ));
 
       func( p, p + rest, gxvalid );
diff --git a/src/gxvalid/gxvmorx.h b/src/gxvalid/gxvmorx.h
index 60efdfd..6d9925e 100644
--- a/src/gxvalid/gxvmorx.h
+++ b/src/gxvalid/gxvmorx.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common definition for morx table (specification).     */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -25,8 +25,8 @@
 /***************************************************************************/
 
 
-#ifndef __GXVMORX_H__
-#define __GXVMORX_H__
+#ifndef GXVMORX_H_
+#define GXVMORX_H_
 
 
 #include "gxvalid.h"
@@ -62,7 +62,7 @@
                                     GXV_Validator  gxvalid );
 
 
-#endif /* __GXVMORX_H__ */
+#endif /* GXVMORX_H_ */
 
 
 /* END */
diff --git a/src/gxvalid/gxvmorx0.c b/src/gxvalid/gxvmorx0.c
index e340baa..302261b 100644
--- a/src/gxvalid/gxvmorx0.c
+++ b/src/gxvalid/gxvmorx0.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type0 (Indic Script Rearrangement) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmorx1.c b/src/gxvalid/gxvmorx1.c
index 7ba2909..890ca74 100644
--- a/src/gxvalid/gxvmorx1.c
+++ b/src/gxvalid/gxvmorx1.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type1 (Contextual Substitution) subtable.                   */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmorx2.c b/src/gxvalid/gxvmorx2.c
index 51e3055..3135031 100644
--- a/src/gxvalid/gxvmorx2.c
+++ b/src/gxvalid/gxvmorx2.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type2 (Ligature Substitution) subtable.                     */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmorx4.c b/src/gxvalid/gxvmorx4.c
index c42677d..1e2397b 100644
--- a/src/gxvalid/gxvmorx4.c
+++ b/src/gxvalid/gxvmorx4.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for "morx" type4 (Non-Contextual Glyph Substitution) subtable.  */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvmorx5.c b/src/gxvalid/gxvmorx5.c
index 7ac872f..db4f929 100644
--- a/src/gxvalid/gxvmorx5.c
+++ b/src/gxvalid/gxvmorx5.c
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type5 (Contextual Glyph Insertion) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvopbd.c b/src/gxvalid/gxvopbd.c
index 7cd5163..e2c167e 100644
--- a/src/gxvalid/gxvopbd.c
+++ b/src/gxvalid/gxvopbd.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT opbd table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvprop.c b/src/gxvalid/gxvprop.c
index ecc3c94..a67b6bd 100644
--- a/src/gxvalid/gxvprop.c
+++ b/src/gxvalid/gxvprop.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT prop table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
diff --git a/src/gxvalid/gxvtrak.c b/src/gxvalid/gxvtrak.c
index c4d29e4..d501b50 100644
--- a/src/gxvalid/gxvtrak.c
+++ b/src/gxvalid/gxvtrak.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT trak table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -111,7 +111,7 @@
 
     GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) );
 
-    for ( i = 0; i < nTracks; i ++ )
+    for ( i = 0; i < nTracks; i++ )
     {
       p = table + i * ( 4 + 2 + 2 );
       track     = FT_NEXT_LONG( p );
@@ -125,7 +125,7 @@
 
       gxv_sfntName_validate( nameIndex, 256, 32767, gxvalid );
 
-      for ( j = i; j < nTracks; j ++ )
+      for ( j = i; j < nTracks; j++ )
       {
          p = table + j * ( 4 + 2 + 2 );
          t = FT_NEXT_LONG( p );
diff --git a/src/gxvalid/module.mk b/src/gxvalid/module.mk
index 1d76494..b64879d 100644
--- a/src/gxvalid/module.mk
+++ b/src/gxvalid/module.mk
@@ -2,7 +2,7 @@
 # FreeType 2 gxvalid module definition
 #
 
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
diff --git a/src/gxvalid/rules.mk b/src/gxvalid/rules.mk
index 44a2d43..3a17c03 100644
--- a/src/gxvalid/rules.mk
+++ b/src/gxvalid/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
diff --git a/src/gzip/Jamfile b/src/gzip/Jamfile
index 0944a5f..a7b4c8c 100644
--- a/src/gzip/Jamfile
+++ b/src/gzip/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/gzip Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/gzip/ftgzip.c b/src/gzip/ftgzip.c
index 879eb88..f8011c2 100644
--- a/src/gzip/ftgzip.c
+++ b/src/gzip/ftgzip.c
@@ -8,7 +8,7 @@
 /*  parse compressed PCF fonts, as found with many X11 server              */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -30,7 +30,7 @@
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  Gzip_Err_
@@ -51,17 +51,29 @@
 
 #else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */
 
- /* In this case, we include our own modified sources of the ZLib    */
- /* within the "ftgzip" component.  The modifications were necessary */
- /* to #include all files without conflicts, as well as preventing   */
- /* the definition of "extern" functions that may cause linking      */
- /* conflicts when a program is linked with both FreeType and the    */
- /* original ZLib.                                                   */
+  /* In this case, we include our own modified sources of the ZLib  */
+  /* within the `gzip' component.  The modifications were necessary */
+  /* to #include all files without conflicts, as well as preventing */
+  /* the definition of `extern' functions that may cause linking    */
+  /* conflicts when a program is linked with both FreeType and the  */
+  /* original ZLib.                                                 */
 
 #ifndef USE_ZLIB_ZCALLOC
-#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */
+#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutil.c */
 #endif
 
+  /* Note that our `zlib.h' includes `ftzconf.h' instead of `zconf.h'; */
+  /* the main reason is that even a global `zlib.h' includes `zconf.h' */
+  /* with                                                              */
+  /*                                                                   */
+  /*   #include "zconf.h"                                              */
+  /*                                                                   */
+  /* instead of the expected                                           */
+  /*                                                                   */
+  /*   #include <zconf.h>                                              */
+  /*                                                                   */
+  /* so that configuration with `FT_CONFIG_OPTION_SYSTEM_ZLIB' might   */
+  /* include the wrong `zconf.h' file, leading to errors.              */
 #include "zlib.h"
 
 #undef  SLOW
@@ -305,7 +317,7 @@
     zstream->next_in  = zip->buffer;
 
     if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK ||
-         zstream->next_in == NULL                     )
+         !zstream->next_in                           )
       error = FT_THROW( Invalid_File_Format );
 
   Exit:
@@ -377,7 +389,10 @@
       size = stream->read( stream, stream->pos, zip->input,
                            FT_GZIP_BUFFER_SIZE );
       if ( size == 0 )
+      {
+        zip->limit = zip->cursor;
         return FT_THROW( Invalid_Stream_Operation );
+      }
     }
     else
     {
@@ -386,7 +401,10 @@
         size = FT_GZIP_BUFFER_SIZE;
 
       if ( size == 0 )
+      {
+        zip->limit = zip->cursor;
         return FT_THROW( Invalid_Stream_Operation );
+      }
 
       FT_MEM_COPY( zip->input, stream->base + stream->pos, size );
     }
@@ -433,7 +451,8 @@
       }
       else if ( err != Z_OK )
       {
-        error = FT_THROW( Invalid_Stream_Operation );
+        zip->limit = zip->cursor;
+        error      = FT_THROW( Invalid_Stream_Operation );
         break;
       }
     }
@@ -557,19 +576,22 @@
 
       stream->descriptor.pointer = NULL;
     }
+
+    if ( !stream->read )
+      FT_FREE( stream->base );
   }
 
 
-  static FT_ULong
-  ft_gzip_stream_io( FT_Stream  stream,
-                     FT_ULong   pos,
-                     FT_Byte*   buffer,
-                     FT_ULong   count )
+  static unsigned long
+  ft_gzip_stream_io( FT_Stream       stream,
+                     unsigned long   offset,
+                     unsigned char*  buffer,
+                     unsigned long   count )
   {
     FT_GZipFile  zip = (FT_GZipFile)stream->descriptor.pointer;
 
 
-    return ft_gzip_file_io( zip, pos, buffer, count );
+    return ft_gzip_file_io( zip, offset, buffer, count );
   }
 
 
@@ -584,7 +606,7 @@
     old_pos = stream->pos;
     if ( !FT_Stream_Seek( stream, stream->size - 4 ) )
     {
-      result = FT_Stream_ReadULong( stream, &error );
+      result = FT_Stream_ReadULongLE( stream, &error );
       if ( error )
         result = 0;
 
@@ -681,11 +703,15 @@
         }
         error = FT_Err_Ok;
       }
+
+      if ( zip_size )
+        stream->size = zip_size;
+      else
+        stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
     }
 
-    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
     stream->pos   = 0;
-    stream->base  = 0;
+    stream->base  = NULL;
     stream->read  = ft_gzip_stream_io;
     stream->close = ft_gzip_stream_close;
 
diff --git a/src/gzip/zconf.h b/src/gzip/ftzconf.h
similarity index 100%
rename from src/gzip/zconf.h
rename to src/gzip/ftzconf.h
diff --git a/src/gzip/rules.mk b/src/gzip/rules.mk
index a8f74ec..1a2e48b 100644
--- a/src/gzip/rules.mk
+++ b/src/gzip/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -34,12 +34,13 @@
 
 # gzip support sources
 #
-# All source and header files get loaded by `ftgzip.c' only if SYTEM_ZLIB is
-# not defined (regardless whether we have a `single' or a `multi' build).
+# All source and header files get loaded by `ftgzip.c' only if SYSTEM_ZLIB
+# is not defined (regardless whether we have a `single' or a `multi' build).
 # However, it doesn't harm if we add everything as a dependency
 # unconditionally.
 #
 GZIP_DRV_SRCS := $(GZIP_DIR)/adler32.c  \
+                 $(GZIP_DIR)/ftzconf.h  \
                  $(GZIP_DIR)/infblock.c \
                  $(GZIP_DIR)/infblock.h \
                  $(GZIP_DIR)/infcodes.c \
@@ -50,7 +51,6 @@
                  $(GZIP_DIR)/inftrees.h \
                  $(GZIP_DIR)/infutil.c  \
                  $(GZIP_DIR)/infutil.h  \
-                 $(GZIP_DIR)/zconf.h    \
                  $(GZIP_DIR)/zlib.h     \
                  $(GZIP_DIR)/zutil.c    \
                  $(GZIP_DIR)/zutil.h
diff --git a/src/gzip/zlib.h b/src/gzip/zlib.h
index 50d0d3f..a4e82c6 100644
--- a/src/gzip/zlib.h
+++ b/src/gzip/zlib.h
@@ -31,7 +31,7 @@
 #ifndef _ZLIB_H
 #define _ZLIB_H
 
-#include "zconf.h"
+#include "ftzconf.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -560,7 +560,7 @@
     inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
   if no more input was provided, Z_DATA_ERROR if no flush point has been found,
   or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
-  case, the application may save the current current value of total_in which
+  case, the application may save the current value of total_in which
   indicates where valid compressed data was found. In the error case, the
   application may repeatedly call inflateSync, providing more input each time,
   until success or end of the input data.
diff --git a/src/lzw/Jamfile b/src/lzw/Jamfile
index 91effe2..cb83aa4 100644
--- a/src/lzw/Jamfile
+++ b/src/lzw/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/lzw Jamfile
 #
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/lzw/ftlzw.c b/src/lzw/ftlzw.c
index 5664ff9..cb46f93 100644
--- a/src/lzw/ftlzw.c
+++ b/src/lzw/ftlzw.c
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Albert Chin-A-Young.                                                   */
 /*                                                                         */
 /*  based on code in `src/gzip/ftgzip.c'                                   */
@@ -31,7 +31,7 @@
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  LZW_Err_
@@ -330,16 +330,16 @@
   }
 
 
-  static FT_ULong
-  ft_lzw_stream_io( FT_Stream  stream,
-                    FT_ULong   pos,
-                    FT_Byte*   buffer,
-                    FT_ULong   count )
+  static unsigned long
+  ft_lzw_stream_io( FT_Stream       stream,
+                    unsigned long   offset,
+                    unsigned char*  buffer,
+                    unsigned long   count )
   {
     FT_LZWFile  zip = (FT_LZWFile)stream->descriptor.pointer;
 
 
-    return ft_lzw_file_io( zip, pos, buffer, count );
+    return ft_lzw_file_io( zip, offset, buffer, count );
   }
 
 
diff --git a/src/lzw/ftzopen.c b/src/lzw/ftzopen.c
index f96bb73..2b868ba 100644
--- a/src/lzw/ftzopen.c
+++ b/src/lzw/ftzopen.c
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -42,7 +42,12 @@
     state->buf_total += count;
     state->in_eof     = FT_BOOL( count < state->num_bits );
     state->buf_offset = 0;
-    state->buf_size   = ( state->buf_size << 3 ) - ( state->num_bits - 1 );
+
+    state->buf_size <<= 3;
+    if ( state->buf_size > state->num_bits )
+      state->buf_size -= state->num_bits - 1;
+    else
+      return -1; /* not enough data */
 
     if ( count == 0 )  /* end of file */
       return -1;
@@ -66,7 +71,10 @@
     {
       if ( state->free_ent >= state->free_bits )
       {
-        state->num_bits  = ++num_bits;
+        state->num_bits = ++num_bits;
+        if ( num_bits > LZW_MAX_BITS )
+          return -1;
+
         state->free_bits = state->num_bits < state->max_bits
                            ? (FT_UInt)( ( 1UL << num_bits ) - 256 )
                            : state->max_free + 1;
@@ -366,7 +374,7 @@
       {
         while ( state->stack_top > 0 )
         {
-          --state->stack_top;
+          state->stack_top--;
 
           if ( buffer )
             buffer[result] = state->stack[state->stack_top];
diff --git a/src/lzw/ftzopen.h b/src/lzw/ftzopen.h
index d35e380..4fd267e 100644
--- a/src/lzw/ftzopen.h
+++ b/src/lzw/ftzopen.h
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,8 +19,8 @@
 /*                                                                         */
 /***************************************************************************/
 
-#ifndef __FT_ZOPEN_H__
-#define __FT_ZOPEN_H__
+#ifndef FTZOPEN_H_
+#define FTZOPEN_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -166,7 +166,7 @@
 
 /* */
 
-#endif /* __FT_ZOPEN_H__ */
+#endif /* FTZOPEN_H_ */
 
 
 /* END */
diff --git a/src/lzw/rules.mk b/src/lzw/rules.mk
index ab1c02f..18933c4 100644
--- a/src/lzw/rules.mk
+++ b/src/lzw/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # Albert Chin-A-Young.
 #
 # based on `src/lzw/rules.mk'
diff --git a/src/otvalid/Jamfile b/src/otvalid/Jamfile
index dbc2395..21b8e0c 100644
--- a/src/otvalid/Jamfile
+++ b/src/otvalid/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/otvalid Jamfile
 #
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,15 @@
 
   if $(FT2_MULTI)
   {
-    _sources = otvbase otvcommn otvgdef otvgpos otvgsub otvjstf otvmod otvmath ;
+    _sources = otvbase
+               otvcommn
+               otvgdef
+               otvgpos
+               otvgsub
+               otvjstf
+               otvmath
+               otvmod
+               ;
   }
   else
   {
diff --git a/src/otvalid/module.mk b/src/otvalid/module.mk
index 3d8c0d9..34f3dab 100644
--- a/src/otvalid/module.mk
+++ b/src/otvalid/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/otvalid/otvalid.c b/src/otvalid/otvalid.c
index ca597d7..4423ca1 100644
--- a/src/otvalid/otvalid.c
+++ b/src/otvalid/otvalid.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validator for OpenType tables (body only).                  */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,8 +15,8 @@
 /*                                                                         */
 /***************************************************************************/
 
-#define FT_MAKE_OPTION_SINGLE_OBJECT
 
+#define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
 
 #include "otvbase.c"
@@ -28,4 +28,5 @@
 #include "otvmath.c"
 #include "otvmod.c"
 
+
 /* END */
diff --git a/src/otvalid/otvalid.h b/src/otvalid/otvalid.h
index 3475deb..d7801ab 100644
--- a/src/otvalid/otvalid.h
+++ b/src/otvalid/otvalid.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType table validation (specification only).                      */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __OTVALID_H__
-#define __OTVALID_H__
+#ifndef OTVALID_H_
+#define OTVALID_H_
 
 
 #include <ft2build.h>
@@ -72,7 +72,7 @@
 
 FT_END_HEADER
 
-#endif /* __OTVALID_H__ */
+#endif /* OTVALID_H_ */
 
 
 /* END */
diff --git a/src/otvalid/otvbase.c b/src/otvalid/otvbase.c
index 24038c6..a01d45c 100644
--- a/src/otvalid/otvbase.c
+++ b/src/otvalid/otvbase.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType BASE table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -284,22 +284,41 @@
     OTV_Validator     otvalid = &otvalidrec;
     FT_Bytes          p       = table;
     FT_UInt           table_size;
+    FT_UShort         version;
 
     OTV_OPTIONAL_TABLE( HorizAxis );
     OTV_OPTIONAL_TABLE( VertAxis  );
 
+    OTV_OPTIONAL_TABLE32( itemVarStore );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating BASE table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 6 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
-    table_size = 6;
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 8;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 4 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 8 );
+      table_size += 4;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
 
     OTV_OPTIONAL_OFFSET( HorizAxis );
     OTV_SIZE_CHECK( HorizAxis );
@@ -311,6 +330,14 @@
     if ( VertAxis )
       otv_Axis_validate( table + VertAxis, otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( itemVarStore );
+      OTV_SIZE_CHECK32( itemVarStore );
+      if ( itemVarStore )
+        OTV_TRACE(( "  [omitting itemVarStore validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
diff --git a/src/otvalid/otvcommn.c b/src/otvalid/otvcommn.c
index 103ffba..0ccfb03 100644
--- a/src/otvalid/otvcommn.c
+++ b/src/otvalid/otvcommn.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType common tables validation (body).                            */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -68,7 +68,7 @@
 
         OTV_LIMIT_CHECK( GlyphCount * 2 );        /* GlyphArray */
 
-        for ( i = 0; i < GlyphCount; ++i )
+        for ( i = 0; i < GlyphCount; i++ )
         {
           FT_UInt  gid;
 
@@ -313,19 +313,26 @@
 
     OTV_NAME_ENTER( "Device" );
 
-    OTV_LIMIT_CHECK( 8 );
+    OTV_LIMIT_CHECK( 6 );
     StartSize   = FT_NEXT_USHORT( p );
     EndSize     = FT_NEXT_USHORT( p );
     DeltaFormat = FT_NEXT_USHORT( p );
 
-    if ( DeltaFormat < 1 || DeltaFormat > 3 )
-      FT_INVALID_FORMAT;
+    if ( DeltaFormat == 0x8000U )
+    {
+      /* VariationIndex, nothing to do */
+    }
+    else
+    {
+      if ( DeltaFormat < 1 || DeltaFormat > 3 )
+        FT_INVALID_FORMAT;
 
-    if ( EndSize < StartSize )
-      FT_INVALID_DATA;
+      if ( EndSize < StartSize )
+        FT_INVALID_DATA;
 
-    count = EndSize - StartSize + 1;
-    OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */
+      count = EndSize - StartSize + 1;
+      OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */
+    }
 
     OTV_EXIT;
   }
@@ -347,7 +354,7 @@
                        OTV_Validator  otvalid )
   {
     FT_Bytes           p = table;
-    FT_UInt            LookupType, SubTableCount;
+    FT_UInt            LookupType, LookupFlag, SubTableCount;
     OTV_Validate_Func  validate;
 
 
@@ -355,7 +362,7 @@
 
     OTV_LIMIT_CHECK( 6 );
     LookupType    = FT_NEXT_USHORT( p );
-    p            += 2;                      /* skip LookupFlag */
+    LookupFlag    = FT_NEXT_USHORT( p );
     SubTableCount = FT_NEXT_USHORT( p );
 
     OTV_TRACE(( " (type %d)\n", LookupType ));
@@ -373,6 +380,9 @@
     for ( ; SubTableCount > 0; SubTableCount-- )
       validate( table + FT_NEXT_USHORT( p ), otvalid );
 
+    if ( LookupFlag & 0x10 )
+      OTV_LIMIT_CHECK( 2 );  /* MarkFilteringSet */
+
     OTV_EXIT;
   }
 
diff --git a/src/otvalid/otvcommn.h b/src/otvalid/otvcommn.h
index 3aebf02..a392784 100644
--- a/src/otvalid/otvcommn.h
+++ b/src/otvalid/otvcommn.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType common tables validation (specification).                   */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __OTVCOMMN_H__
-#define __OTVCOMMN_H__
+#ifndef OTVCOMMN_H_
+#define OTVCOMMN_H_
 
 
 #include <ft2build.h>
@@ -67,29 +67,38 @@
 
 
 #undef  FT_INVALID_
-#define FT_INVALID_( _error ) \
+#define FT_INVALID_( _error )                                     \
           ft_validator_error( otvalid->root, FT_THROW( _error ) )
 
 #define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
                                       FT_Bytes   _table ## _p
 
+#define OTV_OPTIONAL_TABLE32( _table )  FT_ULong  _table;       \
+                                        FT_Bytes   _table ## _p
+
 #define OTV_OPTIONAL_OFFSET( _offset )           \
           FT_BEGIN_STMNT                         \
             _offset ## _p = p;                   \
             _offset       = FT_NEXT_USHORT( p ); \
           FT_END_STMNT
 
-#define OTV_LIMIT_CHECK( _count )                    \
-          FT_BEGIN_STMNT                             \
+#define OTV_OPTIONAL_OFFSET32( _offset )        \
+          FT_BEGIN_STMNT                        \
+            _offset ## _p = p;                  \
+            _offset       = FT_NEXT_ULONG( p ); \
+          FT_END_STMNT
+
+#define OTV_LIMIT_CHECK( _count )                      \
+          FT_BEGIN_STMNT                               \
             if ( p + (_count) > otvalid->root->limit ) \
-              FT_INVALID_TOO_SHORT;                  \
+              FT_INVALID_TOO_SHORT;                    \
           FT_END_STMNT
 
 #define OTV_SIZE_CHECK( _size )                                     \
           FT_BEGIN_STMNT                                            \
             if ( _size > 0 && _size < table_size )                  \
             {                                                       \
-              if ( otvalid->root->level == FT_VALIDATE_PARANOID )     \
+              if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
                 FT_INVALID_OFFSET;                                  \
               else                                                  \
               {                                                     \
@@ -102,12 +111,33 @@
                             " set to zero.\n"                       \
                             "\n", #_size ));                        \
                                                                     \
-                /* always assume 16bit entities */                  \
                 _size = pp[0] = pp[1] = 0;                          \
               }                                                     \
             }                                                       \
           FT_END_STMNT
 
+#define OTV_SIZE_CHECK32( _size )                                   \
+          FT_BEGIN_STMNT                                            \
+            if ( _size > 0 && _size < table_size )                  \
+            {                                                       \
+              if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
+                FT_INVALID_OFFSET;                                  \
+              else                                                  \
+              {                                                     \
+                /* strip off `const' */                             \
+                FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
+                                                                    \
+                                                                    \
+                FT_TRACE3(( "\n"                                    \
+                            "Invalid offset to optional table `%s'" \
+                            " set to zero.\n"                       \
+                            "\n", #_size ));                        \
+                                                                    \
+                _size = pp[0] = pp[1] = pp[2] = pp[3] = 0;          \
+              }                                                     \
+            }                                                       \
+          FT_END_STMNT
+
 
 #define  OTV_NAME_(x)  #x
 #define  OTV_NAME(x)   OTV_NAME_(x)
@@ -146,11 +176,11 @@
 
 #define OTV_INIT  otvalid->debug_indent = 0
 
-#define OTV_ENTER                                                              \
-          FT_BEGIN_STMNT                                                       \
-            otvalid->debug_indent += 2;                                        \
-            FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 ));                   \
-            FT_TRACE4(( "%s table\n",                                          \
+#define OTV_ENTER                                                                \
+          FT_BEGIN_STMNT                                                         \
+            otvalid->debug_indent += 2;                                          \
+            FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 ));                     \
+            FT_TRACE4(( "%s table\n",                                            \
                         otvalid->debug_function_name[otvalid->nesting_level] )); \
           FT_END_STMNT
 
@@ -431,7 +461,7 @@
 
 FT_END_HEADER
 
-#endif /* __OTVCOMMN_H__ */
+#endif /* OTVCOMMN_H_ */
 
 
 /* END */
diff --git a/src/otvalid/otverror.h b/src/otvalid/otverror.h
index 214795e..2fcf42e 100644
--- a/src/otvalid/otverror.h
+++ b/src/otvalid/otverror.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType validation module error codes (specification only).         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __OTVERROR_H__
-#define __OTVERROR_H__
+#ifndef OTVERROR_H_
+#define OTVERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  OTV_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __OTVERROR_H__ */
+#endif /* OTVERROR_H_ */
 
 
 /* END */
diff --git a/src/otvalid/otvgdef.c b/src/otvalid/otvgdef.c
index 8269d2f..08f3171 100644
--- a/src/otvalid/otvgdef.c
+++ b/src/otvalid/otvgdef.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GDEF table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -68,7 +68,7 @@
     OTV_LIMIT_CHECK( GlyphCount * 2 );
 
     otvalid->nesting_level++;
-    func          = otvalid->func[otvalid->nesting_level];
+    func            = otvalid->func[otvalid->nesting_level];
     otvalid->extra1 = 0;
 
     for ( ; GlyphCount > 0; GlyphCount-- )
@@ -136,6 +136,40 @@
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                       MARK GLYPH SETS                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MarkGlyphSets_validate( FT_Bytes       table,
+                              OTV_Validator  otvalid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   MarkGlyphSetCount;
+
+
+    OTV_NAME_ENTER( "MarkGlyphSets" );
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 2 );
+    MarkGlyphSetCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (MarkGlyphSetCount = %d)\n", MarkGlyphSetCount ));
+
+    OTV_LIMIT_CHECK( MarkGlyphSetCount * 4 );      /* CoverageOffsets */
+
+    for ( ; MarkGlyphSetCount > 0; MarkGlyphSetCount-- )
+      otv_Coverage_validate( table + FT_NEXT_ULONG( p ), otvalid, -1 );
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                         GDEF TABLE                            *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -152,14 +186,18 @@
   {
     OTV_ValidatorRec  otvalidrec;
     OTV_Validator     otvalid = &otvalidrec;
-    FT_Bytes          p     = table;
+    FT_Bytes          p       = table;
     FT_UInt           table_size;
-    FT_Bool           need_MarkAttachClassDef;
+    FT_UShort         version;
+    FT_Bool           need_MarkAttachClassDef = 1;
 
     OTV_OPTIONAL_TABLE( GlyphClassDef );
     OTV_OPTIONAL_TABLE( AttachListOffset );
     OTV_OPTIONAL_TABLE( LigCaretListOffset );
     OTV_OPTIONAL_TABLE( MarkAttachClassDef );
+    OTV_OPTIONAL_TABLE( MarkGlyphSetsDef );
+
+    OTV_OPTIONAL_TABLE32( itemVarStore );
 
 
     otvalid->root = ftvalid;
@@ -167,24 +205,49 @@
     FT_TRACE3(( "validating GDEF table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 12 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
-    /* MarkAttachClassDef has been added to the OpenType */
-    /* specification without increasing GDEF's version,  */
-    /* so we use this ugly hack to find out whether the  */
-    /* table is needed actually.                         */
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
 
-    need_MarkAttachClassDef = FT_BOOL(
-      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
-      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      /* MarkAttachClassDef has been added to the OpenType */
+      /* specification without increasing GDEF's version,  */
+      /* so we use this ugly hack to find out whether the  */
+      /* table is needed actually.                         */
 
-    if ( need_MarkAttachClassDef )
-      table_size = 12;              /* OpenType >= 1.2 */
-    else
-      table_size = 10;              /* OpenType < 1.2  */
+      need_MarkAttachClassDef = FT_BOOL(
+        otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
+        otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
+
+      if ( need_MarkAttachClassDef )
+      {
+        OTV_LIMIT_CHECK( 8 );
+        table_size += 2;
+      }
+      else
+        OTV_LIMIT_CHECK( 6 );  /* OpenType < 1.2 */
+
+      break;
+
+    case 2:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
+
+    case 3:
+      OTV_LIMIT_CHECK( 14 );
+      table_size += 8;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
 
     otvalid->glyph_count = glyph_count;
 
@@ -217,6 +280,22 @@
         otv_ClassDef_validate( table + MarkAttachClassDef, otvalid );
     }
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET( MarkGlyphSetsDef );
+      OTV_SIZE_CHECK( MarkGlyphSetsDef );
+      if ( MarkGlyphSetsDef )
+        otv_MarkGlyphSets_validate( table + MarkGlyphSetsDef, otvalid );
+    }
+
+    if ( version > 2 )
+    {
+      OTV_OPTIONAL_OFFSET32( itemVarStore );
+      OTV_SIZE_CHECK32( itemVarStore );
+      if ( itemVarStore )
+        OTV_TRACE(( "  [omitting itemVarStore validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
diff --git a/src/otvalid/otvgpos.c b/src/otvalid/otvgpos.c
index 44c43c5..696b35c 100644
--- a/src/otvalid/otvgpos.c
+++ b/src/otvalid/otvgpos.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GPOS table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -130,7 +130,7 @@
     otv_MarkArray_validate( table + Array1, otvalid );
 
     otvalid->nesting_level++;
-    func          = otvalid->func[otvalid->nesting_level];
+    func            = otvalid->func[otvalid->nesting_level];
     otvalid->extra1 = ClassCount;
 
     func( table + Array2, otvalid );
@@ -218,10 +218,6 @@
         OTV_LIMIT_CHECK( 2 );
         OTV_OPTIONAL_OFFSET( device );
 
-        /* XXX: this value is usually too small, especially if the current */
-        /* ValueRecord is part of an array -- getting the correct table    */
-        /* size is probably not worth the trouble                          */
-
         table_size = p - otvalid->extra3;
 
         OTV_SIZE_CHECK( device );
@@ -271,7 +267,7 @@
 
     case 3:
       {
-        FT_UInt   table_size;
+        FT_UInt  table_size;
 
         OTV_OPTIONAL_TABLE( XDeviceTable );
         OTV_OPTIONAL_TABLE( YDeviceTable );
@@ -426,6 +422,8 @@
   /*************************************************************************/
   /*************************************************************************/
 
+  /* sets otvalid->extra3 (pointer to base table) */
+
   static void
   otv_PairSet_validate( FT_Bytes       table,
                         FT_UInt        format1,
@@ -438,6 +436,8 @@
 
     OTV_NAME_ENTER( "PairSet" );
 
+    otvalid->extra3 = table;
+
     OTV_LIMIT_CHECK( 2 );
     PairValueCount = FT_NEXT_USHORT( p );
 
@@ -483,8 +483,6 @@
 
     OTV_TRACE(( " (format %d)\n", PosFormat ));
 
-    otvalid->extra3 = table;
-
     switch ( PosFormat )
     {
     case 1:     /* PairPosFormat1 */
@@ -537,7 +535,9 @@
         otv_ClassDef_validate( table + ClassDef2, otvalid );
 
         OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 *
-                     ( len_value1 + len_value2 ) );
+                         ( len_value1 + len_value2 ) );
+
+        otvalid->extra3 = table;
 
         /* Class1Record */
         for ( ; ClassCount1 > 0; ClassCount1-- )
@@ -985,20 +985,42 @@
   {
     OTV_ValidatorRec  validrec;
     OTV_Validator     otvalid = &validrec;
-    FT_Bytes          p     = table;
+    FT_Bytes          p       = table;
+    FT_UInt           table_size;
+    FT_UShort         version;
     FT_UInt           ScriptList, FeatureList, LookupList;
 
+    OTV_OPTIONAL_TABLE32( featureVariations );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating GPOS table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 10 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 6 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
     ScriptList  = FT_NEXT_USHORT( p );
     FeatureList = FT_NEXT_USHORT( p );
     LookupList  = FT_NEXT_USHORT( p );
@@ -1014,6 +1036,14 @@
     otv_ScriptList_validate( table + ScriptList, table + FeatureList,
                              otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( featureVariations );
+      OTV_SIZE_CHECK32( featureVariations );
+      if ( featureVariations )
+        OTV_TRACE(( "  [omitting featureVariations validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
diff --git a/src/otvalid/otvgpos.h b/src/otvalid/otvgpos.h
index a792bd9..95f9ac3 100644
--- a/src/otvalid/otvgpos.h
+++ b/src/otvalid/otvgpos.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GPOS table validator (specification).                       */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __OTVGPOS_H__
-#define __OTVGPOS_H__
+#ifndef OTVGPOS_H_
+#define OTVGPOS_H_
 
 
 FT_BEGIN_HEADER
@@ -30,7 +30,7 @@
 
 FT_END_HEADER
 
-#endif /* __OTVGPOS_H__ */
+#endif /* OTVGPOS_H_ */
 
 
 /* END */
diff --git a/src/otvalid/otvgsub.c b/src/otvalid/otvgsub.c
index 0f8b02c..d35ea67 100644
--- a/src/otvalid/otvgsub.c
+++ b/src/otvalid/otvgsub.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GSUB table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -552,19 +552,41 @@
     OTV_ValidatorRec  otvalidrec;
     OTV_Validator     otvalid = &otvalidrec;
     FT_Bytes          p       = table;
+    FT_UInt           table_size;
+    FT_UShort         version;
     FT_UInt           ScriptList, FeatureList, LookupList;
 
+    OTV_OPTIONAL_TABLE32( featureVariations );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating GSUB table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 10 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 6 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
     ScriptList  = FT_NEXT_USHORT( p );
     FeatureList = FT_NEXT_USHORT( p );
     LookupList  = FT_NEXT_USHORT( p );
@@ -580,6 +602,14 @@
     otv_ScriptList_validate( table + ScriptList, table + FeatureList,
                              otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( featureVariations );
+      OTV_SIZE_CHECK32( featureVariations );
+      if ( featureVariations )
+        OTV_TRACE(( "  [omitting featureVariations validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
diff --git a/src/otvalid/otvjstf.c b/src/otvalid/otvjstf.c
index fe68a60..94d4af9 100644
--- a/src/otvalid/otvjstf.c
+++ b/src/otvalid/otvjstf.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType JSTF table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/otvalid/otvmath.c b/src/otvalid/otvmath.c
index db3d5f8..b9800f6 100644
--- a/src/otvalid/otvmath.c
+++ b/src/otvalid/otvmath.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType MATH table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  Written by George Williams.                                            */
@@ -60,7 +60,7 @@
     table_size = 2 * ( 56 + 51 );
 
     p += 4 * 2;                 /* First 4 constants have no device tables */
-    for ( i = 0; i < 51; ++i )
+    for ( i = 0; i < 51; i++ )
     {
       p += 2;                                            /* skip the value */
       OTV_OPTIONAL_OFFSET( DeviceTableOffset );
@@ -88,7 +88,7 @@
                                           FT_Int         isItalic )
   {
     FT_Bytes  p = table;
-    FT_UInt   i, cnt, table_size ;
+    FT_UInt   i, cnt, table_size;
 
     OTV_OPTIONAL_TABLE( Coverage );
     OTV_OPTIONAL_TABLE( DeviceTableOffset );
@@ -110,7 +110,7 @@
     OTV_SIZE_CHECK( Coverage );
     otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt );
 
-    for ( i = 0; i < cnt; ++i )
+    for ( i = 0; i < cnt; i++ )
     {
       p += 2;                                            /* Skip the value */
       OTV_OPTIONAL_OFFSET( DeviceTableOffset );
@@ -151,7 +151,7 @@
     table_size = 4 + 4 * cnt;
 
     /* Heights */
-    for ( i = 0; i < cnt; ++i )
+    for ( i = 0; i < cnt; i++ )
     {
       p += 2;                                            /* Skip the value */
       OTV_OPTIONAL_OFFSET( DeviceTableOffset );
@@ -161,7 +161,7 @@
     }
 
     /* One more Kerning value */
-    for ( i = 0; i < cnt + 1; ++i )
+    for ( i = 0; i < cnt + 1; i++ )
     {
       p += 2;                                            /* Skip the value */
       OTV_OPTIONAL_OFFSET( DeviceTableOffset );
@@ -198,9 +198,9 @@
     OTV_SIZE_CHECK( Coverage );
     otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt );
 
-    for ( i = 0; i < cnt; ++i )
+    for ( i = 0; i < cnt; i++ )
     {
-      for ( j = 0; j < 4; ++j )
+      for ( j = 0; j < 4; j++ )
       {
         OTV_OPTIONAL_OFFSET( MKRecordOffset );
         OTV_SIZE_CHECK( MKRecordOffset );
@@ -296,7 +296,7 @@
     if ( DeviceTableOffset )
       otv_Device_validate( table + DeviceTableOffset, otvalid );
 
-    for ( i = 0; i < pcnt; ++i )
+    for ( i = 0; i < pcnt; i++ )
     {
       FT_UInt  gid;
 
@@ -332,7 +332,7 @@
     OTV_LIMIT_CHECK( 4 * vcnt );
     table_size = 4 + 4 * vcnt;
 
-    for ( i = 0; i < vcnt; ++i )
+    for ( i = 0; i < vcnt; i++ )
     {
       FT_UInt  gid;
 
@@ -384,14 +384,14 @@
     if ( HCoverage )
       otv_Coverage_validate( table + HCoverage, otvalid, (FT_Int)hcnt );
 
-    for ( i = 0; i < vcnt; ++i )
+    for ( i = 0; i < vcnt; i++ )
     {
       OTV_OPTIONAL_OFFSET( Offset );
       OTV_SIZE_CHECK( Offset );
       otv_MathGlyphConstruction_validate( table + Offset, otvalid );
     }
 
-    for ( i = 0; i < hcnt; ++i )
+    for ( i = 0; i < hcnt; i++ )
     {
       OTV_OPTIONAL_OFFSET( Offset );
       OTV_SIZE_CHECK( Offset );
diff --git a/src/otvalid/otvmod.c b/src/otvalid/otvmod.c
index 92f8513..89ee449 100644
--- a/src/otvalid/otvmod.c
+++ b/src/otvalid/otvmod.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType's OpenType validation module implementation (body).         */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -240,7 +240,7 @@
   static
   const FT_Service_OTvalidateRec  otvalid_interface =
   {
-    otv_validate
+    otv_validate        /* validate */
   };
 
 
@@ -271,11 +271,11 @@
     0x10000L,
     0x20000L,
 
-    0,              /* module-specific interface */
+    NULL,              /* module-specific interface */
 
-    (FT_Module_Constructor)0,
-    (FT_Module_Destructor) 0,
-    (FT_Module_Requester)  otvalid_get_service
+    (FT_Module_Constructor)NULL,                /* module_init   */
+    (FT_Module_Destructor) NULL,                /* module_done   */
+    (FT_Module_Requester)  otvalid_get_service  /* get_interface */
   };
 
 
diff --git a/src/otvalid/otvmod.h b/src/otvalid/otvmod.h
index c3a0234..6917bcc 100644
--- a/src/otvalid/otvmod.h
+++ b/src/otvalid/otvmod.h
@@ -5,7 +5,7 @@
 /*    FreeType's OpenType validation module implementation                 */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __OTVMOD_H__
-#define __OTVMOD_H__
+#ifndef OTVMOD_H_
+#define OTVMOD_H_
 
 
 #include <ft2build.h>
@@ -37,7 +37,7 @@
 
 FT_END_HEADER
 
-#endif /* __OTVMOD_H__ */
+#endif /* OTVMOD_H_ */
 
 
 /* END */
diff --git a/src/otvalid/rules.mk b/src/otvalid/rules.mk
index 56d749c..d4fc723 100644
--- a/src/otvalid/rules.mk
+++ b/src/otvalid/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2015 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/pcf/Jamfile b/src/pcf/Jamfile
index 8cd90e4..7b92b12 100644
--- a/src/pcf/Jamfile
+++ b/src/pcf/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/pcf Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,10 @@
 
   if $(FT2_MULTI)
   {
-    _sources = pcfdrivr pcfread pcfutil ;
+    _sources = pcfdrivr
+               pcfread
+               pcfutil
+               ;
   }
   else
   {
diff --git a/src/pcf/README b/src/pcf/README
index 10eff15..09ea970 100644
--- a/src/pcf/README
+++ b/src/pcf/README
@@ -41,8 +41,8 @@
 Known problems
 **************
 
-- dealing explicitly with encodings breaks the uniformity of freetype2
-  api.
+- dealing explicitly with encodings breaks the uniformity of FreeType 2
+  API.
 
 - except for encodings properties, client applications have no
   visibility of the PCF_Face object.  This means that applications
diff --git a/src/pcf/pcf.c b/src/pcf/pcf.c
index 11d5b7b..8ffd6e2 100644
--- a/src/pcf/pcf.c
+++ b/src/pcf/pcf.c
@@ -26,11 +26,11 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
-
 #include <ft2build.h>
-#include "pcfutil.c"
-#include "pcfread.c"
+
 #include "pcfdrivr.c"
+#include "pcfread.c"
+#include "pcfutil.c"
+
 
 /* END */
diff --git a/src/pcf/pcf.h b/src/pcf/pcf.h
index c0da503..f0390cb 100644
--- a/src/pcf/pcf.h
+++ b/src/pcf/pcf.h
@@ -25,8 +25,8 @@
 */
 
 
-#ifndef __PCF_H__
-#define __PCF_H__
+#ifndef PCF_H_
+#define PCF_H_
 
 
 #include <ft2build.h>
@@ -163,6 +163,15 @@
   } PCF_FaceRec, *PCF_Face;
 
 
+  typedef struct  PCF_DriverRec_
+  {
+    FT_DriverRec  root;
+
+    FT_Bool  no_long_family_names;
+
+  } PCF_DriverRec, *PCF_Driver;
+
+
   /* macros for pcf font format */
 
 #define LSBFirst  0
@@ -226,12 +235,13 @@
 #define GLYPHPADOPTIONS  4 /* I'm not sure about this */
 
   FT_LOCAL( FT_Error )
-  pcf_load_font( FT_Stream,
-                 PCF_Face );
+  pcf_load_font( FT_Stream  stream,
+                 PCF_Face   face,
+                 FT_Long    face_index );
 
 FT_END_HEADER
 
-#endif /* __PCF_H__ */
+#endif /* PCF_H_ */
 
 
 /* END */
diff --git a/src/pcf/pcfdrivr.c b/src/pcf/pcfdrivr.c
index 552049e..0119d94 100644
--- a/src/pcf/pcfdrivr.c
+++ b/src/pcf/pcfdrivr.c
@@ -49,6 +49,8 @@
 
 #include FT_SERVICE_BDF_H
 #include FT_SERVICE_FONT_FORMAT_H
+#include FT_SERVICE_PROPERTIES_H
+#include FT_DRIVER_H
 
 
   /*************************************************************************/
@@ -271,7 +273,7 @@
 
     FT_TRACE2(( "PCF driver\n" ));
 
-    error = pcf_load_font( stream, face );
+    error = pcf_load_font( stream, face, face_index );
     if ( error )
     {
       PCF_Face_Done( pcfface );
@@ -286,6 +288,7 @@
 
 
         /* this didn't work, try gzip support! */
+        FT_TRACE2(( "  ... try gzip stream\n" ));
         error2 = FT_Stream_OpenGzip( &face->comp_stream, stream );
         if ( FT_ERR_EQ( error2, Unimplemented_Feature ) )
           goto Fail;
@@ -301,6 +304,7 @@
 
 
         /* this didn't work, try LZW support! */
+        FT_TRACE2(( "  ... try LZW stream\n" ));
         error3 = FT_Stream_OpenLZW( &face->comp_stream, stream );
         if ( FT_ERR_EQ( error3, Unimplemented_Feature ) )
           goto Fail;
@@ -316,6 +320,7 @@
 
 
         /* this didn't work, try Bzip2 support! */
+        FT_TRACE2(( "  ... try Bzip2 stream\n" ));
         error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream );
         if ( FT_ERR_EQ( error4, Unimplemented_Feature ) )
           goto Fail;
@@ -332,7 +337,7 @@
 
       stream = pcfface->stream;
 
-      error = pcf_load_font( stream, face );
+      error = pcf_load_font( stream, face, face_index );
       if ( error )
         goto Fail;
 
@@ -345,13 +350,16 @@
 #endif
     }
 
-    /* PCF could not have multiple face in single font file.
-     * XXX: non-zero face_index is already invalid argument, but
-     *      Type1, Type42 driver has a convention to return
+    /* PCF cannot have multiple faces in a single font file.
+     * XXX: A non-zero face_index is already an invalid argument, but
+     *      Type1, Type42 drivers have a convention to return
      *      an invalid argument error when the font could be
      *      opened by the specified driver.
      */
-    if ( face_index > 0 ) {
+    if ( face_index < 0 )
+      goto Exit;
+    else if ( face_index > 0 && ( face_index & 0xFFFF ) > 0 )
+    {
       FT_ERROR(( "PCF_Face_Init: invalid face index\n" ));
       PCF_Face_Done( pcfface );
       return FT_THROW( Invalid_Argument );
@@ -379,7 +387,11 @@
           if ( !ft_strcmp( s, "10646" )                      ||
                ( !ft_strcmp( s, "8859" ) &&
                  !ft_strcmp( face->charset_encoding, "1" ) ) )
-          unicode_charmap = 1;
+            unicode_charmap = 1;
+          /* another name for ASCII */
+          else if ( !ft_strcmp( s, "646.1991" )                 &&
+                    !ft_strcmp( face->charset_encoding, "IRV" ) )
+            unicode_charmap = 1;
         }
       }
 
@@ -401,12 +413,6 @@
         }
 
         error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL );
-
-#if 0
-        /* Select default charmap */
-        if ( pcfface->num_charmaps )
-          pcfface->charmap = pcfface->charmaps[0];
-#endif
       }
     }
 
@@ -430,9 +436,9 @@
 
     FT_Select_Metrics( size->face, strike_index );
 
-    size->metrics.ascender    =  accel->fontAscent << 6;
-    size->metrics.descender   = -accel->fontDescent << 6;
-    size->metrics.max_advance =  accel->maxbounds.characterWidth << 6;
+    size->metrics.ascender    =  accel->fontAscent * 64;
+    size->metrics.descender   = -accel->fontDescent * 64;
+    size->metrics.max_advance =  accel->maxbounds.characterWidth * 64;
 
     return FT_Err_Ok;
   }
@@ -489,8 +495,6 @@
     PCF_Metric  metric;
     FT_ULong    bytes;
 
-    FT_UNUSED( load_flags );
-
 
     FT_TRACE1(( "PCF_Glyph_Load: glyph index %d\n", glyph_index ));
 
@@ -520,11 +524,6 @@
     bitmap->num_grays  = 1;
     bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
 
-    FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n",
-                  PCF_BIT_ORDER( face->bitmapsFormat ),
-                  PCF_BYTE_ORDER( face->bitmapsFormat ),
-                  PCF_GLYPH_PAD( face->bitmapsFormat ) ));
-
     switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) )
     {
     case 1:
@@ -547,6 +546,24 @@
       return FT_THROW( Invalid_File_Format );
     }
 
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = metric->leftSideBearing;
+    slot->bitmap_top  = metric->ascent;
+
+    slot->metrics.horiAdvance  = (FT_Pos)( metric->characterWidth * 64 );
+    slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing * 64 );
+    slot->metrics.horiBearingY = (FT_Pos)( metric->ascent * 64 );
+    slot->metrics.width        = (FT_Pos)( ( metric->rightSideBearing -
+                                             metric->leftSideBearing ) * 64 );
+    slot->metrics.height       = (FT_Pos)( bitmap->rows * 64 );
+
+    ft_synthesize_vertical_metrics( &slot->metrics,
+                                    ( face->accel.fontAscent +
+                                      face->accel.fontDescent ) * 64 );
+
+    if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY )
+      goto Exit;
+
     /* XXX: to do: are there cases that need repadding the bitmap? */
     bytes = (FT_ULong)bitmap->pitch * bitmap->rows;
 
@@ -579,21 +596,6 @@
       }
     }
 
-    slot->format      = FT_GLYPH_FORMAT_BITMAP;
-    slot->bitmap_left = metric->leftSideBearing;
-    slot->bitmap_top  = metric->ascent;
-
-    slot->metrics.horiAdvance  = (FT_Pos)( metric->characterWidth << 6 );
-    slot->metrics.horiBearingX = (FT_Pos)( metric->leftSideBearing << 6 );
-    slot->metrics.horiBearingY = (FT_Pos)( metric->ascent << 6 );
-    slot->metrics.width        = (FT_Pos)( ( metric->rightSideBearing -
-                                             metric->leftSideBearing ) << 6 );
-    slot->metrics.height       = (FT_Pos)( bitmap->rows << 6 );
-
-    ft_synthesize_vertical_metrics( &slot->metrics,
-                                    ( face->accel.fontAscent +
-                                      face->accel.fontDescent ) << 6 );
-
   Exit:
     return error;
   }
@@ -614,7 +616,7 @@
 
 
     prop = pcf_find_property( face, prop_name );
-    if ( prop != NULL )
+    if ( prop )
     {
       if ( prop->isString )
       {
@@ -623,19 +625,23 @@
       }
       else
       {
-        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) )
+        if ( prop->value.l > 0x7FFFFFFFL          ||
+             prop->value.l < ( -1 - 0x7FFFFFFFL ) )
         {
-          FT_TRACE1(( "pcf_get_bdf_property: " ));
-          FT_TRACE1(( "too large integer 0x%x is truncated\n" ));
+          FT_TRACE1(( "pcf_get_bdf_property:" ));
+          FT_TRACE1(( " too large integer 0x%x is truncated\n" ));
         }
-        /* Apparently, the PCF driver loads all properties as signed integers!
-         * This really doesn't seem to be a problem, because this is
-         * sufficient for any meaningful values.
+
+        /*
+         *  The PCF driver loads all properties as signed integers.
+         *  This really doesn't seem to be a problem, because this is
+         *  sufficient for any meaningful values.
          */
         aproperty->type      = BDF_PROPERTY_TYPE_INTEGER;
         aproperty->u.integer = (FT_Int32)prop->value.l;
       }
-      return 0;
+
+      return FT_Err_Ok;
     }
 
     return FT_THROW( Invalid_Argument );
@@ -650,17 +656,127 @@
     *acharset_encoding = face->charset_encoding;
     *acharset_registry = face->charset_registry;
 
-    return 0;
+    return FT_Err_Ok;
   }
 
 
   static const FT_Service_BDFRec  pcf_service_bdf =
   {
-    (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id,
-    (FT_BDF_GetPropertyFunc) pcf_get_bdf_property
+    (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id,     /* get_charset_id */
+    (FT_BDF_GetPropertyFunc) pcf_get_bdf_property    /* get_property   */
   };
 
 
+  /*
+   *  PROPERTY SERVICE
+   *
+   */
+  static FT_Error
+  pcf_property_set( FT_Module    module,         /* PCF_Driver */
+                    const char*  property_name,
+                    const void*  value,
+                    FT_Bool      value_is_string )
+  {
+#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES
+
+    FT_Error    error  = FT_Err_Ok;
+    PCF_Driver  driver = (PCF_Driver)module;
+
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
+
+    if ( !ft_strcmp( property_name, "no-long-family-names" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         lfn = ft_strtol( s, NULL, 10 );
+
+
+        if ( lfn == 0 )
+          driver->no_long_family_names = 0;
+        else if ( lfn == 1 )
+          driver->no_long_family_names = 1;
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_long_family_names = (FT_Bool*)value;
+
+
+        driver->no_long_family_names = *no_long_family_names;
+      }
+
+      return error;
+    }
+
+#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+    FT_UNUSED( module );
+    FT_UNUSED( value );
+    FT_UNUSED( value_is_string );
+#ifndef FT_DEBUG_LEVEL_TRACE
+    FT_UNUSED( property_name );
+#endif
+
+#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+    FT_TRACE0(( "pcf_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  static FT_Error
+  pcf_property_get( FT_Module    module,         /* PCF_Driver */
+                    const char*  property_name,
+                    const void*  value )
+  {
+#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES
+
+    FT_Error    error  = FT_Err_Ok;
+    PCF_Driver  driver = (PCF_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "no-long-family-names" ) )
+    {
+      FT_Bool   no_long_family_names = driver->no_long_family_names;
+      FT_Bool*  val                  = (FT_Bool*)value;
+
+
+      *val = no_long_family_names;
+
+      return error;
+    }
+
+#else /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+    FT_UNUSED( module );
+    FT_UNUSED( value );
+#ifndef FT_DEBUG_LEVEL_TRACE
+    FT_UNUSED( property_name );
+#endif
+
+#endif /* !PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+    FT_TRACE0(( "pcf_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    pcf_service_properties,
+
+    (FT_Properties_SetFunc)pcf_property_set,      /* set_property */
+    (FT_Properties_GetFunc)pcf_property_get )     /* get_property */
+
+
  /*
   *
   *  SERVICE LIST
@@ -671,6 +787,7 @@
   {
     { FT_SERVICE_ID_BDF,         &pcf_service_bdf },
     { FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_PCF },
+    { FT_SERVICE_ID_PROPERTIES,  &pcf_service_properties },
     { NULL, NULL }
   };
 
@@ -685,44 +802,67 @@
   }
 
 
+  FT_CALLBACK_DEF( FT_Error )
+  pcf_driver_init( FT_Module  module )      /* PCF_Driver */
+  {
+#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES
+    PCF_Driver  driver = (PCF_Driver)module;
+
+
+    driver->no_long_family_names = 0;
+#else
+    FT_UNUSED( module );
+#endif
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  pcf_driver_done( FT_Module  module )      /* PCF_Driver */
+  {
+    FT_UNUSED( module );
+  }
+
+
   FT_CALLBACK_TABLE_DEF
   const FT_Driver_ClassRec  pcf_driver_class =
   {
     {
       FT_MODULE_FONT_DRIVER        |
       FT_MODULE_DRIVER_NO_OUTLINES,
-      sizeof ( FT_DriverRec ),
 
+      sizeof ( PCF_DriverRec ),
       "pcf",
       0x10000L,
       0x20000L,
 
-      0,
+      NULL,   /* module-specific interface */
 
-      0,                    /* FT_Module_Constructor */
-      0,                    /* FT_Module_Destructor  */
-      pcf_driver_requester
+      pcf_driver_init,          /* FT_Module_Constructor  module_init   */
+      pcf_driver_done,          /* FT_Module_Destructor   module_done   */
+      pcf_driver_requester      /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( PCF_FaceRec ),
     sizeof ( FT_SizeRec ),
     sizeof ( FT_GlyphSlotRec ),
 
-    PCF_Face_Init,
-    PCF_Face_Done,
-    0,                      /* FT_Size_InitFunc */
-    0,                      /* FT_Size_DoneFunc */
-    0,                      /* FT_Slot_InitFunc */
-    0,                      /* FT_Slot_DoneFunc */
+    PCF_Face_Init,              /* FT_Face_InitFunc  init_face */
+    PCF_Face_Done,              /* FT_Face_DoneFunc  done_face */
+    NULL,                       /* FT_Size_InitFunc  init_size */
+    NULL,                       /* FT_Size_DoneFunc  done_size */
+    NULL,                       /* FT_Slot_InitFunc  init_slot */
+    NULL,                       /* FT_Slot_DoneFunc  done_slot */
 
-    PCF_Glyph_Load,
+    PCF_Glyph_Load,             /* FT_Slot_LoadFunc  load_glyph */
 
-    0,                      /* FT_Face_GetKerningFunc  */
-    0,                      /* FT_Face_AttachFunc      */
-    0,                      /* FT_Face_GetAdvancesFunc */
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
 
-    PCF_Size_Request,
-    PCF_Size_Select
+    PCF_Size_Request,           /* FT_Size_RequestFunc  request_size */
+    PCF_Size_Select             /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/pcf/pcfdrivr.h b/src/pcf/pcfdrivr.h
index 5461495..29d3049 100644
--- a/src/pcf/pcfdrivr.h
+++ b/src/pcf/pcfdrivr.h
@@ -25,8 +25,8 @@
 */
 
 
-#ifndef __PCFDRIVR_H__
-#define __PCFDRIVR_H__
+#ifndef PCFDRIVR_H_
+#define PCFDRIVR_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_DRIVER_H
@@ -42,7 +42,7 @@
 FT_END_HEADER
 
 
-#endif /* __PCFDRIVR_H__ */
+#endif /* PCFDRIVR_H_ */
 
 
 /* END */
diff --git a/src/pcf/pcferror.h b/src/pcf/pcferror.h
index e51fff8..add8ef2 100644
--- a/src/pcf/pcferror.h
+++ b/src/pcf/pcferror.h
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __PCFERROR_H__
-#define __PCFERROR_H__
+#ifndef PCFERROR_H_
+#define PCFERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  PCF_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __PCFERROR_H__ */
+#endif /* PCFERROR_H_ */
 
 
 /* END */
diff --git a/src/pcf/pcfread.c b/src/pcf/pcfread.c
index 039af33..537da0d 100644
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -50,8 +50,15 @@
 #ifdef FT_DEBUG_LEVEL_TRACE
   static const char* const  tableNames[] =
   {
-    "prop", "accl", "mtrcs", "bmps", "imtrcs",
-    "enc", "swidth", "names", "accel"
+    "properties",
+    "accelerators",
+    "metrics",
+    "bitmaps",
+    "ink metrics",
+    "encodings",
+    "swidths",
+    "glyph names",
+    "BDF accelerators"
   };
 #endif
 
@@ -102,13 +109,27 @@
          FT_STREAM_READ_FIELDS( pcf_toc_header, toc ) )
       return FT_THROW( Cannot_Open_Resource );
 
-    if ( toc->version != PCF_FILE_VERSION                 ||
-         toc->count   >  FT_ARRAY_MAX( face->toc.tables ) ||
-         toc->count   == 0                                )
+    if ( toc->version != PCF_FILE_VERSION ||
+         toc->count   == 0                )
       return FT_THROW( Invalid_File_Format );
 
+    if ( stream->size < 16 )
+      return FT_THROW( Invalid_File_Format );
+
+    /* we need 16 bytes per TOC entry, */
+    /* and there can be most 9 tables  */
+    if ( toc->count > ( stream->size >> 4 ) ||
+         toc->count > 9                     )
+    {
+      FT_TRACE0(( "pcf_read_TOC: adjusting number of tables"
+                  " (from %d to %d)\n",
+                  toc->count,
+                  FT_MIN( stream->size >> 4, 9 ) ));
+      toc->count = FT_MIN( stream->size >> 4, 9 );
+    }
+
     if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) )
-      return FT_THROW( Out_Of_Memory );
+      return error;
 
     tables = face->toc.tables;
     for ( n = 0; n < toc->count; n++ )
@@ -221,8 +242,8 @@
           if ( tables[i].type == (FT_UInt)( 1 << j ) )
             name = tableNames[j];
 
-        FT_TRACE4(( "  %d: type=%s, format=0x%X, "
-                    "size=%ld (0x%lX), offset=%ld (0x%lX)\n",
+        FT_TRACE4(( "  %d: type=%s, format=0x%X,"
+                    " size=%ld (0x%lX), offset=%ld (0x%lX)\n",
                     i, name,
                     tables[i].format,
                     tables[i].size, tables[i].size,
@@ -308,7 +329,7 @@
 
 
       /* parsing normal metrics */
-      fields = PCF_BYTE_ORDER( format ) == MSBFirst
+      fields = ( PCF_BYTE_ORDER( format ) == MSBFirst )
                ? pcf_metric_msb_header
                : pcf_metric_header;
 
@@ -332,6 +353,17 @@
       metric->attributes       = 0;
     }
 
+    FT_TRACE5(( " width=%d,"
+                " lsb=%d, rsb=%d,"
+                " ascent=%d, descent=%d,"
+                " attributes=%d\n",
+                metric->characterWidth,
+                metric->leftSideBearing,
+                metric->rightSideBearing,
+                metric->ascent,
+                metric->descent,
+                metric->attributes ));
+
   Exit:
     return error;
   }
@@ -431,7 +463,7 @@
     int           i;
 
 
-    for ( i = 0 ; i < face->nprops && !found; i++ )
+    for ( i = 0; i < face->nprops && !found; i++ )
     {
       if ( !ft_strcmp( properties[i].name, prop ) )
         found = 1;
@@ -450,7 +482,7 @@
   {
     PCF_ParseProperty  props      = NULL;
     PCF_Property       properties = NULL;
-    FT_ULong           nprops, i;
+    FT_ULong           nprops, orig_nprops, i;
     FT_ULong           format, size;
     FT_Error           error;
     FT_Memory          memory     = FT_FACE( face )->memory;
@@ -470,32 +502,43 @@
     if ( FT_READ_ULONG_LE( format ) )
       goto Bail;
 
-    FT_TRACE4(( "pcf_get_properties:\n" ));
-
-    FT_TRACE4(( "  format = %ld\n", format ));
+    FT_TRACE4(( "pcf_get_properties:\n"
+                "  format: 0x%lX (%s)\n",
+                format,
+                PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" ));
 
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
       goto Bail;
 
     if ( PCF_BYTE_ORDER( format ) == MSBFirst )
-      (void)FT_READ_ULONG( nprops );
+      (void)FT_READ_ULONG( orig_nprops );
     else
-      (void)FT_READ_ULONG_LE( nprops );
+      (void)FT_READ_ULONG_LE( orig_nprops );
     if ( error )
       goto Bail;
 
-    FT_TRACE4(( "  nprop = %d (truncate %d props)\n",
-                (int)nprops, nprops - (FT_ULong)(int)nprops ));
-
-    nprops = (FT_ULong)(int)nprops;
+    FT_TRACE4(( "  number of properties: %ld\n", orig_nprops ));
 
     /* rough estimate */
-    if ( nprops > size / PCF_PROPERTY_SIZE )
+    if ( orig_nprops > size / PCF_PROPERTY_SIZE )
     {
       error = FT_THROW( Invalid_Table );
       goto Bail;
     }
 
+    /* as a heuristic limit to avoid excessive allocation in */
+    /* gzip bombs (i.e., very small, invalid input data that */
+    /* pretends to expand to an insanely large file) we only */
+    /* load the first 256 properties                         */
+    if ( orig_nprops > 256 )
+    {
+      FT_TRACE0(( "pcf_get_properties:"
+                  " only loading first 256 properties\n" ));
+      nprops = 256;
+    }
+    else
+      nprops = orig_nprops;
+
     face->nprops = (int)nprops;
 
     if ( FT_NEW_ARRAY( props, nprops ) )
@@ -515,14 +558,23 @@
       }
     }
 
+    /* this skip will only work if we really have an extremely large */
+    /* number of properties; it will fail for fake data, avoiding an */
+    /* unnecessarily large allocation later on                       */
+    if ( FT_STREAM_SKIP( ( orig_nprops - nprops ) * PCF_PROPERTY_SIZE ) )
+    {
+      error = FT_THROW( Invalid_Stream_Skip );
+      goto Bail;
+    }
+
     /* pad the property array                                            */
     /*                                                                   */
     /* clever here - nprops is the same as the number of odd-units read, */
     /* as only isStringProp are odd length   (Keith Packard)             */
     /*                                                                   */
-    if ( nprops & 3 )
+    if ( orig_nprops & 3 )
     {
-      i = 4 - ( nprops & 3 );
+      i = 4 - ( orig_nprops & 3 );
       if ( FT_STREAM_SKIP( i ) )
       {
         error = FT_THROW( Invalid_Stream_Skip );
@@ -537,15 +589,24 @@
     if ( error )
       goto Bail;
 
-    FT_TRACE4(( "  string_size = %ld\n", string_size ));
+    FT_TRACE4(( "  string size: %ld\n", string_size ));
 
     /* rough estimate */
-    if ( string_size > size - nprops * PCF_PROPERTY_SIZE )
+    if ( string_size > size - orig_nprops * PCF_PROPERTY_SIZE )
     {
       error = FT_THROW( Invalid_Table );
       goto Bail;
     }
 
+    /* the strings in the `strings' array are PostScript strings, */
+    /* which can have a maximum length of 65536 characters each   */
+    if ( string_size > 16777472 )   /* 256 * (65536 + 1) */
+    {
+      FT_TRACE0(( "pcf_get_properties:"
+                  " loading only 16777472 bytes of strings array\n" ));
+      string_size = 16777472;
+    }
+
     /* allocate one more byte so that we have a final null byte */
     if ( FT_NEW_ARRAY( strings, string_size + 1 ) )
       goto Bail;
@@ -559,6 +620,7 @@
 
     face->properties = properties;
 
+    FT_TRACE4(( "\n" ));
     for ( i = 0; i < nprops; i++ )
     {
       FT_Long  name_offset = props[i].name;
@@ -621,7 +683,7 @@
     FT_Memory   memory  = FT_FACE( face )->memory;
     FT_ULong    format, size;
     PCF_Metric  metrics = NULL;
-    FT_ULong    nmetrics, i;
+    FT_ULong    nmetrics, orig_nmetrics, i;
 
 
     error = pcf_seek_to_table_type( stream,
@@ -636,6 +698,13 @@
     if ( FT_READ_ULONG_LE( format ) )
       goto Bail;
 
+    FT_TRACE4(( "pcf_get_metrics:\n"
+                "  format: 0x%lX (%s, %s)\n",
+                format,
+                PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB",
+                PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) ?
+                  "compressed" : "uncompressed" ));
+
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )     &&
          !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) )
       return FT_THROW( Invalid_File_Format );
@@ -643,61 +712,70 @@
     if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
     {
       if ( PCF_BYTE_ORDER( format ) == MSBFirst )
-        (void)FT_READ_ULONG( nmetrics );
+        (void)FT_READ_ULONG( orig_nmetrics );
       else
-        (void)FT_READ_ULONG_LE( nmetrics );
+        (void)FT_READ_ULONG_LE( orig_nmetrics );
     }
     else
     {
       if ( PCF_BYTE_ORDER( format ) == MSBFirst )
-        (void)FT_READ_USHORT( nmetrics );
+        (void)FT_READ_USHORT( orig_nmetrics );
       else
-        (void)FT_READ_USHORT_LE( nmetrics );
+        (void)FT_READ_USHORT_LE( orig_nmetrics );
     }
     if ( error )
       return FT_THROW( Invalid_File_Format );
 
-    face->nmetrics = nmetrics;
-
-    if ( !nmetrics )
-      return FT_THROW( Invalid_Table );
-
-    FT_TRACE4(( "pcf_get_metrics:\n" ));
-
-    FT_TRACE4(( "  number of metrics: %d\n", nmetrics ));
+    FT_TRACE4(( "  number of metrics: %ld\n", orig_nmetrics ));
 
     /* rough estimate */
     if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
     {
-      if ( nmetrics > size / PCF_METRIC_SIZE )
+      if ( orig_nmetrics > size / PCF_METRIC_SIZE )
         return FT_THROW( Invalid_Table );
     }
     else
     {
-      if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE )
+      if ( orig_nmetrics > size / PCF_COMPRESSED_METRIC_SIZE )
         return FT_THROW( Invalid_Table );
     }
 
+    if ( !orig_nmetrics )
+      return FT_THROW( Invalid_Table );
+
+    /* PCF is a format from ancient times; Unicode was in its       */
+    /* infancy, and widely used two-byte character sets for CJK     */
+    /* scripts (Big 5, GB 2312, JIS X 0208, etc.) did have at most  */
+    /* 15000 characters.  Even the more exotic CNS 11643 and CCCII  */
+    /* standards, which were essentially three-byte character sets, */
+    /* provided less then 65536 assigned characters.                */
+    /*                                                              */
+    /* While technically possible to have a larger number of glyphs */
+    /* in PCF files, we thus limit the number to 65536.             */
+    if ( orig_nmetrics > 65536 )
+    {
+      FT_TRACE0(( "pcf_get_metrics:"
+                  " only loading first 65536 metrics\n" ));
+      nmetrics = 65536;
+    }
+    else
+      nmetrics = orig_nmetrics;
+
+    face->nmetrics = nmetrics;
+
     if ( FT_NEW_ARRAY( face->metrics, nmetrics ) )
-      return FT_THROW( Out_Of_Memory );
+      return error;
 
     metrics = face->metrics;
+
+    FT_TRACE4(( "\n" ));
     for ( i = 0; i < nmetrics; i++, metrics++ )
     {
+      FT_TRACE5(( "  idx %ld:", i ));
       error = pcf_get_metric( stream, format, metrics );
 
       metrics->bits = 0;
 
-      FT_TRACE5(( "  idx %d: width=%d, "
-                  "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n",
-                  i,
-                  metrics->characterWidth,
-                  metrics->leftSideBearing,
-                  metrics->rightSideBearing,
-                  metrics->ascent,
-                  metrics->descent,
-                  metrics->attributes ));
-
       if ( error )
         break;
 
@@ -705,7 +783,7 @@
       /* compute a glyph's bitmap dimensions, thus setting them to zero in */
       /* case of an error disables this particular glyph only              */
       if ( metrics->rightSideBearing < metrics->leftSideBearing ||
-           metrics->ascent + metrics->descent < 0               )
+           metrics->ascent < -metrics->descent                  )
       {
         metrics->characterWidth   = 0;
         metrics->leftSideBearing  = 0;
@@ -735,7 +813,7 @@
     FT_Long*   offsets = NULL;
     FT_Long    bitmapSizes[GLYPHPADOPTIONS];
     FT_ULong   format, size;
-    FT_ULong   nbitmaps, i, sizebitmaps = 0;
+    FT_ULong   nbitmaps, orig_nbitmaps, i, sizebitmaps = 0;
 
 
     error = pcf_seek_to_table_type( stream,
@@ -753,18 +831,42 @@
 
     format = FT_GET_ULONG_LE();
     if ( PCF_BYTE_ORDER( format ) == MSBFirst )
-      nbitmaps  = FT_GET_ULONG();
+      orig_nbitmaps = FT_GET_ULONG();
     else
-      nbitmaps  = FT_GET_ULONG_LE();
+      orig_nbitmaps = FT_GET_ULONG_LE();
 
     FT_Stream_ExitFrame( stream );
 
+    FT_TRACE4(( "pcf_get_bitmaps:\n"
+                "  format: 0x%lX\n"
+                "          (%s, %s,\n"
+                "           padding=%d bit%s, scanning=%d bit%s)\n",
+                format,
+                PCF_BYTE_ORDER( format ) == MSBFirst
+                  ? "most significant byte first"
+                  : "least significant byte first",
+                PCF_BIT_ORDER( format ) == MSBFirst
+                  ? "most significant bit first"
+                  : "least significant bit first",
+                8 << PCF_GLYPH_PAD_INDEX( format ),
+                ( 8 << PCF_GLYPH_PAD_INDEX( format ) ) == 1 ? "" : "s",
+                8 << PCF_SCAN_UNIT_INDEX( format ),
+                ( 8 << PCF_SCAN_UNIT_INDEX( format ) ) == 1 ? "" : "s" ));
+
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
       return FT_THROW( Invalid_File_Format );
 
-    FT_TRACE4(( "pcf_get_bitmaps:\n" ));
+    FT_TRACE4(( "  number of bitmaps: %ld\n", orig_nbitmaps ));
 
-    FT_TRACE4(( "  number of bitmaps: %d\n", nbitmaps ));
+    /* see comment in `pcf_get_metrics' */
+    if ( orig_nbitmaps > 65536 )
+    {
+      FT_TRACE0(( "pcf_get_bitmaps:"
+                  " only loading first 65536 bitmaps\n" ));
+      nbitmaps = 65536;
+    }
+    else
+      nbitmaps = orig_nbitmaps;
 
     if ( nbitmaps != face->nmetrics )
       return FT_THROW( Invalid_File_Format );
@@ -772,6 +874,7 @@
     if ( FT_NEW_ARRAY( offsets, nbitmaps ) )
       return error;
 
+    FT_TRACE5(( "\n" ));
     for ( i = 0; i < nbitmaps; i++ )
     {
       if ( PCF_BYTE_ORDER( format ) == MSBFirst )
@@ -779,7 +882,7 @@
       else
         (void)FT_READ_LONG_LE( offsets[i] );
 
-      FT_TRACE5(( "  bitmap %d: offset %ld (0x%lX)\n",
+      FT_TRACE5(( "  bitmap %ld: offset %ld (0x%lX)\n",
                   i, offsets[i], offsets[i] ));
     }
     if ( error )
@@ -796,17 +899,19 @@
 
       sizebitmaps = (FT_ULong)bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];
 
-      FT_TRACE4(( "  padding %d implies a size of %ld\n",
-                  i, bitmapSizes[i] ));
+      FT_TRACE4(( "  %ld-bit padding implies a size of %ld\n",
+                  8 << i, bitmapSizes[i] ));
     }
 
-    FT_TRACE4(( "  %d bitmaps, padding index %ld\n",
+    FT_TRACE4(( "  %ld bitmaps, using %ld-bit padding\n",
                 nbitmaps,
-                PCF_GLYPH_PAD_INDEX( format ) ));
-    FT_TRACE4(( "  bitmap size = %d\n", sizebitmaps ));
+                8 << PCF_GLYPH_PAD_INDEX( format ) ));
+    FT_TRACE4(( "  bitmap size: %ld\n", sizebitmaps ));
 
     FT_UNUSED( sizebitmaps );       /* only used for debugging */
 
+    /* right now, we only check the bitmap offsets; */
+    /* actual bitmaps are only loaded on demand     */
     for ( i = 0; i < nbitmaps; i++ )
     {
       /* rough estimate */
@@ -814,7 +919,7 @@
            ( (FT_ULong)offsets[i] > size ) )
       {
         FT_TRACE0(( "pcf_get_bitmaps:"
-                    " invalid offset to bitmap data of glyph %d\n", i ));
+                    " invalid offset to bitmap data of glyph %ld\n", i ));
       }
       else
         face->metrics[i].bits = stream->pos + (FT_ULong)offsets[i];
@@ -838,7 +943,7 @@
     int           firstCol, lastCol;
     int           firstRow, lastRow;
     FT_ULong      nencoding;
-    int           encodingOffset;
+    FT_UShort     encodingOffset;
     int           i, j;
     FT_ULong      k;
     PCF_Encoding  encoding = NULL;
@@ -878,10 +983,20 @@
 
     FT_Stream_ExitFrame( stream );
 
+    FT_TRACE4(( "pcf_get_encodings:\n"
+                "  format: 0x%lX (%s)\n",
+                format,
+                PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB" ));
+
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
       return FT_THROW( Invalid_File_Format );
 
-    /* sanity checks */
+    FT_TRACE4(( "  firstCol 0x%X, lastCol 0x%X\n"
+                "  firstRow 0x%X, lastRow 0x%X\n",
+                firstCol, lastCol,
+                firstRow, lastRow ));
+
+    /* sanity checks; we limit numbers of rows and columns to 256 */
     if ( firstCol < 0       ||
          firstCol > lastCol ||
          lastCol  > 0xFF    ||
@@ -890,35 +1005,36 @@
          lastRow  > 0xFF    )
       return FT_THROW( Invalid_Table );
 
-    FT_TRACE4(( "pdf_get_encodings:\n" ));
-
-    FT_TRACE4(( "  firstCol %d, lastCol %d, firstRow %d, lastRow %d\n",
-                firstCol, lastCol, firstRow, lastRow ));
-
     nencoding = (FT_ULong)( lastCol - firstCol + 1 ) *
                 (FT_ULong)( lastRow - firstRow + 1 );
 
     if ( FT_NEW_ARRAY( encoding, nencoding ) )
-      return FT_THROW( Out_Of_Memory );
+      return error;
 
     error = FT_Stream_EnterFrame( stream, 2 * nencoding );
     if ( error )
       goto Bail;
 
+    FT_TRACE5(( "\n" ));
+
     k = 0;
     for ( i = firstRow; i <= lastRow; i++ )
     {
       for ( j = firstCol; j <= lastCol; j++ )
       {
+        /* X11's reference implementation uses the equivalent to  */
+        /* `FT_GET_SHORT', however PCF fonts with more than 32768 */
+        /* characters (e.g. `unifont.pcf') clearly show that an   */
+        /* unsigned value is needed.                              */
         if ( PCF_BYTE_ORDER( format ) == MSBFirst )
-          encodingOffset = FT_GET_SHORT();
+          encodingOffset = FT_GET_USHORT();
         else
-          encodingOffset = FT_GET_SHORT_LE();
+          encodingOffset = FT_GET_USHORT_LE();
 
-        if ( encodingOffset > -1 )
+        if ( encodingOffset != 0xFFFFU )
         {
           encoding[k].enc   = i * 256 + j;
-          encoding[k].glyph = (FT_UShort)encodingOffset;
+          encoding[k].glyph = encodingOffset;
 
           FT_TRACE5(( "  code %d (0x%04X): idx %d\n",
                       encoding[k].enc, encoding[k].enc, encoding[k].glyph ));
@@ -1009,6 +1125,15 @@
     if ( FT_READ_ULONG_LE( format ) )
       goto Bail;
 
+    FT_TRACE4(( "pcf_get_accel%s:\n"
+                "  format: 0x%lX (%s, %s)\n",
+                type == PCF_BDF_ACCELERATORS ? " (getting BDF accelerators)"
+                                             : "",
+                format,
+                PCF_BYTE_ORDER( format ) == MSBFirst ? "MSB" : "LSB",
+                PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) ?
+                  "accelerated" : "not accelerated" ));
+
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )    &&
          !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )
       goto Bail;
@@ -1024,12 +1149,43 @@
         goto Bail;
     }
 
+    FT_TRACE5(( "  noOverlap=%s, constantMetrics=%s,"
+                " terminalFont=%s, constantWidth=%s\n"
+                "  inkInside=%s, inkMetrics=%s, drawDirection=%s\n"
+                "  fontAscent=%ld, fontDescent=%ld, maxOverlap=%ld\n",
+                accel->noOverlap ? "yes" : "no",
+                accel->constantMetrics ? "yes" : "no",
+                accel->terminalFont ? "yes" : "no",
+                accel->constantWidth ? "yes" : "no",
+                accel->inkInside ? "yes" : "no",
+                accel->inkMetrics ? "yes" : "no",
+                accel->drawDirection ? "RTL" : "LTR",
+                accel->fontAscent,
+                accel->fontDescent,
+                accel->maxOverlap ));
+
+    /* sanity checks */
+    if ( FT_ABS( accel->fontAscent ) > 0x7FFF )
+    {
+      accel->fontAscent = accel->fontAscent < 0 ? -0x7FFF : 0x7FFF;
+      FT_TRACE0(( "pfc_get_accel: clamping font ascent to value %d\n",
+                  accel->fontAscent ));
+    }
+    if ( FT_ABS( accel->fontDescent ) > 0x7FFF )
+    {
+      accel->fontDescent = accel->fontDescent < 0 ? -0x7FFF : 0x7FFF;
+      FT_TRACE0(( "pfc_get_accel: clamping font descent to value %d\n",
+                  accel->fontDescent ));
+    }
+
+    FT_TRACE5(( "  minbounds:" ));
     error = pcf_get_metric( stream,
                             format & ( ~PCF_FORMAT_MASK ),
                             &(accel->minbounds) );
     if ( error )
       goto Bail;
 
+    FT_TRACE5(( "  maxbounds:" ));
     error = pcf_get_metric( stream,
                             format & ( ~PCF_FORMAT_MASK ),
                             &(accel->maxbounds) );
@@ -1038,12 +1194,14 @@
 
     if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )
     {
+      FT_TRACE5(( "  ink minbounds:" ));
       error = pcf_get_metric( stream,
                               format & ( ~PCF_FORMAT_MASK ),
                               &(accel->ink_minbounds) );
       if ( error )
         goto Bail;
 
+      FT_TRACE5(( "  ink maxbounds:" ));
       error = pcf_get_metric( stream,
                               format & ( ~PCF_FORMAT_MASK ),
                               &(accel->ink_maxbounds) );
@@ -1052,7 +1210,7 @@
     }
     else
     {
-      accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */
+      accel->ink_minbounds = accel->minbounds;
       accel->ink_maxbounds = accel->maxbounds;
     }
 
@@ -1141,7 +1299,7 @@
 
         len = lengths[nn];
 
-        if ( src == NULL )
+        if ( !src )
           continue;
 
         /* separate elements with a space */
@@ -1173,8 +1331,10 @@
 
   FT_LOCAL_DEF( FT_Error )
   pcf_load_font( FT_Stream  stream,
-                 PCF_Face   face )
+                 PCF_Face   face,
+                 FT_Long    face_index )
   {
+    FT_Face    root   = FT_FACE( face );
     FT_Error   error;
     FT_Memory  memory = FT_FACE( face )->memory;
     FT_Bool    hasBDFAccelerators;
@@ -1184,6 +1344,13 @@
     if ( error )
       goto Exit;
 
+    root->num_faces  = 1;
+    root->face_index = 0;
+
+    /* If we are performing a simple font format check, exit immediately. */
+    if ( face_index < 0 )
+      return FT_Err_Ok;
+
     error = pcf_get_properties( stream, face );
     if ( error )
       goto Exit;
@@ -1226,13 +1393,9 @@
 
     /* now construct the face object */
     {
-      FT_Face       root = FT_FACE( face );
       PCF_Property  prop;
 
 
-      root->num_faces  = 1;
-      root->face_index = 0;
-
       root->face_flags |= FT_FACE_FLAG_FIXED_SIZES |
                           FT_FACE_FLAG_HORIZONTAL  |
                           FT_FACE_FLAG_FAST_GLYPHS;
@@ -1240,14 +1403,81 @@
       if ( face->accel.constantWidth )
         root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
-      if ( ( error = pcf_interpret_style( face ) ) != 0 )
-         goto Exit;
+      if ( FT_SET_ERROR( pcf_interpret_style( face ) ) )
+        goto Exit;
 
       prop = pcf_find_property( face, "FAMILY_NAME" );
       if ( prop && prop->isString )
       {
-        if ( FT_STRDUP( root->family_name, prop->value.atom ) )
-          goto Exit;
+
+#ifdef PCF_CONFIG_OPTION_LONG_FAMILY_NAMES
+
+        PCF_Driver  driver = (PCF_Driver)FT_FACE_DRIVER( face );
+
+
+        if ( !driver->no_long_family_names )
+        {
+          /* Prepend the foundry name plus a space to the family name.     */
+          /* There are many fonts just called `Fixed' which look           */
+          /* completely different, and which have nothing to do with each  */
+          /* other.  When selecting `Fixed' in KDE or Gnome one gets       */
+          /* results that appear rather random, the style changes often if */
+          /* one changes the size and one cannot select some fonts at all. */
+          /*                                                               */
+          /* We also check whether we have `wide' characters; all put      */
+          /* together, we get family names like `Sony Fixed' or `Misc      */
+          /* Fixed Wide'.                                                  */
+
+          PCF_Property  foundry_prop, point_size_prop, average_width_prop;
+
+          int  l    = ft_strlen( prop->value.atom ) + 1;
+          int  wide = 0;
+
+
+          foundry_prop       = pcf_find_property( face, "FOUNDRY" );
+          point_size_prop    = pcf_find_property( face, "POINT_SIZE" );
+          average_width_prop = pcf_find_property( face, "AVERAGE_WIDTH" );
+
+          if ( point_size_prop && average_width_prop )
+          {
+            if ( average_width_prop->value.l >= point_size_prop->value.l )
+            {
+              /* This font is at least square shaped or even wider */
+              wide = 1;
+              l   += ft_strlen( " Wide" );
+            }
+          }
+
+          if ( foundry_prop && foundry_prop->isString )
+          {
+            l += ft_strlen( foundry_prop->value.atom ) + 1;
+
+            if ( FT_NEW_ARRAY( root->family_name, l ) )
+              goto Exit;
+
+            ft_strcpy( root->family_name, foundry_prop->value.atom );
+            ft_strcat( root->family_name, " " );
+            ft_strcat( root->family_name, prop->value.atom );
+          }
+          else
+          {
+            if ( FT_NEW_ARRAY( root->family_name, l ) )
+              goto Exit;
+
+            ft_strcpy( root->family_name, prop->value.atom );
+          }
+
+          if ( wide )
+            ft_strcat( root->family_name, " Wide" );
+        }
+        else
+
+#endif /* PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */
+
+        {
+          if ( FT_STRDUP( root->family_name, prop->value.atom ) )
+            goto Exit;
+        }
       }
       else
         root->family_name = NULL;
@@ -1270,46 +1500,132 @@
         FT_Short         resolution_x = 0, resolution_y = 0;
 
 
-        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
+        FT_ZERO( bsize );
+
+        /* for simplicity, we take absolute values of integer properties */
 
 #if 0
         bsize->height = face->accel.maxbounds.ascent << 6;
 #endif
-        bsize->height = (FT_Short)( face->accel.fontAscent +
-                                    face->accel.fontDescent );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( face->accel.fontAscent + face->accel.fontDescent < 0 )
+          FT_TRACE0(( "pcf_load_font: negative height\n" ));
+#endif
+        if ( FT_ABS( face->accel.fontAscent +
+                     face->accel.fontDescent ) > 0x7FFF )
+        {
+          bsize->height = 0x7FFF;
+          FT_TRACE0(( "pcf_load_font: clamping height to value %d\n",
+                      bsize->height ));
+        }
+        else
+          bsize->height = FT_ABS( (FT_Short)( face->accel.fontAscent +
+                                              face->accel.fontDescent ) );
 
         prop = pcf_find_property( face, "AVERAGE_WIDTH" );
         if ( prop )
-          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "pcf_load_font: negative average width\n" ));
+#endif
+          if ( ( FT_ABS( prop->value.l ) > 0x7FFFL * 10 - 5 ) )
+          {
+            bsize->width = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping average width to value %d\n",
+                        bsize->width ));
+          }
+          else
+            bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) );
+        }
         else
-          bsize->width = (FT_Short)( bsize->height * 2/3 );
+        {
+          /* this is a heuristical value */
+          bsize->width = (FT_Short)FT_MulDiv( bsize->height, 2, 3 );
+        }
 
         prop = pcf_find_property( face, "POINT_SIZE" );
         if ( prop )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "pcf_load_font: negative point size\n" ));
+#endif
           /* convert from 722.7 decipoints to 72 points per inch */
-          bsize->size =
-            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );
+          if ( FT_ABS( prop->value.l ) > 0x504C2L ) /* 0x7FFF * 72270/7200 */
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = FT_MulDiv( FT_ABS( prop->value.l ),
+                                     64 * 7200,
+                                     72270L );
+        }
 
         prop = pcf_find_property( face, "PIXEL_SIZE" );
         if ( prop )
-          bsize->y_ppem = (FT_Short)prop->value.l << 6;
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "pcf_load_font: negative pixel size\n" ));
+#endif
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            bsize->y_ppem = 0x7FFF << 6;
+            FT_TRACE0(( "pcf_load_font: clamping pixel size to value %d\n",
+                        bsize->y_ppem ));
+          }
+          else
+            bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6;
+        }
 
         prop = pcf_find_property( face, "RESOLUTION_X" );
         if ( prop )
-          resolution_x = (FT_Short)prop->value.l;
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "pcf_load_font: negative X resolution\n" ));
+#endif
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            resolution_x = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping X resolution to value %d\n",
+                        resolution_x ));
+          }
+          else
+            resolution_x = FT_ABS( (FT_Short)prop->value.l );
+        }
 
         prop = pcf_find_property( face, "RESOLUTION_Y" );
         if ( prop )
-          resolution_y = (FT_Short)prop->value.l;
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "pcf_load_font: negative Y resolution\n" ));
+#endif
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            resolution_y = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping Y resolution to value %d\n",
+                        resolution_y ));
+          }
+          else
+            resolution_y = FT_ABS( (FT_Short)prop->value.l );
+        }
 
         if ( bsize->y_ppem == 0 )
         {
           bsize->y_ppem = bsize->size;
           if ( resolution_y )
-            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
+            bsize->y_ppem = FT_MulDiv( bsize->y_ppem, resolution_y, 72 );
         }
         if ( resolution_x && resolution_y )
-          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
+          bsize->x_ppem = FT_MulDiv( bsize->y_ppem,
+                                     resolution_x,
+                                     resolution_y );
         else
           bsize->x_ppem = bsize->y_ppem;
       }
diff --git a/src/pcf/pcfread.h b/src/pcf/pcfread.h
index c9524f1..bed30e5 100644
--- a/src/pcf/pcfread.h
+++ b/src/pcf/pcfread.h
@@ -25,8 +25,8 @@
 */
 
 
-#ifndef __PCFREAD_H__
-#define __PCFREAD_H__
+#ifndef PCFREAD_H_
+#define PCFREAD_H_
 
 
 #include <ft2build.h>
@@ -39,7 +39,7 @@
 
 FT_END_HEADER
 
-#endif /* __PCFREAD_H__ */
+#endif /* PCFREAD_H_ */
 
 
 /* END */
diff --git a/src/pcf/pcfutil.h b/src/pcf/pcfutil.h
index ce10fb5..be986e7 100644
--- a/src/pcf/pcfutil.h
+++ b/src/pcf/pcfutil.h
@@ -25,8 +25,8 @@
 */
 
 
-#ifndef __PCFUTIL_H__
-#define __PCFUTIL_H__
+#ifndef PCFUTIL_H_
+#define PCFUTIL_H_
 
 
 #include <ft2build.h>
@@ -49,7 +49,7 @@
 
 FT_END_HEADER
 
-#endif /* __PCFUTIL_H__ */
+#endif /* PCFUTIL_H_ */
 
 
 /* END */
diff --git a/src/pfr/Jamfile b/src/pfr/Jamfile
index 2064bcd..cb55a7e 100644
--- a/src/pfr/Jamfile
+++ b/src/pfr/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/pfr Jamfile
 #
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,13 @@
 
   if $(FT2_MULTI)
   {
-    _sources = pfrdrivr pfrgload pfrload pfrobjs pfrcmap pfrsbit ;
+    _sources = pfrcmap
+               pfrdrivr
+               pfrgload
+               pfrload
+               pfrobjs
+               pfrsbit
+               ;
   }
   else
   {
diff --git a/src/pfr/module.mk b/src/pfr/module.mk
index 3f5a47e..27fec8e 100644
--- a/src/pfr/module.mk
+++ b/src/pfr/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/pfr/pfr.c b/src/pfr/pfr.c
index 96e6730..1760882 100644
--- a/src/pfr/pfr.c
+++ b/src/pfr/pfr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR driver component.                                       */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,15 +15,16 @@
 /*                                                                         */
 /***************************************************************************/
 
-#define FT_MAKE_OPTION_SINGLE_OBJECT
 
+#define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
 
-#include "pfrload.c"
-#include "pfrgload.c"
 #include "pfrcmap.c"
-#include "pfrobjs.c"
 #include "pfrdrivr.c"
+#include "pfrgload.c"
+#include "pfrload.c"
+#include "pfrobjs.c"
 #include "pfrsbit.c"
 
+
 /* END */
diff --git a/src/pfr/pfrcmap.c b/src/pfr/pfrcmap.c
index 88ff55a..6064378 100644
--- a/src/pfr/pfrcmap.c
+++ b/src/pfr/pfrcmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR cmap handling (body).                                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -130,7 +130,7 @@
         }
 
         if ( gchar->char_code < char_code )
-          min = mid+1;
+          min = mid + 1;
         else
           max = mid;
       }
@@ -161,12 +161,16 @@
   {
     sizeof ( PFR_CMapRec ),
 
-    (FT_CMap_InitFunc)     pfr_cmap_init,
-    (FT_CMap_DoneFunc)     pfr_cmap_done,
-    (FT_CMap_CharIndexFunc)pfr_cmap_char_index,
-    (FT_CMap_CharNextFunc) pfr_cmap_char_next,
+    (FT_CMap_InitFunc)     pfr_cmap_init,        /* init       */
+    (FT_CMap_DoneFunc)     pfr_cmap_done,        /* done       */
+    (FT_CMap_CharIndexFunc)pfr_cmap_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) pfr_cmap_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   };
 
 
diff --git a/src/pfr/pfrcmap.h b/src/pfr/pfrcmap.h
index 87e1e5b..c70a0c8 100644
--- a/src/pfr/pfrcmap.h
+++ b/src/pfr/pfrcmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR cmap handling (specification).                          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRCMAP_H__
-#define __PFRCMAP_H__
+#ifndef PFRCMAP_H_
+#define PFRCMAP_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
@@ -40,7 +40,7 @@
 FT_END_HEADER
 
 
-#endif /* __PFRCMAP_H__ */
+#endif /* PFRCMAP_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrdrivr.c b/src/pfr/pfrdrivr.c
index 8753748..6c7e501 100644
--- a/src/pfr/pfrdrivr.c
+++ b/src/pfr/pfrdrivr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR driver interface (body).                                */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -139,9 +139,9 @@
   static
   const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
   {
-    pfr_get_metrics,
-    pfr_face_get_kerning,
-    pfr_get_advance
+    pfr_get_metrics,          /* get_metrics */
+    pfr_face_get_kerning,     /* get_kerning */
+    pfr_get_advance           /* get_advance */
   };
 
 
@@ -181,31 +181,32 @@
       0x10000L,
       0x20000L,
 
-      NULL,
+      NULL,    /* module-specific interface */
 
-      0,                /* FT_Module_Constructor */
-      0,                /* FT_Module_Destructor  */
-      pfr_get_service
+      NULL,                     /* FT_Module_Constructor  module_init   */
+      NULL,                     /* FT_Module_Destructor   module_done   */
+      pfr_get_service           /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( PFR_FaceRec ),
     sizeof ( PFR_SizeRec ),
     sizeof ( PFR_SlotRec ),
 
-    pfr_face_init,
-    pfr_face_done,
-    0,                  /* FT_Size_InitFunc */
-    0,                  /* FT_Size_DoneFunc */
-    pfr_slot_init,
-    pfr_slot_done,
+    pfr_face_init,              /* FT_Face_InitFunc  init_face */
+    pfr_face_done,              /* FT_Face_DoneFunc  done_face */
+    NULL,                       /* FT_Size_InitFunc  init_size */
+    NULL,                       /* FT_Size_DoneFunc  done_size */
+    pfr_slot_init,              /* FT_Slot_InitFunc  init_slot */
+    pfr_slot_done,              /* FT_Slot_DoneFunc  done_slot */
 
-    pfr_slot_load,
+    pfr_slot_load,              /* FT_Slot_LoadFunc  load_glyph */
 
-    pfr_get_kerning,
-    0,                  /* FT_Face_AttachFunc      */
-    0,                  /* FT_Face_GetAdvancesFunc */
-    0,                  /* FT_Size_RequestFunc     */
-    0,                  /* FT_Size_SelectFunc      */
+    pfr_get_kerning,            /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
+
+    NULL,                       /* FT_Size_RequestFunc  request_size */
+    NULL,                       /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/pfr/pfrdrivr.h b/src/pfr/pfrdrivr.h
index b5be470..cab8527 100644
--- a/src/pfr/pfrdrivr.h
+++ b/src/pfr/pfrdrivr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type PFR driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRDRIVR_H__
-#define __PFRDRIVR_H__
+#ifndef PFRDRIVR_H_
+#define PFRDRIVR_H_
 
 
 #include <ft2build.h>
@@ -37,7 +37,7 @@
 FT_END_HEADER
 
 
-#endif /* __PFRDRIVR_H__ */
+#endif /* PFRDRIVR_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrerror.h b/src/pfr/pfrerror.h
index 978e7b2..7027c81 100644
--- a/src/pfr/pfrerror.h
+++ b/src/pfr/pfrerror.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PFR error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __PFRERROR_H__
-#define __PFRERROR_H__
+#ifndef PFRERROR_H_
+#define PFRERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  PFR_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __PFRERROR_H__ */
+#endif /* PFRERROR_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrgload.c b/src/pfr/pfrgload.c
index 1cd13c2..b799019 100644
--- a/src/pfr/pfrgload.c
+++ b/src/pfr/pfrgload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR glyph loader (body).                                    */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -92,8 +92,8 @@
     if ( outline->n_contours > 0 )
       first = outline->contours[outline->n_contours - 1];
 
-    /* if the last point falls on the same location than the first one */
-    /* we need to delete it                                            */
+    /* if the last point falls on the same location as the first one */
+    /* we need to delete it                                          */
     if ( last > first )
     {
       FT_Vector*  p1 = outline->points + first;
@@ -215,8 +215,10 @@
     /* check that there is space for a new contour and a new point */
     error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 );
     if ( !error )
+    {
       /* add new start point */
       error = pfr_glyph_line_to( glyph, to );
+    }
 
     return error;
   }
@@ -304,8 +306,8 @@
 
     glyph->y_control = glyph->x_control + x_count;
 
-    mask  = 0;
-    x     = 0;
+    mask = 0;
+    x    = 0;
 
     for ( i = 0; i < count; i++ )
     {
@@ -331,10 +333,10 @@
       mask >>= 1;
     }
 
-    /* XXX: for now we ignore the secondary stroke and edge definitions */
-    /*      since we don't want to support native PFR hinting           */
-    /*                                                                  */
-    if ( flags & PFR_GLYPH_EXTRA_ITEMS )
+    /* XXX: we ignore the secondary stroke and edge definitions */
+    /*      since we don't support native PFR hinting           */
+    /*                                                          */
+    if ( flags & PFR_GLYPH_SINGLE_EXTRA_ITEMS )
     {
       error = pfr_extra_items_skip( &p, limit );
       if ( error )
@@ -366,27 +368,27 @@
 
         switch ( format >> 4 )
         {
-        case 0:                             /* end glyph */
+        case 0:                                               /* end glyph */
           FT_TRACE6(( "- end glyph" ));
           args_count = 0;
           break;
 
-        case 1:                             /* general line operation */
+        case 1:                                  /* general line operation */
           FT_TRACE6(( "- general line" ));
           goto Line1;
 
-        case 4:                             /* move to inside contour  */
+        case 4:                                 /* move to inside contour  */
           FT_TRACE6(( "- move to inside" ));
           goto Line1;
 
-        case 5:                             /* move to outside contour */
+        case 5:                                 /* move to outside contour */
           FT_TRACE6(( "- move to outside" ));
         Line1:
           args_format = format_low;
           args_count  = 1;
           break;
 
-        case 2:                             /* horizontal line to */
+        case 2:                                      /* horizontal line to */
           FT_TRACE6(( "- horizontal line to cx.%d", format_low ));
           if ( format_low >= x_count )
             goto Failure;
@@ -396,7 +398,7 @@
           args_count = 0;
           break;
 
-        case 3:                             /* vertical line to */
+        case 3:                                        /* vertical line to */
           FT_TRACE6(( "- vertical line to cy.%d", format_low ));
           if ( format_low >= y_count )
             goto Failure;
@@ -406,19 +408,19 @@
           args_count = 0;
           break;
 
-        case 6:                             /* horizontal to vertical curve */
+        case 6:                            /* horizontal to vertical curve */
           FT_TRACE6(( "- hv curve " ));
           args_format = 0xB8E;
           args_count  = 3;
           break;
 
-        case 7:                             /* vertical to horizontal curve */
+        case 7:                            /* vertical to horizontal curve */
           FT_TRACE6(( "- vh curve" ));
           args_format = 0xE2B;
           args_count  = 3;
           break;
 
-        default:                            /* general curve to */
+        default:                                       /* general curve to */
           FT_TRACE6(( "- general curve" ));
           args_count  = 4;
           args_format = format_low;
@@ -439,14 +441,14 @@
           {
           case 0:                           /* 8-bit index */
             PFR_CHECK( 1 );
-            idx  = PFR_NEXT_BYTE( p );
+            idx = PFR_NEXT_BYTE( p );
             if ( idx >= x_count )
               goto Failure;
             cur->x = glyph->x_control[idx];
             FT_TRACE7(( " cx#%d", idx ));
             break;
 
-          case 1:                           /* 16-bit value */
+          case 1:                           /* 16-bit absolute value */
             PFR_CHECK( 2 );
             cur->x = PFR_NEXT_SHORT( p );
             FT_TRACE7(( " x.%d", cur->x ));
@@ -516,22 +518,22 @@
         /*                                                         */
         switch ( format >> 4 )
         {
-        case 0:                             /* end glyph => EXIT */
+        case 0:                                       /* end glyph => EXIT */
           pfr_glyph_end( glyph );
           goto Exit;
 
-        case 1:                             /* line operations */
+        case 1:                                         /* line operations */
         case 2:
         case 3:
           error = pfr_glyph_line_to( glyph, pos );
           goto Test_Error;
 
-        case 4:                             /* move to inside contour  */
-        case 5:                             /* move to outside contour */
+        case 4:                                 /* move to inside contour  */
+        case 5:                                 /* move to outside contour */
           error = pfr_glyph_move_to( glyph, pos );
           goto Test_Error;
 
-        default:                            /* curve operations */
+        default:                                       /* curve operations */
           error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 );
 
         Test_Error:  /* test error condition */
@@ -577,10 +579,11 @@
 
     /* ignore extra items when present */
     /*                                 */
-    if ( flags & PFR_GLYPH_EXTRA_ITEMS )
+    if ( flags & PFR_GLYPH_COMPOUND_EXTRA_ITEMS )
     {
       error = pfr_extra_items_skip( &p, limit );
-      if (error) goto Exit;
+      if ( error )
+        goto Exit;
     }
 
     /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because   */
@@ -632,14 +635,14 @@
       if ( format & PFR_SUBGLYPH_XSCALE )
       {
         PFR_CHECK( 2 );
-        subglyph->x_scale = PFR_NEXT_SHORT( p ) << 4;
+        subglyph->x_scale = PFR_NEXT_SHORT( p ) * 16;
       }
 
       subglyph->y_scale = 0x10000L;
       if ( format & PFR_SUBGLYPH_YSCALE )
       {
         PFR_CHECK( 2 );
-        subglyph->y_scale = PFR_NEXT_SHORT( p ) << 4;
+        subglyph->y_scale = PFR_NEXT_SHORT( p ) * 16;
       }
 
       /* read offset */
@@ -753,8 +756,10 @@
 
       count = glyph->num_subs - old_count;
 
-      FT_TRACE4(( "compound glyph with %d elements (offset %lu):\n",
-                  count, offset ));
+      FT_TRACE4(( "compound glyph with %d element%s (offset %lu):\n",
+                  count,
+                  count == 1 ? "" : "s",
+                  offset ));
 
       /* now, load each individual glyph */
       for ( n = 0; n < count; n++ )
@@ -807,7 +812,9 @@
         /* proceed to next sub-glyph */
       }
 
-      FT_TRACE4(( "end compound glyph with %d elements\n", count ));
+      FT_TRACE4(( "end compound glyph with %d element%s\n",
+                  count,
+                  count == 1 ? "" : "s" ));
     }
     else
     {
diff --git a/src/pfr/pfrgload.h b/src/pfr/pfrgload.h
index c7c8da1..01f48d7 100644
--- a/src/pfr/pfrgload.h
+++ b/src/pfr/pfrgload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR glyph loader (specification).                           */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRGLOAD_H__
-#define __PFRGLOAD_H__
+#ifndef PFRGLOAD_H_
+#define PFRGLOAD_H_
 
 #include "pfrtypes.h"
 
@@ -43,7 +43,7 @@
 FT_END_HEADER
 
 
-#endif /* __PFRGLOAD_H__ */
+#endif /* PFRGLOAD_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrload.c b/src/pfr/pfrload.c
index ec7311d..2776da4 100644
--- a/src/pfr/pfrload.c
+++ b/src/pfr/pfrload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR loader (body).                                          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -26,6 +26,93 @@
 #define FT_COMPONENT  trace_pfr
 
 
+  /*
+   *  The overall structure of a PFR file is as follows.
+   *
+   *    PFR header
+   *      58 bytes (contains nPhysFonts)
+   *
+   *    Logical font directory (size at most 2^16 bytes)
+   *      2 bytes (nLogFonts)
+   *      + nLogFonts * 5 bytes
+   *
+   *         ==>   nLogFonts <= 13106
+   *
+   *    Logical font section (size at most 2^24 bytes)
+   *      nLogFonts * logFontRecord
+   *
+   *      logFontRecord (size at most 2^16 bytes)
+   *        12 bytes (fontMatrix)
+   *        + 1 byte (flags)
+   *        + 0-5 bytes (depending on `flags')
+   *        + 0-(1+255*(2+255)) = 0-65536 (depending on `flags')
+   *        + 5 bytes (physical font info)
+   *        + 0-1 bytes (depending on PFR header)
+   *
+   *         ==>   minimum size 18 bytes
+   *
+   *    Physical font section (size at most 2^24 bytes)
+   *      nPhysFonts * (physFontRecord
+   *                    + nBitmapSizes * nBmapChars * bmapCharRecord)
+   *
+   *      physFontRecord (size at most 2^24 bytes)
+   *        14 bytes (font info)
+   *        + 1 byte (flags)
+   *        + 0-2 (depending on `flags')
+   *        + 0-? (structure too complicated to be shown here; depending on
+   *               `flags'; contains `nBitmapSizes' and `nBmapChars')
+   *        + 3 bytes (nAuxBytes)
+   *        + nAuxBytes
+   *        + 1 byte (nBlueValues)
+   *        + 2 * nBlueValues
+   *        + 6 bytes (hinting data)
+   *        + 2 bytes (nCharacters)
+   *        + nCharacters * (4-10 bytes) (depending on `flags')
+   *
+   *         ==>   minimum size 27 bytes
+   *
+   *      bmapCharRecord
+   *        4-7 bytes
+   *
+   *    Glyph program strings (three possible types: simpleGps, compoundGps,
+   *                           and bitmapGps; size at most 2^24 bytes)
+   *      simpleGps (size at most 2^16 bytes)
+   *        1 byte (flags)
+   *        1-2 bytes (n[XY]orus, depending on `flags')
+   *        0-(64+512*2) = 0-1088 bytes (depending on `n[XY]orus')
+   *        0-? (structure too complicated to be shown here; depending on
+   *             `flags')
+   *        1-? glyph data (faintly resembling PS Type 1 charstrings)
+   *
+   *         ==>   minimum size 3 bytes
+   *
+   *      compoundGps (size at most 2^16 bytes)
+   *        1 byte (nElements <= 63, flags)
+   *        + 0-(1+255*(2+255)) = 0-65536 (depending on `flags')
+   *        + nElements * (6-14 bytes)
+   *
+   *      bitmapGps (size at most 2^16 bytes)
+   *        1 byte (flags)
+   *        3-13 bytes (position info, depending on `flags')
+   *        0-? bitmap data
+   *
+   *         ==>   minimum size 4 bytes
+   *
+   *    PFR trailer
+   *        8 bytes
+   *
+   *
+   * ==>   minimum size of a valid PFR:
+   *         58 (header)
+   *         + 2 (nLogFonts)
+   *         + 27 (1 physFontRecord)
+   *         + 8 (trailer)
+   *        -----
+   *         95 bytes
+   *
+   */
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -75,7 +162,8 @@
           if ( extra->type == item_type )
           {
             error = extra->parser( p, p + item_size, item_data );
-            if ( error ) goto Exit;
+            if ( error )
+              goto Exit;
 
             break;
           }
@@ -183,7 +271,8 @@
     {
       result = 0;
     }
-    return  result;
+
+    return result;
   }
 
 
@@ -206,9 +295,26 @@
     FT_UInt   result = 0;
 
 
-    if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) )
+    if ( FT_STREAM_SEEK( section_offset ) ||
+         FT_READ_USHORT( count )          )
       goto Exit;
 
+    /* check maximum value and a rough minimum size:     */
+    /* - no more than 13106 log fonts                    */
+    /* - we need 5 bytes for a log header record         */
+    /* - we need at least 18 bytes for a log font record */
+    /* - the overall size is at least 95 bytes plus the  */
+    /*   log header and log font records                 */
+    if ( count > ( ( 1 << 16 ) - 2 ) / 5                ||
+         2 + count * 5 >= stream->size - section_offset ||
+         95 + count * ( 5 + 18 ) >= stream->size        )
+    {
+      FT_ERROR(( "pfr_log_font_count:"
+                 " invalid number of logical fonts\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
     result = count;
 
   Exit:
@@ -254,13 +360,14 @@
       FT_UInt   local;
 
 
-      if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )
+      if ( FT_STREAM_SEEK( offset ) ||
+           FT_FRAME_ENTER( size )   )
         goto Exit;
 
       p     = stream->cursor;
       limit = p + size;
 
-      PFR_CHECK(13);
+      PFR_CHECK( 13 );
 
       log_font->matrix[0] = PFR_NEXT_LONG( p );
       log_font->matrix[1] = PFR_NEXT_LONG( p );
@@ -276,7 +383,7 @@
         if ( flags & PFR_LOG_2BYTE_STROKE )
           local++;
 
-        if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER )
+        if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER )
           local += 3;
       }
       if ( flags & PFR_LOG_BOLD )
@@ -308,10 +415,11 @@
       if ( flags & PFR_LOG_EXTRA_ITEMS )
       {
         error = pfr_extra_items_skip( &p, limit );
-        if (error) goto Fail;
+        if ( error )
+          goto Fail;
       }
 
-      PFR_CHECK(5);
+      PFR_CHECK( 5 );
       log_font->phys_size   = PFR_NEXT_USHORT( p );
       log_font->phys_offset = PFR_NEXT_ULONG( p );
       if ( size_increment )
@@ -358,7 +466,7 @@
 
     PFR_CHECK( 5 );
 
-    p += 3;  /* skip bctSize */
+    p     += 3;  /* skip bctSize */
     flags0 = PFR_NEXT_BYTE( p );
     count  = PFR_NEXT_BYTE( p );
 
@@ -434,12 +542,12 @@
   }
 
 
-  /* Load font ID.  This is a so-called "unique" name that is rather
-   * long and descriptive (like "Tiresias ScreenFont v7.51").
+  /* Load font ID.  This is a so-called `unique' name that is rather
+   * long and descriptive (like `Tiresias ScreenFont v7.51').
    *
    * Note that a PFR font's family name is contained in an *undocumented*
-   * string of the "auxiliary data" portion of a physical font record.  This
-   * may also contain the "real" style name!
+   * string of the `auxiliary data' portion of a physical font record.  This
+   * may also contain the `real' style name!
    *
    * If no family name is present, the font ID is used instead for the
    * family.
@@ -454,7 +562,7 @@
     FT_UInt    len    = (FT_UInt)( limit - p );
 
 
-    if ( phy_font->font_id != NULL )
+    if ( phy_font->font_id )
       goto Exit;
 
     if ( FT_ALLOC( phy_font->font_id, len + 1 ) )
@@ -481,7 +589,7 @@
     FT_Memory  memory = phy_font->memory;
 
 
-    if ( phy_font->vertical.stem_snaps != NULL )
+    if ( phy_font->vertical.stem_snaps )
       goto Exit;
 
     PFR_CHECK( 1 );
@@ -507,7 +615,7 @@
 
   Too_Short:
     error = FT_THROW( Invalid_Table );
-    FT_ERROR(( "pfr_exta_item_load_stem_snaps:"
+    FT_ERROR(( "pfr_extra_item_load_stem_snaps:"
                " invalid stem snaps table\n" ));
     goto Exit;
   }
@@ -525,8 +633,6 @@
     FT_Memory     memory = phy_font->memory;
 
 
-    FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" ));
-
     if ( FT_NEW( item ) )
       goto Exit;
 
@@ -612,7 +718,6 @@
   }
 
 
-
   static const PFR_ExtraItemRec  pfr_phy_font_extra_items[] =
   {
     { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info },
@@ -623,7 +728,8 @@
   };
 
 
-  /* Loads a name from the auxiliary data.  Since this extracts undocumented
+  /*
+   * Load a name from the auxiliary data.  Since this extracts undocumented
    * strings from the font file, we need to be careful here.
    */
   static FT_Error
@@ -637,12 +743,14 @@
     FT_UInt     n, ok;
 
 
+    if ( *astring )
+      FT_FREE( *astring );
+
     if ( len > 0 && p[len - 1] == 0 )
       len--;
 
-    /* check that each character is ASCII for making sure not to
-       load garbage
-     */
+    /* check that each character is ASCII  */
+    /* for making sure not to load garbage */
     ok = ( len > 0 );
     for ( n = 0; n < len; n++ )
       if ( p[n] < 32 || p[n] > 127 )
@@ -659,6 +767,7 @@
       FT_MEM_COPY( result, p, len );
       result[len] = 0;
     }
+
   Exit:
     *astring = result;
     return error;
@@ -729,7 +838,8 @@
     phy_font->kern_items      = NULL;
     phy_font->kern_items_tail = &phy_font->kern_items;
 
-    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )
+    if ( FT_STREAM_SEEK( offset ) ||
+         FT_FRAME_ENTER( size )   )
       goto Exit;
 
     phy_font->cursor = stream->cursor;
@@ -757,16 +867,16 @@
     /* load the extra items when present */
     if ( flags & PFR_PHY_EXTRA_ITEMS )
     {
-      error =  pfr_extra_items_parse( &p, limit,
-                                      pfr_phy_font_extra_items, phy_font );
+      error = pfr_extra_items_parse( &p, limit,
+                                     pfr_phy_font_extra_items, phy_font );
 
       if ( error )
         goto Fail;
     }
 
-    /* In certain fonts, the auxiliary bytes contain interesting  */
-    /* information. These are not in the specification but can be */
-    /* guessed by looking at the content of a few PFR0 fonts.     */
+    /* In certain fonts, the auxiliary bytes contain interesting   */
+    /* information.  These are not in the specification but can be */
+    /* guessed by looking at the content of a few PFR0 fonts.      */
     PFR_CHECK( 3 );
     num_aux = PFR_NEXT_ULONG( p );
 
@@ -776,7 +886,7 @@
       FT_Byte*  q2;
 
 
-      PFR_CHECK( num_aux );
+      PFR_CHECK_SIZE( num_aux );
       p += num_aux;
 
       while ( num_aux > 0 )
@@ -797,9 +907,8 @@
         switch ( type )
         {
         case 1:
-          /* this seems to correspond to the font's family name,
-           * padded to 16-bits with one zero when necessary
-           */
+          /* this seems to correspond to the font's family name, padded to */
+          /* an even number of bytes with a zero byte appended if needed   */
           error = pfr_aux_name_load( q, length - 4U, memory,
                                      &phy_font->family_name );
           if ( error )
@@ -817,9 +926,8 @@
           break;
 
         case 3:
-          /* this seems to correspond to the font's style name,
-           * padded to 16-bits with one zero when necessary
-           */
+          /* this seems to correspond to the font's style name, padded to */
+          /* an even number of bytes with a zero byte appended if needed  */
           error = pfr_aux_name_load( q, length - 4U, memory,
                                      &phy_font->style_name );
           if ( error )
@@ -867,9 +975,6 @@
       phy_font->num_chars    = count = PFR_NEXT_USHORT( p );
       phy_font->chars_offset = offset + (FT_Offset)( p - stream->cursor );
 
-      if ( FT_NEW_ARRAY( phy_font->chars, count ) )
-        goto Fail;
-
       Size = 1 + 1 + 2;
       if ( flags & PFR_PHY_2BYTE_CHARCODE )
         Size += 1;
@@ -886,7 +991,10 @@
       if ( flags & PFR_PHY_3BYTE_GPS_OFFSET )
         Size += 1;
 
-      PFR_CHECK( count * Size );
+      PFR_CHECK_SIZE( count * Size );
+
+      if ( FT_NEW_ARRAY( phy_font->chars, count ) )
+        goto Fail;
 
       for ( n = 0; n < count; n++ )
       {
diff --git a/src/pfr/pfrload.h b/src/pfr/pfrload.h
index 0a51234..36e809a 100644
--- a/src/pfr/pfrload.h
+++ b/src/pfr/pfrload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR loader (specification).                                 */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRLOAD_H__
-#define __PFRLOAD_H__
+#ifndef PFRLOAD_H_
+#define PFRLOAD_H_
 
 #include "pfrobjs.h"
 #include FT_INTERNAL_STREAM_H
@@ -25,14 +25,19 @@
 
 FT_BEGIN_HEADER
 
+  /* some size checks should be always done (mainly to prevent */
+  /* excessive allocation for malformed data), ...             */
+#define PFR_CHECK_SIZE( x )  do                       \
+                             {                        \
+                               if ( p + (x) > limit ) \
+                                 goto Too_Short;      \
+                             } while ( 0 )
+
+  /* ... and some only if intensive checking is explicitly requested */
 #ifdef PFR_CONFIG_NO_CHECKS
 #define PFR_CHECK( x )  do { } while ( 0 )
 #else
-#define PFR_CHECK( x )  do                       \
-                        {                        \
-                          if ( p + (x) > limit ) \
-                            goto Too_Short;      \
-                        } while ( 0 )
+#define PFR_CHECK  PFR_CHECK_SIZE
 #endif
 
 #define PFR_NEXT_BYTE( p )    FT_NEXT_BYTE( p )
@@ -112,7 +117,7 @@
 
 FT_END_HEADER
 
-#endif /* __PFRLOAD_H__ */
+#endif /* PFRLOAD_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrobjs.c b/src/pfr/pfrobjs.c
index aababf4..737b97b 100644
--- a/src/pfr/pfrobjs.c
+++ b/src/pfr/pfrobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR object methods (body).                                  */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -109,7 +109,7 @@
     if ( face_index < 0 )
       goto Exit;
 
-    if ( face_index >= pfrface->num_faces )
+    if ( ( face_index & 0xFFFF ) >= pfrface->num_faces )
     {
       FT_ERROR(( "pfr_face_init: invalid face index\n" ));
       error = FT_THROW( Invalid_Argument );
@@ -118,9 +118,11 @@
 
     /* load the face */
     error = pfr_log_font_load(
-               &face->log_font, stream, (FT_UInt)face_index,
-               face->header.log_dir_offset,
-               FT_BOOL( face->header.phy_font_max_size_high != 0 ) );
+              &face->log_font,
+              stream,
+              (FT_UInt)( face_index & 0xFFFF ),
+              face->header.log_dir_offset,
+              FT_BOOL( face->header.phy_font_max_size_high != 0 ) );
     if ( error )
       goto Exit;
 
@@ -136,13 +138,13 @@
       PFR_PhyFont  phy_font = &face->phy_font;
 
 
-      pfrface->face_index = face_index;
+      pfrface->face_index = face_index & 0xFFFF;
       pfrface->num_glyphs = (FT_Long)phy_font->num_chars + 1;
 
       pfrface->face_flags |= FT_FACE_FLAG_SCALABLE;
 
-      /* if all characters point to the same gps_offset 0, we */
-      /* assume that the font only contains bitmaps           */
+      /* if gps_offset == 0 for all characters, we  */
+      /* assume that the font only contains bitmaps */
       {
         FT_UInt  nn;
 
@@ -164,7 +166,7 @@
         }
       }
 
-      if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
+      if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
         pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
       if ( phy_font->flags & PFR_PHY_VERTICAL )
@@ -178,16 +180,16 @@
       if ( phy_font->num_kern_pairs > 0 )
         pfrface->face_flags |= FT_FACE_FLAG_KERNING;
 
-      /* If no family name was found in the "undocumented" auxiliary
+      /* If no family name was found in the `undocumented' auxiliary
        * data, use the font ID instead.  This sucks but is better than
        * nothing.
        */
       pfrface->family_name = phy_font->family_name;
-      if ( pfrface->family_name == NULL )
+      if ( !pfrface->family_name )
         pfrface->family_name = phy_font->font_id;
 
       /* note that the style name can be NULL in certain PFR fonts,
-       * probably meaning "Regular"
+       * probably meaning `Regular'
        */
       pfrface->style_name = phy_font->style_name;
 
@@ -262,15 +264,9 @@
         charmap.encoding    = FT_ENCODING_UNICODE;
 
         error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
-
-#if 0
-        /* Select default charmap */
-        if ( pfrface->num_charmaps )
-          pfrface->charmap = pfrface->charmaps[0];
-#endif
       }
 
-      /* check whether we've loaded any kerning pairs */
+      /* check whether we have loaded any kerning pairs */
       if ( phy_font->num_kern_pairs )
         pfrface->face_flags |= FT_FACE_FLAG_KERNING;
     }
@@ -340,8 +336,12 @@
     /* try to load an embedded bitmap */
     if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 )
     {
-      error = pfr_slot_load_bitmap( slot, size, gindex );
-      if ( error == 0 )
+      error = pfr_slot_load_bitmap(
+                slot,
+                size,
+                gindex,
+                ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 );
+      if ( !error )
         goto Exit;
     }
 
@@ -402,7 +402,7 @@
       pfrslot->linearHoriAdvance = metrics->horiAdvance;
       pfrslot->linearVertAdvance = metrics->vertAdvance;
 
-      /* make-up vertical metrics(?) */
+      /* make up vertical metrics(?) */
       metrics->vertBearingX = 0;
       metrics->vertBearingY = 0;
 
@@ -522,8 +522,8 @@
         FT_UInt    probe       = power * size;
         FT_UInt    extra       = count - power;
         FT_Byte*   base        = stream->cursor;
-        FT_Bool    twobytes    = FT_BOOL( item->flags & 1 );
-        FT_Bool    twobyte_adj = FT_BOOL( item->flags & 2 );
+        FT_Bool    twobytes    = FT_BOOL( item->flags & PFR_KERN_2BYTE_CHAR );
+        FT_Bool    twobyte_adj = FT_BOOL( item->flags & PFR_KERN_2BYTE_ADJ  );
         FT_Byte*   p;
         FT_UInt32  cpair;
 
@@ -596,4 +596,5 @@
     return error;
   }
 
+
 /* END */
diff --git a/src/pfr/pfrobjs.h b/src/pfr/pfrobjs.h
index e990b45..59c709f 100644
--- a/src/pfr/pfrobjs.h
+++ b/src/pfr/pfrobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR object methods (specification).                         */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFROBJS_H__
-#define __PFROBJS_H__
+#ifndef PFROBJS_H_
+#define PFROBJS_H_
 
 #include "pfrtypes.h"
 
@@ -90,7 +90,7 @@
 
 FT_END_HEADER
 
-#endif /* __PFROBJS_H__ */
+#endif /* PFROBJS_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrsbit.c b/src/pfr/pfrsbit.c
index bb5df5c..ba909dd 100644
--- a/src/pfr/pfrsbit.c
+++ b/src/pfr/pfrsbit.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR bitmap loader (body).                                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -37,11 +37,11 @@
 
   typedef struct  PFR_BitWriter_
   {
-    FT_Byte*  line;      /* current line start                    */
-    FT_Int    pitch;     /* line size in bytes                    */
-    FT_UInt   width;     /* width in pixels/bits                  */
-    FT_UInt   rows;      /* number of remaining rows to scan      */
-    FT_UInt   total;     /* total number of bits to draw          */
+    FT_Byte*  line;      /* current line start               */
+    FT_Int    pitch;     /* line size in bytes               */
+    FT_UInt   width;     /* width in pixels/bits             */
+    FT_UInt   rows;      /* number of remaining rows to scan */
+    FT_UInt   total;     /* total number of bits to draw     */
 
   } PFR_BitWriterRec, *PFR_BitWriter;
 
@@ -277,49 +277,99 @@
   pfr_lookup_bitmap_data( FT_Byte*   base,
                           FT_Byte*   limit,
                           FT_UInt    count,
-                          FT_UInt    flags,
+                          FT_UInt*   flags,
                           FT_UInt    char_code,
                           FT_ULong*  found_offset,
                           FT_ULong*  found_size )
   {
-    FT_UInt   left, right, char_len;
-    FT_Bool   two = FT_BOOL( flags & 1 );
+    FT_UInt   min, max, char_len;
+    FT_Bool   two = FT_BOOL( *flags & PFR_BITMAP_2BYTE_CHARCODE );
     FT_Byte*  buff;
 
 
     char_len = 4;
-    if ( two )       char_len += 1;
-    if ( flags & 2 ) char_len += 1;
-    if ( flags & 4 ) char_len += 1;
+    if ( two )
+      char_len += 1;
+    if ( *flags & PFR_BITMAP_2BYTE_SIZE )
+      char_len += 1;
+    if ( *flags & PFR_BITMAP_3BYTE_OFFSET )
+      char_len += 1;
 
-    left  = 0;
-    right = count;
-
-    while ( left < right )
+    if ( !( *flags & PFR_BITMAP_CHARCODES_VALIDATED ) )
     {
-      FT_UInt  middle, code;
+      FT_Byte*  p;
+      FT_Byte*  lim;
+      FT_UInt   code;
+      FT_Long   prev_code;
 
 
-      middle = ( left + right ) >> 1;
-      buff   = base + middle * char_len;
+      *flags    |= PFR_BITMAP_VALID_CHARCODES;
+      prev_code  = -1;
+      lim        = base + count * char_len;
 
-      /* check that we are not outside of the table -- */
-      /* this is possible with broken fonts...         */
-      if ( buff + char_len > limit )
-        goto Fail;
+      if ( lim > limit )
+      {
+        FT_TRACE0(( "pfr_lookup_bitmap_data:"
+                    " number of bitmap records too large,\n"
+                    "                       "
+                    " thus ignoring all bitmaps in this strike\n" ));
+        *flags &= ~PFR_BITMAP_VALID_CHARCODES;
+      }
+      else
+      {
+        /* check whether records are sorted by code */
+        for ( p = base; p < lim; p += char_len )
+        {
+          if ( two )
+            code = FT_PEEK_USHORT( p );
+          else
+            code = *p;
+
+          if ( (FT_Long)code <= prev_code )
+          {
+            FT_TRACE0(( "pfr_lookup_bitmap_data:"
+                        " bitmap records are not sorted,\n"
+                        "                       "
+                        " thus ignoring all bitmaps in this strike\n" ));
+            *flags &= ~PFR_BITMAP_VALID_CHARCODES;
+            break;
+          }
+
+          prev_code = code;
+        }
+      }
+
+      *flags |= PFR_BITMAP_CHARCODES_VALIDATED;
+    }
+
+    /* ignore bitmaps in case table is not valid     */
+    /* (this might be sanitized, but PFR is dead...) */
+    if ( !( *flags & PFR_BITMAP_VALID_CHARCODES ) )
+      goto Fail;
+
+    min = 0;
+    max = count;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt  mid, code;
+
+
+      mid  = ( min + max ) >> 1;
+      buff = base + mid * char_len;
 
       if ( two )
         code = PFR_NEXT_USHORT( buff );
       else
         code = PFR_NEXT_BYTE( buff );
 
-      if ( code == char_code )
-        goto Found_It;
-
-      if ( code < char_code )
-        left = middle;
+      if ( char_code < code )
+        max = mid;
+      else if ( char_code > code )
+        min = mid + 1;
       else
-        right = middle;
+        goto Found_It;
     }
 
   Fail:
@@ -329,20 +379,20 @@
     return;
 
   Found_It:
-    if ( flags & 2 )
+    if ( *flags & PFR_BITMAP_2BYTE_SIZE )
       *found_size = PFR_NEXT_USHORT( buff );
     else
       *found_size = PFR_NEXT_BYTE( buff );
 
-    if ( flags & 4 )
+    if ( *flags & PFR_BITMAP_3BYTE_OFFSET )
       *found_offset = PFR_NEXT_ULONG( buff );
     else
       *found_offset = PFR_NEXT_USHORT( buff );
   }
 
 
-  /* load bitmap metrics.  "*padvance" must be set to the default value */
-  /* before calling this function...                                    */
+  /* load bitmap metrics.  `*padvance' must be set to the default value */
+  /* before calling this function                                       */
   /*                                                                    */
   static FT_Error
   pfr_load_bitmap_metrics( FT_Byte**  pdata,
@@ -357,7 +407,6 @@
   {
     FT_Error  error = FT_Err_Ok;
     FT_Byte   flags;
-    FT_Char   c;
     FT_Byte   b;
     FT_Byte*  p = *pdata;
     FT_Long   xpos, ypos, advance;
@@ -377,9 +426,9 @@
     {
     case 0:
       PFR_CHECK( 1 );
-      c    = PFR_NEXT_INT8( p );
-      xpos = c >> 4;
-      ypos = ( (FT_Char)( c << 4 ) ) >> 4;
+      b    = PFR_NEXT_BYTE( p );
+      xpos = (FT_Char)b >> 4;
+      ypos = ( (FT_Char)( b << 4 ) ) >> 4;
       break;
 
     case 1:
@@ -445,7 +494,7 @@
 
     case 1:
       PFR_CHECK( 1 );
-      advance = PFR_NEXT_INT8( p ) << 8;
+      advance = PFR_NEXT_INT8( p ) * 256;
       break;
 
     case 2:
@@ -510,8 +559,7 @@
         break;
 
       default:
-        FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" ));
-        error = FT_THROW( Invalid_File_Format );
+        ;
       }
     }
 
@@ -530,7 +578,8 @@
   FT_LOCAL( FT_Error )
   pfr_slot_load_bitmap( PFR_Slot  glyph,
                         PFR_Size  size,
-                        FT_UInt   glyph_index )
+                        FT_UInt   glyph_index,
+                        FT_Bool   metrics_only )
   {
     FT_Error     error;
     PFR_Face     face   = (PFR_Face) glyph->root.face;
@@ -544,7 +593,7 @@
 
     character = &phys->chars[glyph_index];
 
-    /* Look-up a bitmap strike corresponding to the current */
+    /* look up a bitmap strike corresponding to the current */
     /* character dimensions                                 */
     {
       FT_UInt  n;
@@ -555,9 +604,7 @@
       {
         if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem &&
              strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem )
-        {
           goto Found_Strike;
-        }
 
         strike++;
       }
@@ -568,17 +615,20 @@
 
   Found_Strike:
 
-    /* Now lookup the glyph's position within the file */
+    /* now look up the glyph's position within the file */
     {
       FT_UInt  char_len;
 
 
       char_len = 4;
-      if ( strike->flags & 1 ) char_len += 1;
-      if ( strike->flags & 2 ) char_len += 1;
-      if ( strike->flags & 4 ) char_len += 1;
+      if ( strike->flags & PFR_BITMAP_2BYTE_CHARCODE )
+        char_len += 1;
+      if ( strike->flags & PFR_BITMAP_2BYTE_SIZE )
+        char_len += 1;
+      if ( strike->flags & PFR_BITMAP_3BYTE_OFFSET )
+        char_len += 1;
 
-      /* Access data directly in the frame to speed lookups */
+      /* access data directly in the frame to speed lookups */
       if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) ||
            FT_FRAME_ENTER( char_len * strike->num_bitmaps )        )
         goto Exit;
@@ -586,7 +636,7 @@
       pfr_lookup_bitmap_data( stream->cursor,
                               stream->limit,
                               strike->num_bitmaps,
-                              strike->flags,
+                              &strike->flags,
                               character->char_code,
                               &gps_offset,
                               &gps_size );
@@ -595,7 +645,7 @@
 
       if ( gps_size == 0 )
       {
-        /* Could not find a bitmap program string for this glyph */
+        /* could not find a bitmap program string for this glyph */
         error = FT_THROW( Invalid_Argument );
         goto Exit;
       }
@@ -617,8 +667,8 @@
 
       glyph->root.linearHoriAdvance = advance;
 
-      /* compute default advance, i.e., scaled advance.  This can be */
-      /* overridden in the bitmap header of certain glyphs.          */
+      /* compute default advance, i.e., scaled advance; this can be */
+      /* overridden in the bitmap header of certain glyphs          */
       advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8,
                            character->advance,
                            (FT_Long)phys->metrics_resolution );
@@ -633,6 +683,55 @@
                                        &xpos, &ypos,
                                        &xsize, &ysize,
                                        &advance, &format );
+      if ( error )
+        goto Exit1;
+
+      /*
+       * Before allocating the target bitmap, we check whether the given
+       * bitmap dimensions are valid, depending on the image format.
+       *
+       * Format 0: We have a stream of pixels (with 8 pixels per byte).
+       *
+       *             (xsize * ysize + 7) / 8 <= gps_size
+       *
+       * Format 1: Run-length encoding; the high nibble holds the number of
+       *           white bits, the low nibble the number of black bits.  In
+       *           other words, a single byte can represent at most 15
+       *           pixels.
+       *
+       *             xsize * ysize <= 15 * gps_size
+       *
+       * Format 2: Run-length encoding; the high byte holds the number of
+       *           white bits, the low byte the number of black bits.  In
+       *           other words, two bytes can represent at most 255 pixels.
+       *
+       *             xsize * ysize <= 255 * (gps_size + 1) / 2
+       */
+      switch ( format )
+      {
+      case 0:
+        if ( ( (FT_ULong)xsize * ysize + 7 ) / 8 > gps_size )
+          error = FT_THROW( Invalid_Table );
+        break;
+      case 1:
+        if ( (FT_ULong)xsize * ysize > 15 * gps_size )
+          error = FT_THROW( Invalid_Table );
+        break;
+      case 2:
+        if ( (FT_ULong)xsize * ysize > 255 * ( ( gps_size + 1 ) / 2 ) )
+          error = FT_THROW( Invalid_Table );
+        break;
+      default:
+        FT_ERROR(( "pfr_slot_load_bitmap: invalid image type\n" ));
+        error = FT_THROW( Invalid_Table );
+      }
+
+      if ( error )
+      {
+        if ( FT_ERR_EQ( error, Invalid_Table ) )
+          FT_ERROR(( "pfr_slot_load_bitmap: invalid bitmap dimensions\n" ));
+        goto Exit1;
+      }
 
       /*
        * XXX: on 16bit systems we return an error for huge bitmaps
@@ -666,8 +765,8 @@
         /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */
         glyph->root.metrics.width        = (FT_Pos)xsize << 6;
         glyph->root.metrics.height       = (FT_Pos)ysize << 6;
-        glyph->root.metrics.horiBearingX = xpos << 6;
-        glyph->root.metrics.horiBearingY = ypos << 6;
+        glyph->root.metrics.horiBearingX = xpos * 64;
+        glyph->root.metrics.horiBearingY = ypos * 64;
         glyph->root.metrics.horiAdvance  = FT_PIX_ROUND( ( advance >> 2 ) );
         glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1;
         glyph->root.metrics.vertBearingY = 0;
@@ -677,6 +776,9 @@
         glyph->root.bitmap_left = (FT_Int)xpos;
         glyph->root.bitmap_top  = (FT_Int)( ypos + (FT_Long)ysize );
 
+        if ( metrics_only )
+          goto Exit1;
+
         /* Allocate and read bitmap data */
         {
           FT_ULong  len = (FT_ULong)glyph->root.bitmap.pitch * ysize;
@@ -684,17 +786,17 @@
 
           error = ft_glyphslot_alloc_bitmap( &glyph->root, len );
           if ( !error )
-          {
             error = pfr_load_bitmap_bits(
                       p,
                       stream->limit,
                       format,
-                      FT_BOOL(face->header.color_flags & 2),
+                      FT_BOOL( face->header.color_flags &
+                               PFR_FLAG_INVERT_BITMAP   ),
                       &glyph->root.bitmap );
-          }
         }
       }
 
+    Exit1:
       FT_FRAME_EXIT();
     }
 
@@ -702,4 +804,5 @@
     return error;
   }
 
+
 /* END */
diff --git a/src/pfr/pfrsbit.h b/src/pfr/pfrsbit.h
index 0db2cd5..07b27bc 100644
--- a/src/pfr/pfrsbit.h
+++ b/src/pfr/pfrsbit.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR bitmap loader (specification).                          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRSBIT_H__
-#define __PFRSBIT_H__
+#ifndef PFRSBIT_H_
+#define PFRSBIT_H_
 
 #include "pfrobjs.h"
 
@@ -26,11 +26,12 @@
   FT_LOCAL( FT_Error )
   pfr_slot_load_bitmap( PFR_Slot  glyph,
                         PFR_Size  size,
-                        FT_UInt   glyph_index );
+                        FT_UInt   glyph_index,
+                        FT_Bool   metrics_only );
 
 FT_END_HEADER
 
-#endif /* __PFR_SBIT_H__ */
+#endif /* PFRSBIT_H_ */
 
 
 /* END */
diff --git a/src/pfr/pfrtypes.h b/src/pfr/pfrtypes.h
index 5ffb1b1..058d6aa 100644
--- a/src/pfr/pfrtypes.h
+++ b/src/pfr/pfrtypes.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR data structures (specification only).                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PFRTYPES_H__
-#define __PFRTYPES_H__
+#ifndef PFRTYPES_H_
+#define PFRTYPES_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
@@ -69,12 +69,8 @@
 
 
   /* used in `color_flags' field of the PFR_Header */
-  typedef enum  PFR_HeaderFlags_
-  {
-    PFR_FLAG_BLACK_PIXEL   = 1,
-    PFR_FLAG_INVERT_BITMAP = 2
-
-  } PFR_HeaderFlags;
+#define PFR_FLAG_BLACK_PIXEL    0x01U
+#define PFR_FLAG_INVERT_BITMAP  0x02U
 
 
   /************************************************************************/
@@ -96,36 +92,27 @@
   } PFR_LogFontRec, *PFR_LogFont;
 
 
-  typedef enum  PFR_LogFlags_
-  {
-    PFR_LOG_EXTRA_ITEMS  = 0x40,
-    PFR_LOG_2BYTE_BOLD   = 0x20,
-    PFR_LOG_BOLD         = 0x10,
-    PFR_LOG_2BYTE_STROKE = 8,
-    PFR_LOG_STROKE       = 4,
-    PFR_LINE_JOIN_MASK   = 3
+#define PFR_LINE_JOIN_MITER   0x00U
+#define PFR_LINE_JOIN_ROUND   0x01U
+#define PFR_LINE_JOIN_BEVEL   0x02U
+#define PFR_LINE_JOIN_MASK    ( PFR_LINE_JOIN_ROUND | PFR_LINE_JOIN_BEVEL )
 
-  } PFR_LogFlags;
-
-
-  typedef enum  PFR_LineJoinFlags_
-  {
-    PFR_LINE_JOIN_MITER = 0,
-    PFR_LINE_JOIN_ROUND = 1,
-    PFR_LINE_JOIN_BEVEL = 2
-
-  } PFR_LineJoinFlags;
+#define PFR_LOG_STROKE        0x04U
+#define PFR_LOG_2BYTE_STROKE  0x08U
+#define PFR_LOG_BOLD          0x10U
+#define PFR_LOG_2BYTE_BOLD    0x20U
+#define PFR_LOG_EXTRA_ITEMS   0x40U
 
 
   /************************************************************************/
 
-  typedef enum  PFR_BitmapFlags_
-  {
-    PFR_BITMAP_3BYTE_OFFSET   = 4,
-    PFR_BITMAP_2BYTE_SIZE     = 2,
-    PFR_BITMAP_2BYTE_CHARCODE = 1
+#define PFR_BITMAP_2BYTE_CHARCODE  0x01U
+#define PFR_BITMAP_2BYTE_SIZE      0x02U
+#define PFR_BITMAP_3BYTE_OFFSET    0x04U
 
-  } PFR_BitmapFlags;
+  /*not part of the specification but used for implementation */
+#define PFR_BITMAP_CHARCODES_VALIDATED  0x40U
+#define PFR_BITMAP_VALID_CHARCODES      0x80U
 
 
   typedef struct  PFR_BitmapCharRec_
@@ -137,15 +124,11 @@
   } PFR_BitmapCharRec, *PFR_BitmapChar;
 
 
-  typedef enum  PFR_StrikeFlags_
-  {
-    PFR_STRIKE_2BYTE_COUNT  = 0x10,
-    PFR_STRIKE_3BYTE_OFFSET = 0x08,
-    PFR_STRIKE_3BYTE_SIZE   = 0x04,
-    PFR_STRIKE_2BYTE_YPPM   = 0x02,
-    PFR_STRIKE_2BYTE_XPPM   = 0x01
-
-  } PFR_StrikeFlags;
+#define PFR_STRIKE_2BYTE_XPPM    0x01U
+#define PFR_STRIKE_2BYTE_YPPM    0x02U
+#define PFR_STRIKE_3BYTE_SIZE    0x04U
+#define PFR_STRIKE_3BYTE_OFFSET  0x08U
+#define PFR_STRIKE_2BYTE_COUNT   0x10U
 
 
   typedef struct  PFR_StrikeRec_
@@ -266,38 +249,29 @@
   } PFR_PhyFontRec, *PFR_PhyFont;
 
 
-  typedef enum  PFR_PhyFlags_
-  {
-    PFR_PHY_EXTRA_ITEMS      = 0x80,
-    PFR_PHY_3BYTE_GPS_OFFSET = 0x20,
-    PFR_PHY_2BYTE_GPS_SIZE   = 0x10,
-    PFR_PHY_ASCII_CODE       = 0x08,
-    PFR_PHY_PROPORTIONAL     = 0x04,
-    PFR_PHY_2BYTE_CHARCODE   = 0x02,
-    PFR_PHY_VERTICAL         = 0x01
-
-  } PFR_PhyFlags;
+#define PFR_PHY_VERTICAL          0x01U
+#define PFR_PHY_2BYTE_CHARCODE    0x02U
+#define PFR_PHY_PROPORTIONAL      0x04U
+#define PFR_PHY_ASCII_CODE        0x08U
+#define PFR_PHY_2BYTE_GPS_SIZE    0x10U
+#define PFR_PHY_3BYTE_GPS_OFFSET  0x20U
+#define PFR_PHY_EXTRA_ITEMS       0x80U
 
 
-  typedef enum PFR_KernFlags_
-  {
-    PFR_KERN_2BYTE_CHAR  = 0x01,
-    PFR_KERN_2BYTE_ADJ   = 0x02
-
-  } PFR_KernFlags;
+#define PFR_KERN_2BYTE_CHAR  0x01U
+#define PFR_KERN_2BYTE_ADJ   0x02U
 
 
   /************************************************************************/
 
-  typedef enum  PFR_GlyphFlags_
-  {
-    PFR_GLYPH_IS_COMPOUND   = 0x80,
-    PFR_GLYPH_EXTRA_ITEMS   = 0x08,
-    PFR_GLYPH_1BYTE_XYCOUNT = 0x04,
-    PFR_GLYPH_XCOUNT        = 0x02,
-    PFR_GLYPH_YCOUNT        = 0x01
+#define PFR_GLYPH_YCOUNT         0x01U
+#define PFR_GLYPH_XCOUNT         0x02U
+#define PFR_GLYPH_1BYTE_XYCOUNT  0x04U
 
-  } PFR_GlyphFlags;
+#define PFR_GLYPH_SINGLE_EXTRA_ITEMS    0x08U
+#define PFR_GLYPH_COMPOUND_EXTRA_ITEMS  0x40U
+
+#define PFR_GLYPH_IS_COMPOUND  0x80U
 
 
   /* controlled coordinate */
@@ -321,14 +295,10 @@
   } PFR_SubGlyphRec, *PFR_SubGlyph;
 
 
-  typedef enum  PFR_SubgGlyphFlags_
-  {
-    PFR_SUBGLYPH_3BYTE_OFFSET = 0x80,
-    PFR_SUBGLYPH_2BYTE_SIZE   = 0x40,
-    PFR_SUBGLYPH_YSCALE       = 0x20,
-    PFR_SUBGLYPH_XSCALE       = 0x10
-
-  } PFR_SubGlyphFlags;
+#define PFR_SUBGLYPH_XSCALE        0x10U
+#define PFR_SUBGLYPH_YSCALE        0x20U
+#define PFR_SUBGLYPH_2BYTE_SIZE    0x40U
+#define PFR_SUBGLYPH_3BYTE_OFFSET  0x80U
 
 
   typedef struct  PFR_GlyphRec_
@@ -356,7 +326,7 @@
 
 FT_END_HEADER
 
-#endif /* __PFRTYPES_H__ */
+#endif /* PFRTYPES_H_ */
 
 
 /* END */
diff --git a/src/pfr/rules.mk b/src/pfr/rules.mk
index e665460..3acb795 100644
--- a/src/pfr/rules.mk
+++ b/src/pfr/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/psaux/Jamfile b/src/psaux/Jamfile
index d7c2e6c..a231d59 100644
--- a/src/psaux/Jamfile
+++ b/src/psaux/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/psaux Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,8 +16,22 @@
 
   if $(FT2_MULTI)
   {
-    _sources = psauxmod psobjs   t1decode t1cmap
-               psconv   afmparse
+    _sources = afmparse
+               psauxmod
+               psconv
+               psobjs
+               t1cmap
+               t1decode
+               cffdecode
+               psarrst
+               psblues
+               pserror
+               psfont
+               psft
+               pshints
+               psintrp
+               psread
+               psstack
                ;
   }
   else
diff --git a/src/psaux/afmparse.c b/src/psaux/afmparse.c
index 3ad44ec..0c33d59 100644
--- a/src/psaux/afmparse.c
+++ b/src/psaux/afmparse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM parser (body).                                                   */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,8 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
 #include "afmparse.h"
 #include "psconv.h"
 
@@ -973,5 +975,12 @@
     return error;
   }
 
+#else /* T1_CONFIG_OPTION_NO_AFM */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _afm_parse_dummy;
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
 
 /* END */
diff --git a/src/psaux/afmparse.h b/src/psaux/afmparse.h
index f922c4e..86f852a 100644
--- a/src/psaux/afmparse.h
+++ b/src/psaux/afmparse.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM parser (specification).                                          */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __AFMPARSE_H__
-#define __AFMPARSE_H__
+#ifndef AFMPARSE_H_
+#define AFMPARSE_H_
 
 
 #include <ft2build.h>
@@ -83,7 +83,7 @@
 
 FT_END_HEADER
 
-#endif /* __AFMPARSE_H__ */
+#endif /* AFMPARSE_H_ */
 
 
 /* END */
diff --git a/src/psaux/cffdecode.c b/src/psaux/cffdecode.c
new file mode 100644
index 0000000..80d622c
--- /dev/null
+++ b/src/psaux/cffdecode.c
@@ -0,0 +1,2370 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdecode.c                                                            */
+/*                                                                         */
+/*    PostScript CFF (Type 2) decoding routines (body).                    */
+/*                                                                         */
+/*  Copyright 2017-2018 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_FREETYPE_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "cffdecode.h"
+#include "psobjs.h"
+
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffdecode
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  typedef enum  CFF_Operator_
+  {
+    cff_op_unknown = 0,
+
+    cff_op_rmoveto,
+    cff_op_hmoveto,
+    cff_op_vmoveto,
+
+    cff_op_rlineto,
+    cff_op_hlineto,
+    cff_op_vlineto,
+
+    cff_op_rrcurveto,
+    cff_op_hhcurveto,
+    cff_op_hvcurveto,
+    cff_op_rcurveline,
+    cff_op_rlinecurve,
+    cff_op_vhcurveto,
+    cff_op_vvcurveto,
+
+    cff_op_flex,
+    cff_op_hflex,
+    cff_op_hflex1,
+    cff_op_flex1,
+
+    cff_op_endchar,
+
+    cff_op_hstem,
+    cff_op_vstem,
+    cff_op_hstemhm,
+    cff_op_vstemhm,
+
+    cff_op_hintmask,
+    cff_op_cntrmask,
+    cff_op_dotsection,  /* deprecated, acts as no-op */
+
+    cff_op_abs,
+    cff_op_add,
+    cff_op_sub,
+    cff_op_div,
+    cff_op_neg,
+    cff_op_random,
+    cff_op_mul,
+    cff_op_sqrt,
+
+    cff_op_blend,
+
+    cff_op_drop,
+    cff_op_exch,
+    cff_op_index,
+    cff_op_roll,
+    cff_op_dup,
+
+    cff_op_put,
+    cff_op_get,
+    cff_op_store,
+    cff_op_load,
+
+    cff_op_and,
+    cff_op_or,
+    cff_op_not,
+    cff_op_eq,
+    cff_op_ifelse,
+
+    cff_op_callsubr,
+    cff_op_callgsubr,
+    cff_op_return,
+
+    /* Type 1 opcodes: invalid but seen in real life */
+    cff_op_hsbw,
+    cff_op_closepath,
+    cff_op_callothersubr,
+    cff_op_pop,
+    cff_op_seac,
+    cff_op_sbw,
+    cff_op_setcurrentpoint,
+
+    /* do not remove */
+    cff_op_max
+
+  } CFF_Operator;
+
+
+#define CFF_COUNT_CHECK_WIDTH  0x80
+#define CFF_COUNT_EXACT        0x40
+#define CFF_COUNT_CLEAR_STACK  0x20
+
+  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */
+  /* used for checking the width and requested numbers of arguments    */
+  /* only; they are set to zero afterwards                             */
+
+  /* the other two flags are informative only and unused currently     */
+
+  static const FT_Byte  cff_argument_counts[] =
+  {
+    0,  /* unknown */
+
+    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    13, /* flex */
+    7,
+    9,
+    11,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
+
+    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
+    0, /* dotsection */
+
+    1, /* abs */
+    2,
+    2,
+    2,
+    1,
+    0,
+    2,
+    1,
+
+    1, /* blend */
+
+    1, /* drop */
+    2,
+    1,
+    2,
+    1,
+
+    2, /* put */
+    1,
+    4,
+    3,
+
+    2, /* and */
+    2,
+    1,
+    2,
+    4,
+
+    1, /* callsubr */
+    1,
+    0,
+
+    2, /* hsbw */
+    0,
+    0,
+    0,
+    5, /* seac */
+    4, /* sbw */
+    2  /* setcurrentpoint */
+  };
+
+
+  static FT_Error
+  cff_operator_seac( CFF_Decoder*  decoder,
+                     FT_Pos        asb,
+                     FT_Pos        adx,
+                     FT_Pos        ady,
+                     FT_Int        bchar,
+                     FT_Int        achar )
+  {
+    FT_Error      error;
+    CFF_Builder*  builder = &decoder->builder;
+    FT_Int        bchar_index, achar_index;
+    TT_Face       face    = decoder->builder.face;
+    FT_Vector     left_bearing, advance;
+    FT_Byte*      charstring;
+    FT_ULong      charstring_len;
+    FT_Pos        glyph_width;
+
+
+    if ( decoder->seac )
+    {
+      FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    adx += decoder->builder.left_bearing.x;
+    ady += decoder->builder.left_bearing.y;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* Incremental fonts don't necessarily have valid charsets.        */
+    /* They use the character code, not the glyph index, in this case. */
+    if ( face->root.internal->incremental_interface )
+    {
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+    }
+
+    if ( bchar_index < 0 || achar_index < 0 )
+    {
+      FT_ERROR(( "cff_operator_seac:"
+                 " invalid seac character code arguments\n" ));
+      return FT_THROW( Syntax_Error );
+    }
+
+    /* If we are trying to load a composite glyph, do not load the */
+    /* accent character and return the array of subglyphs.         */
+    if ( builder->no_recurse )
+    {
+      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;
+      FT_GlyphLoader  loader = glyph->internal->loader;
+      FT_SubGlyph     subg;
+
+
+      /* reallocate subglyph array if necessary */
+      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+      if ( error )
+        goto Exit;
+
+      subg = loader->current.subglyphs;
+
+      /* subglyph 0 = base character */
+      subg->index = bchar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+      subg->arg1  = 0;
+      subg->arg2  = 0;
+      subg++;
+
+      /* subglyph 1 = accent character */
+      subg->index = achar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+      subg->arg1  = (FT_Int)( adx >> 16 );
+      subg->arg2  = (FT_Int)( ady >> 16 );
+
+      /* set up remaining glyph fields */
+      glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
+      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+      loader->current.num_subglyphs = 2;
+    }
+
+    FT_GlyphLoader_Prepare( builder->loader );
+
+    /* First load `bchar' in builder */
+    error = decoder->get_glyph_callback( face, (FT_UInt)bchar_index,
+                                         &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len, 0 );
+      decoder->seac = FALSE;
+
+      decoder->free_glyph_callback( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Save the left bearing, advance and glyph width of the base */
+    /* character as they will be erased by the next load.         */
+
+    left_bearing = builder->left_bearing;
+    advance      = builder->advance;
+    glyph_width  = decoder->glyph_width;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+
+    builder->pos_x = adx - asb;
+    builder->pos_y = ady;
+
+    /* Now load `achar' on top of the base outline. */
+    error = decoder->get_glyph_callback( face, (FT_UInt)achar_index,
+                                         &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len, 0 );
+      decoder->seac = FALSE;
+
+      decoder->free_glyph_callback( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Restore the left side bearing, advance and glyph width */
+    /* of the base character.                                 */
+    builder->left_bearing = left_bearing;
+    builder->advance      = advance;
+    decoder->glyph_width  = glyph_width;
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+  Exit:
+    return error;
+  }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********             GENERIC CHARSTRING PARSING               *********/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_compute_bias                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the bias value in dependence of the number of glyph       */
+  /*    subroutines.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */
+  /*                          dictionary.                                  */
+  /*                                                                       */
+  /*    num_subrs          :: The number of glyph subroutines.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The bias value.                                                    */
+  static FT_Int
+  cff_compute_bias( FT_Int   in_charstring_type,
+                    FT_UInt  num_subrs )
+  {
+    FT_Int  result;
+
+
+    if ( in_charstring_type == 1 )
+      result = 0;
+    else if ( num_subrs < 1240 )
+      result = 107;
+    else if ( num_subrs < 33900U )
+      result = 1131;
+    else
+      result = 32768U;
+
+    return result;
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode )
+  {
+    FT_UInt    n;
+    FT_UShort  glyph_sid;
+
+    FT_Service_CFFLoad  cffload;
+
+
+    /* CID-keyed fonts don't have glyph names */
+    if ( !cff->charset.sids )
+      return -1;
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+#if 0
+    /* retrieve cffload from list of current modules */
+    FT_Service_CFFLoad  cffload;
+
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD );
+    if ( !cffload )
+    {
+      FT_ERROR(( "cff_lookup_glyph_by_stdcharcode:"
+                 " the `cffload' module is not available\n" ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+#endif
+
+    cffload = (FT_Service_CFFLoad)cff->cffload;
+
+    /* Get code to SID mapping from `cff_standard_encoding'. */
+    glyph_sid = cffload->get_standard_encoding( (FT_UInt)charcode );
+
+    for ( n = 0; n < cff->num_glyphs; n++ )
+    {
+      if ( cff->charset.sids[n] == glyph_sid )
+        return (FT_Int)n;
+    }
+
+    return -1;
+  }
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_parse_charstrings                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 2 charstrings program.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charstring_base :: The base of the charstring stream.              */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /*    in_dict         :: Set to 1 if function is called from top or      */
+  /*                       private DICT (needed for Multiple Master CFFs). */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len,
+                                 FT_Bool       in_dict )
+  {
+    FT_Error           error;
+    CFF_Decoder_Zone*  zone;
+    FT_Byte*           ip;
+    FT_Byte*           limit;
+    CFF_Builder*       builder = &decoder->builder;
+    FT_Pos             x, y;
+    FT_Fixed*          stack;
+    FT_Int             charstring_type =
+                         decoder->cff->top_font.font_dict.charstring_type;
+    FT_UShort          num_designs =
+                         decoder->cff->top_font.font_dict.num_designs;
+    FT_UShort          num_axes =
+                         decoder->cff->top_font.font_dict.num_axes;
+
+    T2_Hints_Funcs  hinter;
+
+
+    /* set default width */
+    decoder->num_hints  = 0;
+    decoder->read_width = 1;
+
+    /* initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+    stack         = decoder->top;
+
+    hinter = (T2_Hints_Funcs)builder->hints_funcs;
+
+    builder->path_begun = 0;
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    error = FT_Err_Ok;
+
+    x = builder->pos_x;
+    y = builder->pos_y;
+
+    /* begin hints recording session, if any */
+    if ( hinter )
+      hinter->open( hinter->hints );
+
+    /* now execute loop */
+    while ( ip < limit )
+    {
+      CFF_Operator  op;
+      FT_Byte       v;
+
+
+      /********************************************************************/
+      /*                                                                  */
+      /* Decode operator or operand                                       */
+      /*                                                                  */
+      v = *ip++;
+      if ( v >= 32 || v == 28 )
+      {
+        FT_Int    shift = 16;
+        FT_Int32  val;
+
+
+        /* this is an operand, push it on the stack */
+
+        /* if we use shifts, all computations are done with unsigned */
+        /* values; the conversion to a signed value is the last step */
+        if ( v == 28 )
+        {
+          if ( ip + 1 >= limit )
+            goto Syntax_Error;
+          val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] );
+          ip += 2;
+        }
+        else if ( v < 247 )
+          val = (FT_Int32)v - 139;
+        else if ( v < 251 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
+        }
+        else if ( v < 255 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
+        }
+        else
+        {
+          if ( ip + 3 >= limit )
+            goto Syntax_Error;
+          val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] <<  8 ) |
+                              (FT_UInt32)ip[3]         );
+          ip += 4;
+          if ( charstring_type == 2 )
+            shift = 0;
+        }
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+        val             = (FT_Int32)( (FT_UInt32)val << shift );
+        *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( !( val & 0xFFFFL ) )
+          FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
+        else
+          FT_TRACE4(( " %.5f", val / 65536.0 ));
+#endif
+
+      }
+      else
+      {
+        /* The specification says that normally arguments are to be taken */
+        /* from the bottom of the stack.  However, this seems not to be   */
+        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
+        /* arguments similar to a PS interpreter.                         */
+
+        FT_Fixed*  args     = decoder->top;
+        FT_Int     num_args = (FT_Int)( args - decoder->stack );
+        FT_Int     req_args;
+
+
+        /* find operator */
+        op = cff_op_unknown;
+
+        switch ( v )
+        {
+        case 1:
+          op = cff_op_hstem;
+          break;
+        case 3:
+          op = cff_op_vstem;
+          break;
+        case 4:
+          op = cff_op_vmoveto;
+          break;
+        case 5:
+          op = cff_op_rlineto;
+          break;
+        case 6:
+          op = cff_op_hlineto;
+          break;
+        case 7:
+          op = cff_op_vlineto;
+          break;
+        case 8:
+          op = cff_op_rrcurveto;
+          break;
+        case 9:
+          op = cff_op_closepath;
+          break;
+        case 10:
+          op = cff_op_callsubr;
+          break;
+        case 11:
+          op = cff_op_return;
+          break;
+        case 12:
+          if ( ip >= limit )
+            goto Syntax_Error;
+          v = *ip++;
+
+          switch ( v )
+          {
+          case 0:
+            op = cff_op_dotsection;
+            break;
+          case 1: /* this is actually the Type1 vstem3 operator */
+            op = cff_op_vstem;
+            break;
+          case 2: /* this is actually the Type1 hstem3 operator */
+            op = cff_op_hstem;
+            break;
+          case 3:
+            op = cff_op_and;
+            break;
+          case 4:
+            op = cff_op_or;
+            break;
+          case 5:
+            op = cff_op_not;
+            break;
+          case 6:
+            op = cff_op_seac;
+            break;
+          case 7:
+            op = cff_op_sbw;
+            break;
+          case 8:
+            op = cff_op_store;
+            break;
+          case 9:
+            op = cff_op_abs;
+            break;
+          case 10:
+            op = cff_op_add;
+            break;
+          case 11:
+            op = cff_op_sub;
+            break;
+          case 12:
+            op = cff_op_div;
+            break;
+          case 13:
+            op = cff_op_load;
+            break;
+          case 14:
+            op = cff_op_neg;
+            break;
+          case 15:
+            op = cff_op_eq;
+            break;
+          case 16:
+            op = cff_op_callothersubr;
+            break;
+          case 17:
+            op = cff_op_pop;
+            break;
+          case 18:
+            op = cff_op_drop;
+            break;
+          case 20:
+            op = cff_op_put;
+            break;
+          case 21:
+            op = cff_op_get;
+            break;
+          case 22:
+            op = cff_op_ifelse;
+            break;
+          case 23:
+            op = cff_op_random;
+            break;
+          case 24:
+            op = cff_op_mul;
+            break;
+          case 26:
+            op = cff_op_sqrt;
+            break;
+          case 27:
+            op = cff_op_dup;
+            break;
+          case 28:
+            op = cff_op_exch;
+            break;
+          case 29:
+            op = cff_op_index;
+            break;
+          case 30:
+            op = cff_op_roll;
+            break;
+          case 33:
+            op = cff_op_setcurrentpoint;
+            break;
+          case 34:
+            op = cff_op_hflex;
+            break;
+          case 35:
+            op = cff_op_flex;
+            break;
+          case 36:
+            op = cff_op_hflex1;
+            break;
+          case 37:
+            op = cff_op_flex1;
+            break;
+          default:
+            FT_TRACE4(( " unknown op (12, %d)\n", v ));
+            break;
+          }
+          break;
+        case 13:
+          op = cff_op_hsbw;
+          break;
+        case 14:
+          op = cff_op_endchar;
+          break;
+        case 16:
+          op = cff_op_blend;
+          break;
+        case 18:
+          op = cff_op_hstemhm;
+          break;
+        case 19:
+          op = cff_op_hintmask;
+          break;
+        case 20:
+          op = cff_op_cntrmask;
+          break;
+        case 21:
+          op = cff_op_rmoveto;
+          break;
+        case 22:
+          op = cff_op_hmoveto;
+          break;
+        case 23:
+          op = cff_op_vstemhm;
+          break;
+        case 24:
+          op = cff_op_rcurveline;
+          break;
+        case 25:
+          op = cff_op_rlinecurve;
+          break;
+        case 26:
+          op = cff_op_vvcurveto;
+          break;
+        case 27:
+          op = cff_op_hhcurveto;
+          break;
+        case 29:
+          op = cff_op_callgsubr;
+          break;
+        case 30:
+          op = cff_op_vhcurveto;
+          break;
+        case 31:
+          op = cff_op_hvcurveto;
+          break;
+        default:
+          FT_TRACE4(( " unknown op (%d)\n", v ));
+          break;
+        }
+
+        if ( op == cff_op_unknown )
+          continue;
+
+        /* in Multiple Master CFFs, T2 charstrings can appear in */
+        /* dictionaries, but some operators are prohibited       */
+        if ( in_dict )
+        {
+          switch ( op )
+          {
+          case cff_op_hstem:
+          case cff_op_vstem:
+          case cff_op_vmoveto:
+          case cff_op_rlineto:
+          case cff_op_hlineto:
+          case cff_op_vlineto:
+          case cff_op_rrcurveto:
+          case cff_op_hstemhm:
+          case cff_op_hintmask:
+          case cff_op_cntrmask:
+          case cff_op_rmoveto:
+          case cff_op_hmoveto:
+          case cff_op_vstemhm:
+          case cff_op_rcurveline:
+          case cff_op_rlinecurve:
+          case cff_op_vvcurveto:
+          case cff_op_hhcurveto:
+          case cff_op_vhcurveto:
+          case cff_op_hvcurveto:
+          case cff_op_hflex:
+          case cff_op_flex:
+          case cff_op_hflex1:
+          case cff_op_flex1:
+          case cff_op_callsubr:
+          case cff_op_callgsubr:
+            goto MM_Error;
+
+          default:
+            break;
+          }
+        }
+
+        /* check arguments */
+        req_args = cff_argument_counts[op];
+        if ( req_args & CFF_COUNT_CHECK_WIDTH )
+        {
+          if ( num_args > 0 && decoder->read_width )
+          {
+            /* If `nominal_width' is non-zero, the number is really a      */
+            /* difference against `nominal_width'.  Else, the number here  */
+            /* is truly a width, not a difference against `nominal_width'. */
+            /* If the font does not set `nominal_width', then              */
+            /* `nominal_width' defaults to zero, and so we can set         */
+            /* `glyph_width' to `nominal_width' plus number on the stack   */
+            /* -- for either case.                                         */
+
+            FT_Int  set_width_ok;
+
+
+            switch ( op )
+            {
+            case cff_op_hmoveto:
+            case cff_op_vmoveto:
+              set_width_ok = num_args & 2;
+              break;
+
+            case cff_op_hstem:
+            case cff_op_vstem:
+            case cff_op_hstemhm:
+            case cff_op_vstemhm:
+            case cff_op_rmoveto:
+            case cff_op_hintmask:
+            case cff_op_cntrmask:
+              set_width_ok = num_args & 1;
+              break;
+
+            case cff_op_endchar:
+              /* If there is a width specified for endchar, we either have */
+              /* 1 argument or 5 arguments.  We like to argue.             */
+              set_width_ok = in_dict
+                               ? 0
+                               : ( ( num_args == 5 ) || ( num_args == 1 ) );
+              break;
+
+            default:
+              set_width_ok = 0;
+              break;
+            }
+
+            if ( set_width_ok )
+            {
+              decoder->glyph_width = decoder->nominal_width +
+                                       ( stack[0] >> 16 );
+
+              if ( decoder->width_only )
+              {
+                /* we only want the advance width; stop here */
+                break;
+              }
+
+              /* Consumed an argument. */
+              num_args--;
+            }
+          }
+
+          decoder->read_width = 0;
+          req_args            = 0;
+        }
+
+        req_args &= 0x000F;
+        if ( num_args < req_args )
+          goto Stack_Underflow;
+        args     -= req_args;
+        num_args -= req_args;
+
+        /* At this point, `args' points to the first argument of the  */
+        /* operand in case `req_args' isn't zero.  Otherwise, we have */
+        /* to adjust `args' manually.                                 */
+
+        /* Note that we only pop arguments from the stack which we    */
+        /* really need and can digest so that we can continue in case */
+        /* of superfluous stack elements.                             */
+
+        switch ( op )
+        {
+        case cff_op_hstem:
+        case cff_op_vstem:
+        case cff_op_hstemhm:
+        case cff_op_vstemhm:
+          /* the number of arguments is always even here */
+          FT_TRACE4((
+              op == cff_op_hstem   ? " hstem\n"   :
+            ( op == cff_op_vstem   ? " vstem\n"   :
+            ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
+
+          if ( hinter )
+            hinter->stems( hinter->hints,
+                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
+                           num_args / 2,
+                           args - ( num_args & ~1 ) );
+
+          decoder->num_hints += num_args / 2;
+          args = stack;
+          break;
+
+        case cff_op_hintmask:
+        case cff_op_cntrmask:
+          FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+          /* implement vstem when needed --                        */
+          /* the specification doesn't say it, but this also works */
+          /* with the 'cntrmask' operator                          */
+          /*                                                       */
+          if ( num_args > 0 )
+          {
+            if ( hinter )
+              hinter->stems( hinter->hints,
+                             0,
+                             num_args / 2,
+                             args - ( num_args & ~1 ) );
+
+            decoder->num_hints += num_args / 2;
+          }
+
+          /* In a valid charstring there must be at least one byte */
+          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */
+          /* instruction).  Additionally, there must be space for  */
+          /* `num_hints' bits.                                     */
+
+          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
+            goto Syntax_Error;
+
+          if ( hinter )
+          {
+            if ( op == cff_op_hintmask )
+              hinter->hintmask( hinter->hints,
+                                (FT_UInt)builder->current->n_points,
+                                (FT_UInt)decoder->num_hints,
+                                ip );
+            else
+              hinter->counter( hinter->hints,
+                               (FT_UInt)decoder->num_hints,
+                               ip );
+          }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          {
+            FT_UInt  maskbyte;
+
+
+            FT_TRACE4(( " (maskbytes:" ));
+
+            for ( maskbyte = 0;
+                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
+                  maskbyte++, ip++ )
+              FT_TRACE4(( " 0x%02X", *ip ));
+
+            FT_TRACE4(( ")\n" ));
+          }
+#else
+          ip += ( decoder->num_hints + 7 ) >> 3;
+#endif
+          args = stack;
+          break;
+
+        case cff_op_rmoveto:
+          FT_TRACE4(( " rmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x    = ADD_LONG( x, args[-2] );
+          y    = ADD_LONG( y, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_vmoveto:
+          FT_TRACE4(( " vmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          y    = ADD_LONG( y, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_hmoveto:
+          FT_TRACE4(( " hmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x    = ADD_LONG( x, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_rlineto:
+          FT_TRACE4(( " rlineto\n" ));
+
+          if ( cff_builder_start_point( builder, x, y )  ||
+               cff_check_points( builder, num_args / 2 ) )
+            goto Fail;
+
+          if ( num_args < 2 )
+            goto Stack_Underflow;
+
+          args -= num_args & ~1;
+          while ( args < decoder->top )
+          {
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 1 );
+            args += 2;
+          }
+          args = stack;
+          break;
+
+        case cff_op_hlineto:
+        case cff_op_vlineto:
+          {
+            FT_Int  phase = ( op == cff_op_hlineto );
+
+
+            FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
+                                             : " vlineto\n" ));
+
+            if ( num_args < 0 )
+              goto Stack_Underflow;
+
+            /* there exist subsetted fonts (found in PDFs) */
+            /* which call `hlineto' without arguments      */
+            if ( num_args == 0 )
+              break;
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, num_args )    )
+              goto Fail;
+
+            args = stack;
+            while ( args < decoder->top )
+            {
+              if ( phase )
+                x = ADD_LONG( x, args[0] );
+              else
+                y = ADD_LONG( y, args[0] );
+
+              if ( cff_builder_add_point1( builder, x, y ) )
+                goto Fail;
+
+              args++;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rrcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rrcurveto\n" ));
+
+            if ( num_args < 6 )
+              goto Stack_Underflow;
+
+            nargs = num_args - num_args % 6;
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, nargs / 2 )   )
+              goto Fail;
+
+            args -= nargs;
+            while ( args < decoder->top )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[2] );
+              y = ADD_LONG( y, args[3] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[4] );
+              y = ADD_LONG( y, args[5] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 6;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vvcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " vvcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+
+            if ( nargs & 1 )
+            {
+              x = ADD_LONG( x, args[0] );
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              y = ADD_LONG( y, args[0] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[1] );
+              y = ADD_LONG( y, args[2] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              y = ADD_LONG( y, args[3] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_hhcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " hhcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+            if ( nargs & 1 )
+            {
+              y = ADD_LONG( y, args[0] );
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              x = ADD_LONG( x, args[0] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[1] );
+              y = ADD_LONG( y, args[2] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[3] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vhcurveto:
+        case cff_op_hvcurveto:
+          {
+            FT_Int  phase;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
+                                               : " hvcurveto\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
+            /* we enforce it by clearing the second bit               */
+
+            nargs = num_args & ~2;
+
+            args -= nargs;
+            if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
+              goto Stack_Underflow;
+
+            phase = ( op == cff_op_hvcurveto );
+
+            while ( nargs >= 4 )
+            {
+              nargs -= 4;
+              if ( phase )
+              {
+                x = ADD_LONG( x, args[0] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[1] );
+                y = ADD_LONG( y, args[2] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                y = ADD_LONG( y, args[3] );
+                if ( nargs == 1 )
+                  x = ADD_LONG( x, args[4] );
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              else
+              {
+                y = ADD_LONG( y, args[0] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[1] );
+                y = ADD_LONG( y, args[2] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[3] );
+                if ( nargs == 1 )
+                  y = ADD_LONG( y, args[4] );
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              args  += 4;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rlinecurve:
+          {
+            FT_Int  num_lines;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rlinecurve\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs     = num_args & ~1;
+            num_lines = ( nargs - 6 ) / 2;
+
+            if ( cff_builder_start_point( builder, x, y )   ||
+                 cff_check_points( builder, num_lines + 3 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the line segments */
+            while ( num_lines > 0 )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 2;
+              num_lines--;
+            }
+
+            /* then the curve */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            x = ADD_LONG( x, args[2] );
+            y = ADD_LONG( y, args[3] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            x = ADD_LONG( x, args[4] );
+            y = ADD_LONG( y, args[5] );
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+          }
+          break;
+
+        case cff_op_rcurveline:
+          {
+            FT_Int  num_curves;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rcurveline\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs      = num_args - 2;
+            nargs      = nargs - nargs % 6 + 2;
+            num_curves = ( nargs - 2 ) / 6;
+
+            if ( cff_builder_start_point( builder, x, y )        ||
+                 cff_check_points( builder, num_curves * 3 + 2 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the curves */
+            while ( num_curves > 0 )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[2] );
+              y = ADD_LONG( y, args[3] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[4] );
+              y = ADD_LONG( y, args[5] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 6;
+              num_curves--;
+            }
+
+            /* then the final line */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+          }
+          break;
+
+        case cff_op_hflex1:
+          {
+            FT_Pos  start_y;
+
+
+            FT_TRACE4(( " hflex1\n" ));
+
+            /* adding five more points: 4 control points, 1 on-curve point */
+            /* -- make sure we have enough space for the start point if it */
+            /* needs to be added                                           */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y position for later use */
+            start_y = y;
+
+            /* first control point */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x = ADD_LONG( x, args[2] );
+            y = ADD_LONG( y, args[3] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x = ADD_LONG( x, args[4] );
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x = ADD_LONG( x, args[5] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x = ADD_LONG( x, args[6] );
+            y = ADD_LONG( y, args[7] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start   */
+            x = ADD_LONG( x, args[8] );
+            y = start_y;
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_hflex:
+          {
+            FT_Pos  start_y;
+
+
+            FT_TRACE4(( " hflex\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y-position for later use */
+            start_y = y;
+
+            /* first control point */
+            x = ADD_LONG( x, args[0] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x = ADD_LONG( x, args[1] );
+            y = ADD_LONG( y, args[2] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x = ADD_LONG( x, args[3] );
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x = ADD_LONG( x, args[4] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x = ADD_LONG( x, args[5] );
+            y = start_y;
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start point's */
+            /* y-value -- we don't add this point, though               */
+            x = ADD_LONG( x, args[6] );
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_flex1:
+          {
+            FT_Pos     start_x, start_y; /* record start x, y values for */
+                                         /* alter use                    */
+            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */
+                                         /* algorithm below              */
+            FT_Int     horizontal, count;
+            FT_Fixed*  temp;
+
+
+            FT_TRACE4(( " flex1\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's x, y position for later use */
+            start_x = x;
+            start_y = y;
+
+            /* XXX: figure out whether this is supposed to be a horizontal */
+            /*      or vertical flex; the Type 2 specification is vague... */
+
+            temp = args;
+
+            /* grab up to the last argument */
+            for ( count = 5; count > 0; count-- )
+            {
+              dx    = ADD_LONG( dx, temp[0] );
+              dy    = ADD_LONG( dy, temp[1] );
+              temp += 2;
+            }
+
+            if ( dx < 0 )
+              dx = -dx;
+            if ( dy < 0 )
+              dy = -dy;
+
+            /* strange test, but here it is... */
+            horizontal = ( dx > dy );
+
+            for ( count = 5; count > 0; count-- )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 3 ) );
+              args += 2;
+            }
+
+            /* is last operand an x- or y-delta? */
+            if ( horizontal )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = start_y;
+            }
+            else
+            {
+              x = start_x;
+              y = ADD_LONG( y, args[0] );
+            }
+
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+           }
+
+        case cff_op_flex:
+          {
+            FT_UInt  count;
+
+
+            FT_TRACE4(( " flex\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            for ( count = 6; count > 0; count-- )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 4 || count == 1 ) );
+              args += 2;
+            }
+
+            args = stack;
+          }
+          break;
+
+        case cff_op_seac:
+          FT_TRACE4(( " seac\n" ));
+
+          error = cff_operator_seac( decoder,
+                                     args[0], args[1], args[2],
+                                     (FT_Int)( args[3] >> 16 ),
+                                     (FT_Int)( args[4] >> 16 ) );
+
+          /* add current outline to the glyph slot */
+          FT_GlyphLoader_Add( builder->loader );
+
+          /* return now! */
+          FT_TRACE4(( "\n" ));
+          return error;
+
+        case cff_op_endchar:
+          /* in dictionaries, `endchar' simply indicates end of data */
+          if ( in_dict )
+            return error;
+
+          FT_TRACE4(( " endchar\n" ));
+
+          /* We are going to emulate the seac operator. */
+          if ( num_args >= 4 )
+          {
+            /* Save glyph width so that the subglyphs don't overwrite it. */
+            FT_Pos  glyph_width = decoder->glyph_width;
+
+
+            error = cff_operator_seac( decoder,
+                                       0L, args[-4], args[-3],
+                                       (FT_Int)( args[-2] >> 16 ),
+                                       (FT_Int)( args[-1] >> 16 ) );
+
+            decoder->glyph_width = glyph_width;
+          }
+          else
+          {
+            cff_builder_close_contour( builder );
+
+            /* close hints recording session */
+            if ( hinter )
+            {
+              if ( hinter->close( hinter->hints,
+                                  (FT_UInt)builder->current->n_points ) )
+                goto Syntax_Error;
+
+              /* apply hints to the loaded glyph outline now */
+              error = hinter->apply( hinter->hints,
+                                     builder->current,
+                                     (PSH_Globals)builder->hints_globals,
+                                     decoder->hint_mode );
+              if ( error )
+                goto Fail;
+            }
+
+            /* add current outline to the glyph slot */
+            FT_GlyphLoader_Add( builder->loader );
+          }
+
+          /* return now! */
+          FT_TRACE4(( "\n" ));
+          return error;
+
+        case cff_op_abs:
+          FT_TRACE4(( " abs\n" ));
+
+          if ( args[0] < 0 )
+          {
+            if ( args[0] == FT_LONG_MIN )
+              args[0] = FT_LONG_MAX;
+            else
+              args[0] = -args[0];
+          }
+          args++;
+          break;
+
+        case cff_op_add:
+          FT_TRACE4(( " add\n" ));
+
+          args[0] = ADD_LONG( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_sub:
+          FT_TRACE4(( " sub\n" ));
+
+          args[0] = SUB_LONG( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_div:
+          FT_TRACE4(( " div\n" ));
+
+          args[0] = FT_DivFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_neg:
+          FT_TRACE4(( " neg\n" ));
+
+          if ( args[0] == FT_LONG_MIN )
+            args[0] = FT_LONG_MAX;
+          args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_random:
+          FT_TRACE4(( " random\n" ));
+
+          /* only use the lower 16 bits of `random'  */
+          /* to generate a number in the range (0;1] */
+          args[0] = (FT_Fixed)
+                      ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+          args++;
+
+          decoder->current_subfont->random =
+            cff_random( decoder->current_subfont->random );
+          break;
+
+        case cff_op_mul:
+          FT_TRACE4(( " mul\n" ));
+
+          args[0] = FT_MulFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_sqrt:
+          FT_TRACE4(( " sqrt\n" ));
+
+          if ( args[0] > 0 )
+          {
+            FT_Fixed  root = args[0];
+            FT_Fixed  new_root;
+
+
+            for (;;)
+            {
+              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+              if ( new_root == root )
+                break;
+              root = new_root;
+            }
+            args[0] = new_root;
+          }
+          else
+            args[0] = 0;
+          args++;
+          break;
+
+        case cff_op_drop:
+          /* nothing */
+          FT_TRACE4(( " drop\n" ));
+
+          break;
+
+        case cff_op_exch:
+          {
+            FT_Fixed  tmp;
+
+
+            FT_TRACE4(( " exch\n" ));
+
+            tmp     = args[0];
+            args[0] = args[1];
+            args[1] = tmp;
+            args   += 2;
+          }
+          break;
+
+        case cff_op_index:
+          {
+            FT_Int  idx = (FT_Int)( args[0] >> 16 );
+
+
+            FT_TRACE4(( " index\n" ));
+
+            if ( idx < 0 )
+              idx = 0;
+            else if ( idx > num_args - 2 )
+              idx = num_args - 2;
+            args[0] = args[-( idx + 1 )];
+            args++;
+          }
+          break;
+
+        case cff_op_roll:
+          {
+            FT_Int  count = (FT_Int)( args[0] >> 16 );
+            FT_Int  idx   = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " roll\n" ));
+
+            if ( count <= 0 )
+              count = 1;
+
+            args -= count;
+            if ( args < stack )
+              goto Stack_Underflow;
+
+            if ( idx >= 0 )
+            {
+              while ( idx > 0 )
+              {
+                FT_Fixed  tmp = args[count - 1];
+                FT_Int    i;
+
+
+                for ( i = count - 2; i >= 0; i-- )
+                  args[i + 1] = args[i];
+                args[0] = tmp;
+                idx--;
+              }
+            }
+            else
+            {
+              while ( idx < 0 )
+              {
+                FT_Fixed  tmp = args[0];
+                FT_Int    i;
+
+
+                for ( i = 0; i < count - 1; i++ )
+                  args[i] = args[i + 1];
+                args[count - 1] = tmp;
+                idx++;
+              }
+            }
+            args += count;
+          }
+          break;
+
+        case cff_op_dup:
+          FT_TRACE4(( " dup\n" ));
+
+          args[1] = args[0];
+          args   += 2;
+          break;
+
+        case cff_op_put:
+          {
+            FT_Fixed  val = args[0];
+            FT_Int    idx = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " put\n" ));
+
+            /* the Type2 specification before version 16-March-2000 */
+            /* didn't give a hard-coded size limit of the temporary */
+            /* storage array; instead, an argument of the           */
+            /* `MultipleMaster' operator set the size               */
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              decoder->buildchar[idx] = val;
+          }
+          break;
+
+        case cff_op_get:
+          {
+            FT_Int    idx = (FT_Int)( args[0] >> 16 );
+            FT_Fixed  val = 0;
+
+
+            FT_TRACE4(( " get\n" ));
+
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              val = decoder->buildchar[idx];
+
+            args[0] = val;
+            args++;
+          }
+          break;
+
+        case cff_op_store:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+
+          /* since we currently don't handle interpolation of multiple */
+          /* master fonts, this is a no-op                             */
+          FT_TRACE4(( " store\n" ));
+          break;
+
+        case cff_op_load:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+          {
+            FT_Int  reg_idx = (FT_Int)args[0];
+            FT_Int  idx     = (FT_Int)args[1];
+            FT_Int  count   = (FT_Int)args[2];
+
+
+            FT_TRACE4(( " load\n" ));
+
+            /* since we currently don't handle interpolation of multiple */
+            /* master fonts, we store a vector [1 0 0 ...] in the        */
+            /* temporary storage array regardless of the Registry index  */
+            if ( reg_idx >= 0 && reg_idx <= 2             &&
+                 idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS &&
+                 count >= 0 && count <= num_axes          )
+            {
+              FT_Int  end, i;
+
+
+              end = FT_MIN( idx + count, CFF_MAX_TRANS_ELEMENTS );
+
+              if ( idx < end )
+                decoder->buildchar[idx] = 1 << 16;
+
+              for ( i = idx + 1; i < end; i++ )
+                decoder->buildchar[i] = 0;
+            }
+          }
+          break;
+
+        case cff_op_blend:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+          {
+            FT_Int  num_results = (FT_Int)( args[0] >> 16 );
+
+
+            FT_TRACE4(( " blend\n" ));
+
+            if ( num_results < 0 )
+              goto Syntax_Error;
+
+            if ( num_results * (FT_Int)num_designs > num_args )
+              goto Stack_Underflow;
+
+            /* since we currently don't handle interpolation of multiple */
+            /* master fonts, return the `num_results' values of the      */
+            /* first master                                              */
+            args     -= num_results * ( num_designs - 1 );
+            num_args -= num_results * ( num_designs - 1 );
+          }
+          break;
+
+        case cff_op_dotsection:
+          /* this operator is deprecated and ignored by the parser */
+          FT_TRACE4(( " dotsection\n" ));
+          break;
+
+        case cff_op_closepath:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " closepath (invalid op)\n" ));
+
+          args = stack;
+          break;
+
+        case cff_op_hsbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " hsbw (invalid op)\n" ));
+
+          decoder->glyph_width =
+            ADD_LONG( decoder->nominal_width, ( args[1] >> 16 ) );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = 0;
+
+          x    = ADD_LONG( decoder->builder.pos_x, args[0] );
+          y    = decoder->builder.pos_y;
+          args = stack;
+          break;
+
+        case cff_op_sbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " sbw (invalid op)\n" ));
+
+          decoder->glyph_width =
+            ADD_LONG( decoder->nominal_width, ( args[2] >> 16 ) );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = args[1];
+
+          x    = ADD_LONG( decoder->builder.pos_x, args[0] );
+          y    = ADD_LONG( decoder->builder.pos_y, args[1] );
+          args = stack;
+          break;
+
+        case cff_op_setcurrentpoint:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
+
+          x    = ADD_LONG( decoder->builder.pos_x, args[0] );
+          y    = ADD_LONG( decoder->builder.pos_y, args[1] );
+          args = stack;
+          break;
+
+        case cff_op_callothersubr:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " callothersubr (invalid op)\n" ));
+
+          /* subsequent `pop' operands should add the arguments,       */
+          /* this is the implementation described for `unknown' other  */
+          /* subroutines in the Type1 spec.                            */
+          /*                                                           */
+          /* XXX Fix return arguments (see discussion below).          */
+          args -= 2 + ( args[-2] >> 16 );
+          if ( args < stack )
+            goto Stack_Underflow;
+          break;
+
+        case cff_op_pop:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " pop (invalid op)\n" ));
+
+          /* XXX Increasing `args' is wrong: After a certain number of */
+          /* `pop's we get a stack overflow.  Reason for doing it is   */
+          /* code like this (actually found in a CFF font):            */
+          /*                                                           */
+          /*   17 1 3 callothersubr                                    */
+          /*   pop                                                     */
+          /*   callsubr                                                */
+          /*                                                           */
+          /* Since we handle `callothersubr' as a no-op, and           */
+          /* `callsubr' needs at least one argument, `pop' can't be a  */
+          /* no-op too as it basically should be.                      */
+          /*                                                           */
+          /* The right solution would be to provide real support for   */
+          /* `callothersubr' as done in `t1decode.c', however, given   */
+          /* the fact that CFF fonts with `pop' are invalid, it is     */
+          /* questionable whether it is worth the time.                */
+          args++;
+          break;
+
+        case cff_op_and:
+          {
+            FT_Fixed  cond = ( args[0] && args[1] );
+
+
+            FT_TRACE4(( " and\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_or:
+          {
+            FT_Fixed  cond = ( args[0] || args[1] );
+
+
+            FT_TRACE4(( " or\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_not:
+          {
+            FT_Fixed  cond = !args[0];
+
+
+            FT_TRACE4(( " not\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_eq:
+          {
+            FT_Fixed  cond = ( args[0] == args[1] );
+
+
+            FT_TRACE4(( " eq\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_ifelse:
+          {
+            FT_Fixed  cond = ( args[2] <= args[3] );
+
+
+            FT_TRACE4(( " ifelse\n" ));
+
+            if ( !cond )
+              args[0] = args[1];
+            args++;
+          }
+          break;
+
+        case cff_op_callsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->locals_bias );
+
+
+            FT_TRACE4(( " callsubr (idx %d, entering level %d)\n",
+                        idx,
+                        zone - decoder->zones + 1 ));
+
+            if ( idx >= decoder->num_locals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid local subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->locals[idx];
+            zone->limit  = decoder->locals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_callgsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->globals_bias );
+
+
+            FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n",
+                        idx,
+                        zone - decoder->zones + 1 ));
+
+            if ( idx >= decoder->num_globals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid global subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->globals[idx];
+            zone->limit  = decoder->globals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_return:
+          FT_TRACE4(( " return (leaving level %d)\n",
+                      decoder->zone - decoder->zones ));
+
+          if ( decoder->zone <= decoder->zones )
+          {
+            FT_ERROR(( "cff_decoder_parse_charstrings:"
+                       " unexpected return\n" ));
+            goto Syntax_Error;
+          }
+
+          decoder->zone--;
+          zone  = decoder->zone;
+          ip    = zone->cursor;
+          limit = zone->limit;
+          break;
+
+        default:
+          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+          if ( ip[-1] == 12 )
+            FT_ERROR(( " %d", ip[0] ));
+          FT_ERROR(( "\n" ));
+
+          return FT_THROW( Unimplemented_Feature );
+        }
+
+        decoder->top = args;
+
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  Fail:
+    return error;
+
+  MM_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings:"
+                " invalid opcode found in top DICT charstring\n"));
+    return FT_THROW( Invalid_File_Format );
+
+  Syntax_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+    return FT_THROW( Invalid_File_Format );
+
+  Stack_Underflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+    return FT_THROW( Too_Few_Arguments );
+
+  Stack_Overflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+    return FT_THROW( Stack_Overflow );
+  }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph decoder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face      :: The current face object.                              */
+  /*                                                                       */
+  /*    size      :: The current size object.                              */
+  /*                                                                       */
+  /*    slot      :: The current glyph object.                             */
+  /*                                                                       */
+  /*    hinting   :: Whether hinting is active.                            */
+  /*                                                                       */
+  /*    hint_mode :: The hinting mode.                                     */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_decoder_init( CFF_Decoder*                     decoder,
+                    TT_Face                          face,
+                    CFF_Size                         size,
+                    CFF_GlyphSlot                    slot,
+                    FT_Bool                          hinting,
+                    FT_Render_Mode                   hint_mode,
+                    CFF_Decoder_Get_Glyph_Callback   get_callback,
+                    CFF_Decoder_Free_Glyph_Callback  free_callback )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    /* clear everything */
+    FT_ZERO( decoder );
+
+    /* initialize builder */
+    cff_builder_init( &decoder->builder, face, size, slot, hinting );
+
+    /* initialize Type2 decoder */
+    decoder->cff          = cff;
+    decoder->num_globals  = cff->global_subrs_index.count;
+    decoder->globals      = cff->global_subrs;
+    decoder->globals_bias = cff_compute_bias(
+                              cff->top_font.font_dict.charstring_type,
+                              decoder->num_globals );
+
+    decoder->hint_mode = hint_mode;
+
+    decoder->get_glyph_callback  = get_callback;
+    decoder->free_glyph_callback = free_callback;
+  }
+
+
+  /* this function is used to select the subfont */
+  /* and the locals subrs array                  */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index )
+  {
+    CFF_Builder  *builder = &decoder->builder;
+    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;
+    CFF_SubFont   sub     = &cff->top_font;
+    FT_Error      error   = FT_Err_Ok;
+
+    FT_Service_CFFLoad  cffload = (FT_Service_CFFLoad)cff->cffload;
+
+
+    /* manage CID fonts */
+    if ( cff->num_subfonts )
+    {
+      FT_Byte  fd_index = cffload->fd_select_get( &cff->fd_select,
+                                                  glyph_index );
+
+
+      if ( fd_index >= cff->num_subfonts )
+      {
+        FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      FT_TRACE3(( "  in subfont %d:\n", fd_index ));
+
+      sub = cff->subfonts[fd_index];
+
+      if ( builder->hints_funcs && size )
+      {
+        FT_Size       ftsize   = FT_SIZE( size );
+        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
+
+
+        /* for CFFs without subfonts, this value has already been set */
+        builder->hints_globals = (void *)internal->subfonts[fd_index];
+      }
+    }
+
+    decoder->num_locals  = sub->local_subrs_index.count;
+    decoder->locals      = sub->local_subrs;
+    decoder->locals_bias = cff_compute_bias(
+                             decoder->cff->top_font.font_dict.charstring_type,
+                             decoder->num_locals );
+
+    decoder->glyph_width   = sub->private_dict.default_width;
+    decoder->nominal_width = sub->private_dict.nominal_width;
+
+    decoder->current_subfont = sub;
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/psaux/cffdecode.h b/src/psaux/cffdecode.h
new file mode 100644
index 0000000..0d4f5fe
--- /dev/null
+++ b/src/psaux/cffdecode.h
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdecode.h                                                            */
+/*                                                                         */
+/*    PostScript CFF (Type 2) decoding routines (specification).           */
+/*                                                                         */
+/*  Copyright 2017-2018 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 CFFDECODE_H_
+#define CFFDECODE_H_
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( void )
+  cff_decoder_init( CFF_Decoder*                     decoder,
+                    TT_Face                          face,
+                    CFF_Size                         size,
+                    CFF_GlyphSlot                    slot,
+                    FT_Bool                          hinting,
+                    FT_Render_Mode                   hint_mode,
+                    CFF_Decoder_Get_Glyph_Callback   get_callback,
+                    CFF_Decoder_Free_Glyph_Callback  free_callback );
+
+  FT_LOCAL( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index );
+
+
+  FT_LOCAL( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode );
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+  FT_LOCAL( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len,
+                                 FT_Bool       in_dict );
+#endif
+
+
+FT_END_HEADER
+
+#endif
+
+
+/* END */
diff --git a/src/psaux/module.mk b/src/psaux/module.mk
index 1d90e14..6584d07 100644
--- a/src/psaux/module.mk
+++ b/src/psaux/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/cff/cf2arrst.c b/src/psaux/psarrst.c
similarity index 92%
rename from src/cff/cf2arrst.c
rename to src/psaux/psarrst.c
index 528b1fa..a878094 100644
--- a/src/cff/cf2arrst.c
+++ b/src/psaux/psarrst.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2arrst.c                                                             */
+/*  psarrst.c                                                              */
 /*                                                                         */
 /*    Adobe's code for Array Stacks (body).                                */
 /*                                                                         */
@@ -36,13 +36,13 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
-#include "cf2arrst.h"
+#include "psglue.h"
+#include "psarrst.h"
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
   /*
@@ -58,7 +58,7 @@
                      FT_Error*     error,
                      size_t        sizeItem )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     /* initialize the structure */
     arrstack->memory    = memory;
@@ -78,7 +78,7 @@
     FT_Memory  memory = arrstack->memory;     /* for FT_FREE */
 
 
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     arrstack->allocated = 0;
     arrstack->count     = 0;
@@ -95,7 +95,7 @@
   cf2_arrstack_setNumElements( CF2_ArrStack  arrstack,
                                size_t        numElements )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     {
       FT_Error   error  = FT_Err_Ok;        /* for FT_REALLOC */
@@ -104,7 +104,7 @@
       size_t  newSize = numElements * arrstack->sizeItem;
 
 
-      if ( numElements > LONG_MAX / arrstack->sizeItem )
+      if ( numElements > FT_LONG_MAX / arrstack->sizeItem )
         goto exit;
 
 
@@ -140,7 +140,7 @@
   cf2_arrstack_setCount( CF2_ArrStack  arrstack,
                          size_t        numElements )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     if ( numElements > arrstack->allocated )
     {
@@ -157,7 +157,7 @@
   FT_LOCAL_DEF( void )
   cf2_arrstack_clear( CF2_ArrStack  arrstack )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     arrstack->count = 0;
   }
@@ -167,7 +167,7 @@
   FT_LOCAL_DEF( size_t )
   cf2_arrstack_size( const CF2_ArrStack  arrstack )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     return arrstack->count;
   }
@@ -176,7 +176,7 @@
   FT_LOCAL_DEF( void* )
   cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     return arrstack->ptr;
   }
@@ -190,7 +190,7 @@
     void*  newPtr;
 
 
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     if ( idx >= arrstack->count )
     {
@@ -212,7 +212,7 @@
   cf2_arrstack_push( CF2_ArrStack  arrstack,
                      const void*   ptr )
   {
-    FT_ASSERT( arrstack != NULL );
+    FT_ASSERT( arrstack );
 
     if ( arrstack->count == arrstack->allocated )
     {
@@ -225,7 +225,7 @@
       }
     }
 
-    FT_ASSERT( ptr != NULL );
+    FT_ASSERT( ptr );
 
     {
       size_t  offset = arrstack->count * arrstack->sizeItem;
diff --git a/src/cff/cf2arrst.h b/src/psaux/psarrst.h
similarity index 95%
rename from src/cff/cf2arrst.h
rename to src/psaux/psarrst.h
index ff5ad8b..b3568eb 100644
--- a/src/cff/cf2arrst.h
+++ b/src/psaux/psarrst.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2arrst.h                                                             */
+/*  psarrst.h                                                              */
 /*                                                                         */
 /*    Adobe's code for Array Stacks (specification).                       */
 /*                                                                         */
@@ -36,11 +36,11 @@
 /***************************************************************************/
 
 
-#ifndef __CF2ARRST_H__
-#define __CF2ARRST_H__
+#ifndef PSARRST_H_
+#define PSARRST_H_
 
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
 FT_BEGIN_HEADER
@@ -94,7 +94,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2ARRST_H__ */
+#endif /* PSARRST_H_ */
 
 
 /* END */
diff --git a/src/psaux/psaux.c b/src/psaux/psaux.c
index 7f1d9aa..fb447fc 100644
--- a/src/psaux/psaux.c
+++ b/src/psaux/psaux.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript driver component (body only).          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,18 +17,25 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "psobjs.c"
-#include "psauxmod.c"
-#include "t1decode.c"
-#include "t1cmap.c"
 
-#ifndef T1_CONFIG_OPTION_NO_AFM
 #include "afmparse.c"
-#endif
-
+#include "psauxmod.c"
 #include "psconv.c"
+#include "psobjs.c"
+#include "t1cmap.c"
+#include "t1decode.c"
+#include "cffdecode.c"
+
+#include "psarrst.c"
+#include "psblues.c"
+#include "pserror.c"
+#include "psfont.c"
+#include "psft.c"
+#include "pshints.c"
+#include "psintrp.c"
+#include "psread.c"
+#include "psstack.c"
 
 
 /* END */
diff --git a/src/psaux/psauxerr.h b/src/psaux/psauxerr.h
index 97712f0..cc33fd2 100644
--- a/src/psaux/psauxerr.h
+++ b/src/psaux/psauxerr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS auxiliary module error codes (specification only).                */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __PSAUXERR_H__
-#define __PSAUXERR_H__
+#ifndef PSAUXERR_H_
+#define PSAUXERR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  PSaux_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __PSAUXERR_H__ */
+#endif /* PSAUXERR_H_ */
 
 
 /* END */
diff --git a/src/psaux/psauxmod.c b/src/psaux/psauxmod.c
index 06fcab0..ee49708 100644
--- a/src/psaux/psauxmod.c
+++ b/src/psaux/psauxmod.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript module implementation (body).          */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,8 @@
 #include "psobjs.h"
 #include "t1decode.h"
 #include "t1cmap.h"
+#include "psft.h"
+#include "cffdecode.h"
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
 #include "afmparse.h"
@@ -30,52 +32,69 @@
   FT_CALLBACK_TABLE_DEF
   const PS_Table_FuncsRec  ps_table_funcs =
   {
-    ps_table_new,
-    ps_table_done,
-    ps_table_add,
-    ps_table_release
+    ps_table_new,     /* init    */
+    ps_table_done,    /* done    */
+    ps_table_add,     /* add     */
+    ps_table_release  /* release */
   };
 
 
   FT_CALLBACK_TABLE_DEF
   const PS_Parser_FuncsRec  ps_parser_funcs =
   {
-    ps_parser_init,
-    ps_parser_done,
-    ps_parser_skip_spaces,
-    ps_parser_skip_PS_token,
-    ps_parser_to_int,
-    ps_parser_to_fixed,
-    ps_parser_to_bytes,
-    ps_parser_to_coord_array,
-    ps_parser_to_fixed_array,
-    ps_parser_to_token,
-    ps_parser_to_token_array,
-    ps_parser_load_field,
-    ps_parser_load_field_table
+    ps_parser_init,             /* init             */
+    ps_parser_done,             /* done             */
+
+    ps_parser_skip_spaces,      /* skip_spaces      */
+    ps_parser_skip_PS_token,    /* skip_PS_token    */
+
+    ps_parser_to_int,           /* to_int           */
+    ps_parser_to_fixed,         /* to_fixed         */
+    ps_parser_to_bytes,         /* to_bytes         */
+    ps_parser_to_coord_array,   /* to_coord_array   */
+    ps_parser_to_fixed_array,   /* to_fixed_array   */
+    ps_parser_to_token,         /* to_token         */
+    ps_parser_to_token_array,   /* to_token_array   */
+
+    ps_parser_load_field,       /* load_field       */
+    ps_parser_load_field_table  /* load_field_table */
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const PS_Builder_FuncsRec  ps_builder_funcs =
+  {
+    ps_builder_init,          /* init */
+    ps_builder_done           /* done */
   };
 
 
   FT_CALLBACK_TABLE_DEF
   const T1_Builder_FuncsRec  t1_builder_funcs =
   {
-    t1_builder_init,
-    t1_builder_done,
-    t1_builder_check_points,
-    t1_builder_add_point,
-    t1_builder_add_point1,
-    t1_builder_add_contour,
-    t1_builder_start_point,
-    t1_builder_close_contour
+    t1_builder_init,          /* init */
+    t1_builder_done,          /* done */
+
+    t1_builder_check_points,  /* check_points  */
+    t1_builder_add_point,     /* add_point     */
+    t1_builder_add_point1,    /* add_point1    */
+    t1_builder_add_contour,   /* add_contour   */
+    t1_builder_start_point,   /* start_point   */
+    t1_builder_close_contour  /* close_contour */
   };
 
 
   FT_CALLBACK_TABLE_DEF
   const T1_Decoder_FuncsRec  t1_decoder_funcs =
   {
-    t1_decoder_init,
-    t1_decoder_done,
-    t1_decoder_parse_charstrings
+    t1_decoder_init,               /* init                  */
+    t1_decoder_done,               /* done                  */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    t1_decoder_parse_charstrings,  /* parse_charstrings_old */
+#else
+    t1_decoder_parse_metrics,      /* parse_metrics         */
+#endif
+    cf2_decoder_parse_charstrings  /* parse_charstrings     */
   };
 
 
@@ -83,9 +102,9 @@
   FT_CALLBACK_TABLE_DEF
   const AFM_Parser_FuncsRec  afm_parser_funcs =
   {
-    afm_parser_init,
-    afm_parser_done,
-    afm_parser_parse
+    afm_parser_init,  /* init  */
+    afm_parser_done,  /* done  */
+    afm_parser_parse  /* parse */
   };
 #endif
 
@@ -100,6 +119,34 @@
   };
 
 
+  FT_CALLBACK_TABLE_DEF
+  const CFF_Builder_FuncsRec  cff_builder_funcs =
+  {
+    cff_builder_init,          /* init */
+    cff_builder_done,          /* done */
+
+    cff_check_points,          /* check_points  */
+    cff_builder_add_point,     /* add_point     */
+    cff_builder_add_point1,    /* add_point1    */
+    cff_builder_add_contour,   /* add_contour   */
+    cff_builder_start_point,   /* start_point   */
+    cff_builder_close_contour  /* close_contour */
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const CFF_Decoder_FuncsRec  cff_decoder_funcs =
+  {
+    cff_decoder_init,              /* init    */
+    cff_decoder_prepare,           /* prepare */
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    cff_decoder_parse_charstrings, /* parse_charstrings_old */
+#endif
+    cf2_decoder_parse_charstrings  /* parse_charstrings     */
+  };
+
+
   static
   const PSAux_Interface  psaux_interface =
   {
@@ -108,6 +155,9 @@
     &t1_builder_funcs,
     &t1_decoder_funcs,
     t1_decrypt,
+    cff_random,
+    ps_decoder_init,
+    t1_make_subfont,
 
     (const T1_CMap_ClassesRec*) &t1_cmap_classes,
 
@@ -116,6 +166,8 @@
 #else
     0,
 #endif
+
+    &cff_decoder_funcs,
   };
 
 
@@ -130,9 +182,9 @@
 
     &psaux_interface,  /* module-specific interface */
 
-    (FT_Module_Constructor)0,
-    (FT_Module_Destructor) 0,
-    (FT_Module_Requester)  0
+    (FT_Module_Constructor)NULL,  /* module_init   */
+    (FT_Module_Destructor) NULL,  /* module_done   */
+    (FT_Module_Requester)  NULL   /* get_interface */
   };
 
 
diff --git a/src/psaux/psauxmod.h b/src/psaux/psauxmod.h
index ae6a8f9..f30978f 100644
--- a/src/psaux/psauxmod.h
+++ b/src/psaux/psauxmod.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript module implementation (specification). */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,13 +16,15 @@
 /***************************************************************************/
 
 
-#ifndef __PSAUXMOD_H__
-#define __PSAUXMOD_H__
+#ifndef PSAUXMOD_H_
+#define PSAUXMOD_H_
 
 
 #include <ft2build.h>
 #include FT_MODULE_H
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
 
 FT_BEGIN_HEADER
 
@@ -31,12 +33,19 @@
 #endif
 
 
+  FT_CALLBACK_TABLE
+  const CFF_Builder_FuncsRec  cff_builder_funcs;
+
+  FT_CALLBACK_TABLE
+  const PS_Builder_FuncsRec   ps_builder_funcs;
+
+
   FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
 
 
 FT_END_HEADER
 
-#endif /* __PSAUXMOD_H__ */
+#endif /* PSAUXMOD_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2blues.c b/src/psaux/psblues.c
similarity index 91%
rename from src/cff/cf2blues.c
rename to src/psaux/psblues.c
index 250f89e..ae39d03 100644
--- a/src/cff/cf2blues.c
+++ b/src/psaux/psblues.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2blues.c                                                             */
+/*  psblues.c                                                              */
 /*                                                                         */
 /*    Adobe's code for handling Blue Zones (body).                         */
 /*                                                                         */
@@ -36,12 +36,12 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2blues.h"
-#include "cf2hints.h"
-#include "cf2font.h"
+#include "psblues.h"
+#include "pshints.h"
+#include "psfont.h"
 
 
   /*************************************************************************/
@@ -67,7 +67,7 @@
                   CF2_Font   font )
   {
     /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
+    PS_Decoder*  decoder = font->decoder;
 
     CF2_Fixed  zoneHeight;
     CF2_Fixed  maxZoneHeight = 0;
@@ -194,8 +194,8 @@
       blues->zone[blues->count].csTopEdge =
         cf2_blueToFixed( blueValues[i + 1] );
 
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
+      zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge,
+                              blues->zone[blues->count].csBottomEdge );
 
       if ( zoneHeight < 0 )
       {
@@ -243,8 +243,8 @@
       blues->zone[blues->count].csTopEdge =
         cf2_blueToFixed( otherBlues[i + 1] );
 
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
+      zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge,
+                              blues->zone[blues->count].csBottomEdge );
 
       if ( zoneHeight < 0 )
       {
@@ -301,7 +301,7 @@
           /* top edge */
           flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
           {
@@ -319,7 +319,7 @@
           /* top edge */
           flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
             blues->zone[i].csFlatEdge = flatFamilyEdge;
@@ -342,7 +342,7 @@
           /* adjust edges of top zone upward by twice darkening amount */
           flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
           {
@@ -408,8 +408,8 @@
       /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */
       /*       10ppem Arial                                             */
 
-      blues->boost = cf2_floatToFixed( .6 ) -
-                       FT_MulDiv( cf2_floatToFixed ( .6 ),
+      blues->boost = cf2_doubleToFixed( .6 ) -
+                       FT_MulDiv( cf2_doubleToFixed ( .6 ),
                                   blues->scale,
                                   blues->blueScale );
       if ( blues->boost > 0x7FFF )
@@ -489,17 +489,18 @@
       if ( blues->zone[i].bottomZone           &&
            cf2_hint_isBottom( bottomHintEdge ) )
       {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               bottomHintEdge->csCoord                   &&
+        if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <=
+               bottomHintEdge->csCoord                           &&
              bottomHintEdge->csCoord <=
-               ( blues->zone[i].csTopEdge + csFuzz )     )
+               ADD_INT32( blues->zone[i].csTopEdge, csFuzz )     )
         {
           /* bottom edge captured by bottom zone */
 
           if ( blues->suppressOvershoot )
             dsNew = blues->zone[i].dsFlatEdge;
 
-          else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=
+          else if ( SUB_INT32( blues->zone[i].csTopEdge,
+                               bottomHintEdge->csCoord ) >=
                       blues->blueShift )
           {
             /* guarantee minimum of 1 pixel overshoot */
@@ -514,7 +515,7 @@
             dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
           }
 
-          dsMove   = dsNew - bottomHintEdge->dsCoord;
+          dsMove   = SUB_INT32( dsNew, bottomHintEdge->dsCoord );
           captured = TRUE;
 
           break;
@@ -523,17 +524,18 @@
 
       if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
       {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               topHintEdge->csCoord                      &&
+        if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <=
+               topHintEdge->csCoord                              &&
              topHintEdge->csCoord <=
-               ( blues->zone[i].csTopEdge + csFuzz )     )
+               ADD_INT32( blues->zone[i].csTopEdge, csFuzz )     )
         {
           /* top edge captured by top zone */
 
           if ( blues->suppressOvershoot )
             dsNew = blues->zone[i].dsFlatEdge;
 
-          else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=
+          else if ( SUB_INT32( topHintEdge->csCoord,
+                               blues->zone[i].csBottomEdge ) >=
                       blues->blueShift )
           {
             /* guarantee minimum of 1 pixel overshoot */
@@ -548,7 +550,7 @@
             dsNew = cf2_fixedRound( topHintEdge->dsCoord );
           }
 
-          dsMove   = dsNew - topHintEdge->dsCoord;
+          dsMove   = SUB_INT32( dsNew, topHintEdge->dsCoord );
           captured = TRUE;
 
           break;
@@ -561,13 +563,14 @@
       /* move both edges and flag them `locked' */
       if ( cf2_hint_isValid( bottomHintEdge ) )
       {
-        bottomHintEdge->dsCoord += dsMove;
+        bottomHintEdge->dsCoord = ADD_INT32( bottomHintEdge->dsCoord,
+                                             dsMove );
         cf2_hint_lock( bottomHintEdge );
       }
 
       if ( cf2_hint_isValid( topHintEdge ) )
       {
-        topHintEdge->dsCoord += dsMove;
+        topHintEdge->dsCoord = ADD_INT32( topHintEdge->dsCoord, dsMove );
         cf2_hint_lock( topHintEdge );
       }
     }
diff --git a/src/cff/cf2blues.h b/src/psaux/psblues.h
similarity index 96%
rename from src/cff/cf2blues.h
rename to src/psaux/psblues.h
index 2f38fca..25ef684 100644
--- a/src/cff/cf2blues.h
+++ b/src/psaux/psblues.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2blues.h                                                             */
+/*  psblues.h                                                              */
 /*                                                                         */
 /*    Adobe's code for handling Blue Zones (specification).                */
 /*                                                                         */
@@ -65,11 +65,11 @@
    */
 
 
-#ifndef __CF2BLUES_H__
-#define __CF2BLUES_H__
+#ifndef PSBLUES_H_
+#define PSBLUES_H_
 
 
-#include "cf2glue.h"
+#include "psglue.h"
 
 
 FT_BEGIN_HEADER
@@ -111,7 +111,7 @@
    * Constant used for hint adjustment and for synthetic em box hint
    * placement.
    */
-#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )
+#define CF2_MIN_COUNTER  cf2_doubleToFixed( 0.5 )
 
 
   /* shared typedef is in cf2glue.h */
@@ -179,7 +179,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2BLUES_H__ */
+#endif /* PSBLUES_H_ */
 
 
 /* END */
diff --git a/src/psaux/psconv.c b/src/psaux/psconv.c
index aca7412..a033850 100644
--- a/src/psaux/psconv.c
+++ b/src/psaux/psconv.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Some convenience conversions (body).                                 */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -111,6 +111,10 @@
       p++;
       if ( p == limit )
         goto Bad;
+
+      /* only a single sign is allowed */
+      if ( *p == '-' || *p == '+' )
+        return 0;
     }
 
     num_limit = 0x7FFFFFFFL / base;
@@ -215,6 +219,10 @@
       p++;
       if ( p == limit )
         goto Bad;
+
+      /* only a single sign is allowed */
+      if ( *p == '-' || *p == '+' )
+        return 0;
     }
 
     /* read the integer part */
diff --git a/src/psaux/psconv.h b/src/psaux/psconv.h
index 10f1ff7..d643ffc 100644
--- a/src/psaux/psconv.h
+++ b/src/psaux/psconv.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Some convenience conversions (specification).                        */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSCONV_H__
-#define __PSCONV_H__
+#ifndef PSCONV_H_
+#define PSCONV_H_
 
 
 #include <ft2build.h>
@@ -65,7 +65,7 @@
 
 FT_END_HEADER
 
-#endif /* __PSCONV_H__ */
+#endif /* PSCONV_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2error.c b/src/psaux/pserror.c
similarity index 94%
rename from src/cff/cf2error.c
rename to src/psaux/pserror.c
index b5595a3..9169e52 100644
--- a/src/cff/cf2error.c
+++ b/src/psaux/pserror.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2error.c                                                             */
+/*  pserror.c                                                              */
 /*                                                                         */
 /*    Adobe's code for error handling (body).                              */
 /*                                                                         */
@@ -36,15 +36,15 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
-#include "cf2error.h"
+#include "psft.h"
+#include "pserror.h"
 
 
   FT_LOCAL_DEF( void )
   cf2_setError( FT_Error*  error,
                 FT_Error   value )
   {
-    if ( error && *error == 0 )
+    if ( error && !*error )
       *error = value;
   }
 
diff --git a/src/cff/cf2error.h b/src/psaux/pserror.h
similarity index 93%
rename from src/cff/cf2error.h
rename to src/psaux/pserror.h
index 6453ebc..13d5206 100644
--- a/src/cff/cf2error.h
+++ b/src/psaux/pserror.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2error.h                                                             */
+/*  pserror.h                                                              */
 /*                                                                         */
 /*    Adobe's code for error handling (specification).                     */
 /*                                                                         */
@@ -36,13 +36,13 @@
 /***************************************************************************/
 
 
-#ifndef __CF2ERROR_H__
-#define __CF2ERROR_H__
+#ifndef PSERROR_H_
+#define PSERROR_H_
 
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  CF2_Err_
@@ -50,7 +50,7 @@
 
 
 #include FT_ERRORS_H
-#include "cf2ft.h"
+#include "psft.h"
 
 
 FT_BEGIN_HEADER
@@ -66,11 +66,11 @@
    * model our error mechanism on a Java-like exception mechanism.
    * When we assign an error code we are thus `throwing' an error.
    *
-   * The perservation of an error code is done by coding convention.
+   * The preservation of an error code is done by coding convention.
    * Upon a function call if the error code is anything other than
    * `FT_Err_Ok', which is guaranteed to be zero, we
    * will return without altering that error.  This will allow the
-   * error to propogate and be handled at the appropriate location in
+   * error to propagate and be handled at the appropriate location in
    * the code.
    *
    * This allows a style of code where the error code is initialized
@@ -113,7 +113,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2ERROR_H__ */
+#endif /* PSERROR_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2fixed.h b/src/psaux/psfixed.h
similarity index 92%
rename from src/cff/cf2fixed.h
rename to src/psaux/psfixed.h
index d6d9faf..219589e 100644
--- a/src/cff/cf2fixed.h
+++ b/src/psaux/psfixed.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2fixed.h                                                             */
+/*  psfixed.h                                                              */
 /*                                                                         */
 /*    Adobe's code for Fixed Point Mathematics (specification only).       */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef __CF2FIXED_H__
-#define __CF2FIXED_H__
+#ifndef PSFIXED_H_
+#define PSFIXED_H_
 
 
 FT_BEGIN_HEADER
@@ -51,8 +51,8 @@
 
 #define CF2_FIXED_MAX      ( (CF2_Fixed)0x7FFFFFFFL )
 #define CF2_FIXED_MIN      ( (CF2_Fixed)0x80000000L )
-#define CF2_FIXED_ONE      0x10000L
-#define CF2_FIXED_EPSILON  0x0001
+#define CF2_FIXED_ONE      ( (CF2_Fixed)0x10000L )
+#define CF2_FIXED_EPSILON  ( (CF2_Fixed)0x0001 )
 
   /* in C 89, left and right shift of negative numbers is  */
   /* implementation specific behaviour in the general case */
@@ -63,10 +63,10 @@
           ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
 #define cf2_fixedRound( x )                                              \
           ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) )
-#define cf2_floatToFixed( f )                                            \
+#define cf2_doubleToFixed( f )                                           \
           ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
 #define cf2_fixedAbs( x )                                                \
-          ( (x) < 0 ? -(x) : (x) )
+          ( (x) < 0 ? NEG_INT32( x ) : (x) )
 #define cf2_fixedFloor( x )                                              \
           ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) )
 #define cf2_fixedFraction( x )                                           \
@@ -89,7 +89,7 @@
 FT_END_HEADER
 
 
-#endif /*  __CF2FIXED_H__ */
+#endif /* PSFIXED_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2font.c b/src/psaux/psfont.c
similarity index 89%
rename from src/cff/cf2font.c
rename to src/psaux/psfont.c
index 83fd348..dde67a7 100644
--- a/src/cff/cf2font.c
+++ b/src/psaux/psfont.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.c                                                              */
+/*  psfont.c                                                               */
 /*                                                                         */
 /*    Adobe's code for font instances (body).                              */
 /*                                                                         */
@@ -39,12 +39,12 @@
 #include <ft2build.h>
 #include FT_INTERNAL_CALC_H
 
-#include "cf2ft.h"
+#include "psft.h"
 
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2error.h"
-#include "cf2intrp.h"
+#include "psglue.h"
+#include "psfont.h"
+#include "pserror.h"
+#include "psintrp.h"
 
 
   /* Compute a stem darkening amount in character space. */
@@ -117,7 +117,7 @@
       return;
 
     /* protect against range problems and divide by zero */
-    if ( emRatio < cf2_floatToFixed( .01 ) )
+    if ( emRatio < cf2_doubleToFixed( .01 ) )
       return;
 
     if ( stemDarkened )
@@ -234,7 +234,8 @@
   }
 
 
-  /* set up values for the current FontDict and matrix */
+  /* set up values for the current FontDict and matrix; */
+  /* called for each glyph to be rendered               */
 
   /* caller's transform is adjusted for subpixel positioning */
   static void
@@ -242,10 +243,13 @@
                   const CF2_Matrix*  transform )
   {
     /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
+    PS_Decoder*  decoder = font->decoder;
 
     FT_Bool  needExtraSetup = FALSE;
 
+    CFF_VStoreRec*  vstore;
+    FT_Bool         hasVariations = FALSE;
+
     /* character space units */
     CF2_Fixed  boldenX = font->syntheticEmboldeningAmountX;
     CF2_Fixed  boldenY = font->syntheticEmboldeningAmountY;
@@ -253,6 +257,8 @@
     CFF_SubFont  subFont;
     CF2_Fixed    ppem;
 
+    CF2_UInt   lenNormalizedV = 0;
+    FT_Fixed*  normalizedV    = NULL;
 
     /* clear previous error */
     font->error = FT_Err_Ok;
@@ -266,6 +272,54 @@
       needExtraSetup    = TRUE;
     }
 
+    if ( !font->isT1 )
+    {
+      FT_Service_CFFLoad  cffload = (FT_Service_CFFLoad)font->cffload;
+
+
+      /* check for variation vectors */
+      vstore        = cf2_getVStore( decoder );
+      hasVariations = ( vstore->dataCount != 0 );
+
+      if ( hasVariations )
+      {
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+        /* check whether Private DICT in this subfont needs to be reparsed */
+        font->error = cf2_getNormalizedVector( decoder,
+                                               &lenNormalizedV,
+                                               &normalizedV );
+        if ( font->error )
+          return;
+
+        if ( cffload->blend_check_vector( &subFont->blend,
+                                          subFont->private_dict.vsindex,
+                                          lenNormalizedV,
+                                          normalizedV ) )
+        {
+          /* blend has changed, reparse */
+          cffload->load_private_dict( decoder->cff,
+                                      subFont,
+                                      lenNormalizedV,
+                                      normalizedV );
+          needExtraSetup = TRUE;
+        }
+#endif
+
+        /* copy from subfont */
+        font->blend.font = subFont->blend.font;
+
+        /* clear state of charstring blend */
+        font->blend.usedBV = FALSE;
+
+        /* initialize value for charstring */
+        font->vsindex = subFont->private_dict.vsindex;
+
+        /* store vector inputs for blends in charstring */
+        font->lenNDV = lenNormalizedV;
+        font->NDV    = normalizedV;
+      }
+    }
+
     /* if ppem has changed, we need to recompute some cached data         */
     /* note: because of CID font matrix concatenation, ppem and transform */
     /*       do not necessarily track.                                    */
@@ -398,7 +452,7 @@
       /* choose a constant for StdHW that depends on font contrast       */
       stdHW = cf2_getStdHW( decoder );
 
-      if ( stdHW > 0 && font->stdVW > 2 * stdHW )
+      if ( stdHW > 0 && font->stdVW > MUL_INT32( 2, stdHW ) )
         font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
       else
       {
@@ -423,7 +477,8 @@
 
       /* compute blue zones for this instance */
       cf2_blues_init( &font->blues, font );
-    }
+
+    } /* needExtraSetup */
   }
 
 
diff --git a/src/cff/cf2font.h b/src/psaux/psfont.h
similarity index 88%
rename from src/cff/cf2font.h
rename to src/psaux/psfont.h
index 86cf02f..e611ac4 100644
--- a/src/cff/cf2font.h
+++ b/src/psaux/psfont.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.h                                                              */
+/*  psfont.h                                                               */
 /*                                                                         */
 /*    Adobe's code for font instances (specification).                     */
 /*                                                                         */
@@ -36,12 +36,14 @@
 /***************************************************************************/
 
 
-#ifndef __CF2FONT_H__
-#define __CF2FONT_H__
+#ifndef PSFONT_H_
+#define PSFONT_H_
 
 
-#include "cf2ft.h"
-#include "cf2blues.h"
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "psft.h"
+#include "psblues.h"
 
 
 FT_BEGIN_HEADER
@@ -54,6 +56,7 @@
                                    /* (Hiragino Kaku Gothic ProN W3;      */
                                    /* 8.2d6e1; 2014-12-19) that exceed    */
                                    /* this limit                          */
+#define CF2_STORAGE_SIZE        32
 
 
   /* typedef is in `cf2glue.h' */
@@ -62,6 +65,8 @@
     FT_Memory  memory;
     FT_Error   error;     /* shared error for this instance */
 
+    FT_Bool             isT1;
+    FT_Bool             isCFF2;
     CF2_RenderingFlags  renderingFlags;
 
     /* variables that depend on Transform:  */
@@ -73,6 +78,12 @@
     CF2_Matrix  outerTransform;    /* post hinting; includes rotations */
     CF2_Fixed   ppem;              /* transform-dependent              */
 
+    /* variation data */
+    CFF_BlendRec  blend;            /* cached charstring blend vector  */
+    CF2_UInt      vsindex;          /* current vsindex                 */
+    CF2_UInt      lenNDV;           /* current length NDV or zero      */
+    FT_Fixed*     NDV;              /* ptr to current NDV or NULL      */
+
     CF2_Int  unitsPerEm;
 
     CF2_Fixed  syntheticEmboldeningAmountX;   /* character space units */
@@ -80,7 +91,7 @@
 
     /* FreeType related members */
     CF2_OutlineRec  outline;       /* freetype glyph outline functions */
-    CFF_Decoder*    decoder;
+    PS_Decoder*     decoder;
     CFF_SubFont     lastSubfont;              /* FreeType parsed data; */
                                               /* top font or subfont   */
 
@@ -102,6 +113,8 @@
                                            /* counterclockwise winding */
 
     CF2_BluesRec  blues;                         /* computed zone data */
+
+    FT_Service_CFFLoad  cffload;           /* pointer to cff functions */
   };
 
 
@@ -115,7 +128,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2FONT_H__ */
+#endif /* PSFONT_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2ft.c b/src/psaux/psft.c
similarity index 60%
rename from src/cff/cf2ft.c
rename to src/psaux/psft.c
index d2544a2..1f75017 100644
--- a/src/cff/cf2ft.c
+++ b/src/psaux/psft.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2ft.c                                                                */
+/*  psft.c                                                                 */
 /*                                                                         */
 /*    FreeType Glue Component to Adobe's Interpreter (body).               */
 /*                                                                         */
@@ -36,11 +36,20 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2font.h"
-#include "cf2error.h"
+#include "psfont.h"
+#include "pserror.h"
+#include "psobjs.h"
+#include "cffdecode.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#endif
+
+#include FT_SERVICE_CFF_TABLE_LOAD_H
 
 
 #define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */
@@ -83,12 +92,13 @@
   cf2_setGlyphWidth( CF2_Outline  outline,
                      CF2_Fixed    width )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
 
-    decoder->glyph_width = cf2_fixedToInt( width );
+    if ( !decoder->builder.is_t1 )
+      *decoder->glyph_width = cf2_fixedToInt( width );
   }
 
 
@@ -104,7 +114,8 @@
       FT_Memory  memory = font->memory;
 
 
-      (void)memory;
+      FT_FREE( font->blend.lastNDV );
+      FT_FREE( font->blend.BV );
     }
   }
 
@@ -121,8 +132,8 @@
                       const CF2_CallbackParams  params )
   {
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
     (void)params;        /* only used in debug mode */
 
@@ -133,7 +144,7 @@
     builder = &outline->decoder->builder;
 
     /* note: two successive moves simply close the contour twice */
-    cff_builder_close_contour( builder );
+    ps_builder_close_contour( builder );
     builder->path_begun = 0;
   }
 
@@ -145,8 +156,8 @@
     FT_Error  error;
 
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
 
     FT_ASSERT( outline && outline->decoder );
@@ -158,9 +169,9 @@
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      error = cff_builder_start_point( builder,
-                                       params->pt0.x,
-                                       params->pt0.y );
+      error = ps_builder_start_point( builder,
+                                      params->pt0.x,
+                                      params->pt0.y );
       if ( error )
       {
         if ( !*callbacks->error )
@@ -169,10 +180,10 @@
       }
     }
 
-    /* `cff_builder_add_point1' includes a check_points call for one point */
-    error = cff_builder_add_point1( builder,
-                                    params->pt1.x,
-                                    params->pt1.y );
+    /* `ps_builder_add_point1' includes a check_points call for one point */
+    error = ps_builder_add_point1( builder,
+                                   params->pt1.x,
+                                   params->pt1.y );
     if ( error )
     {
       if ( !*callbacks->error )
@@ -189,8 +200,8 @@
     FT_Error  error;
 
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
 
     FT_ASSERT( outline && outline->decoder );
@@ -202,9 +213,9 @@
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      error = cff_builder_start_point( builder,
-                                       params->pt0.x,
-                                       params->pt0.y );
+      error = ps_builder_start_point( builder,
+                                      params->pt0.x,
+                                      params->pt0.y );
       if ( error )
       {
         if ( !*callbacks->error )
@@ -214,7 +225,7 @@
     }
 
     /* prepare room for 3 points: 2 off-curve, 1 on-curve */
-    error = cff_check_points( builder, 3 );
+    error = ps_builder_check_points( builder, 3 );
     if ( error )
     {
       if ( !*callbacks->error )
@@ -222,15 +233,15 @@
       return;
     }
 
-    cff_builder_add_point( builder,
-                           params->pt1.x,
-                           params->pt1.y, 0 );
-    cff_builder_add_point( builder,
-                           params->pt2.x,
-                           params->pt2.y, 0 );
-    cff_builder_add_point( builder,
-                           params->pt3.x,
-                           params->pt3.y, 1 );
+    ps_builder_add_point( builder,
+                          params->pt1.x,
+                          params->pt1.y, 0 );
+    ps_builder_add_point( builder,
+                          params->pt2.x,
+                          params->pt2.y, 0 );
+    ps_builder_add_point( builder,
+                          params->pt3.x,
+                          params->pt3.y, 1 );
   }
 
 
@@ -239,7 +250,7 @@
                     FT_Memory    memory,
                     FT_Error*    error )
   {
-    FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) );
+    FT_ZERO( outline );
 
     outline->root.memory = memory;
     outline->root.error  = error;
@@ -252,11 +263,11 @@
 
   /* get scaling and hint flag from GlyphSlot */
   static void
-  cf2_getScaleAndHintFlag( CFF_Decoder*  decoder,
-                           CF2_Fixed*    x_scale,
-                           CF2_Fixed*    y_scale,
-                           FT_Bool*      hinted,
-                           FT_Bool*      scaled )
+  cf2_getScaleAndHintFlag( PS_Decoder*  decoder,
+                           CF2_Fixed*   x_scale,
+                           CF2_Fixed*   y_scale,
+                           FT_Bool*     hinted,
+                           FT_Bool*     scaled )
   {
     FT_ASSERT( decoder && decoder->builder.glyph );
 
@@ -266,8 +277,8 @@
 
     if ( *hinted )
     {
-      *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64;
-      *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64;
+      *x_scale = ADD_INT32( decoder->builder.glyph->x_scale, 32 ) / 64;
+      *y_scale = ADD_INT32( decoder->builder.glyph->y_scale, 32 ) / 64;
     }
     else
     {
@@ -283,47 +294,60 @@
   /* get units per em from `FT_Face' */
   /* TODO: should handle font matrix concatenation? */
   static FT_UShort
-  cf2_getUnitsPerEm( CFF_Decoder*  decoder )
+  cf2_getUnitsPerEm( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->builder.face );
-    FT_ASSERT( decoder->builder.face->root.units_per_EM );
+    FT_ASSERT( decoder->builder.face->units_per_EM );
 
-    return decoder->builder.face->root.units_per_EM;
+    return decoder->builder.face->units_per_EM;
   }
 
 
   /* Main entry point: Render one glyph. */
   FT_LOCAL_DEF( FT_Error )
-  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len )
+  cf2_decoder_parse_charstrings( PS_Decoder*  decoder,
+                                 FT_Byte*     charstring_base,
+                                 FT_ULong     charstring_len )
   {
     FT_Memory  memory;
     FT_Error   error = FT_Err_Ok;
     CF2_Font   font;
 
+    FT_Bool    is_t1 = decoder->builder.is_t1;
 
-    FT_ASSERT( decoder && decoder->cff );
+
+    FT_ASSERT( decoder &&
+               ( is_t1 || decoder->cff ) );
+
+    if ( is_t1 && !decoder->current_subfont )
+    {
+      FT_ERROR(( "cf2_decoder_parse_charstrings (Type 1): "
+                 "SubFont missing. Use `t1_make_subfont' first\n" ));
+      return FT_THROW( Invalid_Table );
+    }
 
     memory = decoder->builder.memory;
 
     /* CF2 data is saved here across glyphs */
-    font = (CF2_Font)decoder->cff->cf2_instance.data;
+    font = (CF2_Font)decoder->cf2_instance->data;
 
     /* on first glyph, allocate instance structure */
-    if ( decoder->cff->cf2_instance.data == NULL )
+    if ( !decoder->cf2_instance->data )
     {
-      decoder->cff->cf2_instance.finalizer =
+      decoder->cf2_instance->finalizer =
         (FT_Generic_Finalizer)cf2_free_instance;
 
-      if ( FT_ALLOC( decoder->cff->cf2_instance.data,
+      if ( FT_ALLOC( decoder->cf2_instance->data,
                      sizeof ( CF2_FontRec ) ) )
         return FT_THROW( Out_Of_Memory );
 
-      font = (CF2_Font)decoder->cff->cf2_instance.data;
+      font = (CF2_Font)decoder->cf2_instance->data;
 
       font->memory = memory;
 
+      if ( !is_t1 )
+        font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload;
+
       /* initialize a client outline, to be shared by each glyph rendered */
       cf2_outline_init( &font->outline, font->memory, &font->error );
     }
@@ -336,8 +360,13 @@
     {
       /* build parameters for Adobe engine */
 
-      CFF_Builder*  builder = &decoder->builder;
-      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+      PS_Builder*  builder = &decoder->builder;
+      PS_Driver    driver  = (PS_Driver)FT_FACE_DRIVER( builder->face );
+
+      FT_Bool  no_stem_darkening_driver =
+                 driver->no_stem_darkening;
+      FT_Char  no_stem_darkening_font =
+                 builder->face->internal->no_stem_darkening;
 
       /* local error */
       FT_Error       error2 = FT_Err_Ok;
@@ -366,10 +395,21 @@
                                &hinted,
                                &scaled );
 
+      if ( is_t1 )
+        font->isCFF2 = FALSE;
+      else
+      {
+        /* copy isCFF2 boolean from TT_Face to CF2_Font */
+        font->isCFF2 = ((TT_Face)builder->face)->is_cff2;
+      }
+      font->isT1 = is_t1;
+
       font->renderingFlags = 0;
       if ( hinted )
         font->renderingFlags |= CF2_FlagsHinted;
-      if ( scaled && !driver->no_stem_darkening )
+      if ( scaled && ( !no_stem_darkening_font        ||
+                       ( no_stem_darkening_font < 0 &&
+                         !no_stem_darkening_driver  ) ) )
         font->renderingFlags |= CF2_FlagsDarkened;
 
       font->darkenParams[0] = driver->darken_params[0];
@@ -405,7 +445,7 @@
 
   /* get pointer to current FreeType subfont (based on current glyphID) */
   FT_LOCAL_DEF( CFF_SubFont )
-  cf2_getSubfont( CFF_Decoder*  decoder )
+  cf2_getSubfont( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -413,13 +453,59 @@
   }
 
 
+  /* get pointer to VStore structure */
+  FT_LOCAL_DEF( CFF_VStore )
+  cf2_getVStore( PS_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->cff );
+
+    return &decoder->cff->vstore;
+  }
+
+
+  /* get maxstack value from CFF2 Top DICT */
+  FT_LOCAL_DEF( FT_UInt )
+  cf2_getMaxstack( PS_Decoder*  decoder )
+  {
+    FT_ASSERT( decoder && decoder->cff );
+
+    return decoder->cff->top_font.font_dict.maxstack;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  /* Get normalized design vector for current render request; */
+  /* return pointer and length.                               */
+  /*                                                          */
+  /* Note: Uses FT_Fixed not CF2_Fixed for the vector.        */
+  FT_LOCAL_DEF( FT_Error )
+  cf2_getNormalizedVector( PS_Decoder*  decoder,
+                           CF2_UInt     *len,
+                           FT_Fixed*    *vec )
+  {
+    TT_Face                  face;
+    FT_Service_MultiMasters  mm;
+
+
+    FT_ASSERT( decoder && decoder->builder.face );
+    FT_ASSERT( vec && len );
+    FT_ASSERT( !decoder->builder.is_t1 );
+
+    face = (TT_Face)decoder->builder.face;
+    mm   = (FT_Service_MultiMasters)face->mm;
+
+    return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL );
+  }
+#endif
+
+
   /* get `y_ppem' from `CFF_Size' */
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getPpemY( CFF_Decoder*  decoder )
+  cf2_getPpemY( PS_Decoder*  decoder )
   {
-    FT_ASSERT( decoder                          &&
-               decoder->builder.face            &&
-               decoder->builder.face->root.size );
+    FT_ASSERT( decoder                     &&
+               decoder->builder.face       &&
+               decoder->builder.face->size );
 
     /*
      * Note that `y_ppem' can be zero if there wasn't a call to
@@ -431,7 +517,7 @@
      *
      */
     return cf2_intToFixed(
-             decoder->builder.face->root.size->metrics.y_ppem );
+             decoder->builder.face->size->metrics.y_ppem );
   }
 
 
@@ -439,7 +525,7 @@
   /* FreeType stores these as integer font units       */
   /* (note: variable names seem swapped)               */
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdVW( CFF_Decoder*  decoder )
+  cf2_getStdVW( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -449,7 +535,7 @@
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdHW( CFF_Decoder*  decoder )
+  cf2_getStdHW( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -460,10 +546,10 @@
 
   /* note: FreeType stores 1000 times the actual value for `BlueScale' */
   FT_LOCAL_DEF( void )
-  cf2_getBlueMetrics( CFF_Decoder*  decoder,
-                      CF2_Fixed*    blueScale,
-                      CF2_Fixed*    blueShift,
-                      CF2_Fixed*    blueFuzz )
+  cf2_getBlueMetrics( PS_Decoder*  decoder,
+                      CF2_Fixed*   blueScale,
+                      CF2_Fixed*   blueShift,
+                      CF2_Fixed*   blueFuzz )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -480,9 +566,9 @@
   /* get blue values counts and arrays; the FreeType parser has validated */
   /* the counts and verified that each is an even number                  */
   FT_LOCAL_DEF( void )
-  cf2_getBlueValues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data )
+  cf2_getBlueValues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -493,9 +579,9 @@
 
 
   FT_LOCAL_DEF( void )
-  cf2_getOtherBlues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data )
+  cf2_getOtherBlues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -506,9 +592,9 @@
 
 
   FT_LOCAL_DEF( void )
-  cf2_getFamilyBlues( CFF_Decoder*  decoder,
-                      size_t*       count,
-                      FT_Pos*      *data )
+  cf2_getFamilyBlues( PS_Decoder*  decoder,
+                      size_t*      count,
+                      FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -519,9 +605,9 @@
 
 
   FT_LOCAL_DEF( void )
-  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
-                           size_t*       count,
-                           FT_Pos*      *data )
+  cf2_getFamilyOtherBlues( PS_Decoder*  decoder,
+                           size_t*      count,
+                           FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -532,7 +618,7 @@
 
 
   FT_LOCAL_DEF( CF2_Int )
-  cf2_getLanguageGroup( CFF_Decoder*  decoder )
+  cf2_getLanguageGroup( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -543,15 +629,18 @@
   /* convert unbiased subroutine index to `CF2_Buffer' and */
   /* return 0 on success                                   */
   FT_LOCAL_DEF( CF2_Int )
-  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
-                              CF2_UInt      idx,
-                              CF2_Buffer    buf )
+  cf2_initGlobalRegionBuffer( PS_Decoder*  decoder,
+                              CF2_Int      subrNum,
+                              CF2_Buffer   buf )
   {
+    CF2_UInt  idx;
+
+
     FT_ASSERT( decoder );
 
     FT_ZERO( buf );
 
-    idx += (CF2_UInt)decoder->globals_bias;
+    idx = (CF2_UInt)( subrNum + decoder->globals_bias );
     if ( idx >= decoder->num_globals )
       return TRUE;     /* error */
 
@@ -568,9 +657,9 @@
   /* convert AdobeStandardEncoding code to CF2_Buffer; */
   /* used for seac component                           */
   FT_LOCAL_DEF( FT_Error )
-  cf2_getSeacComponent( CFF_Decoder*  decoder,
-                        CF2_Int       code,
-                        CF2_Buffer    buf )
+  cf2_getSeacComponent( PS_Decoder*  decoder,
+                        CF2_Int      code,
+                        CF2_Buffer   buf )
   {
     CF2_Int   gid;
     FT_Byte*  charstring;
@@ -579,13 +668,14 @@
 
 
     FT_ASSERT( decoder );
+    FT_ASSERT( !decoder->builder.is_t1 );
 
     FT_ZERO( buf );
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     /* Incremental fonts don't necessarily have valid charsets.        */
     /* They use the character code, not the glyph index, in this case. */
-    if ( decoder->builder.face->root.internal->incremental_interface )
+    if ( decoder->builder.face->internal->incremental_interface )
       gid = code;
     else
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
@@ -595,10 +685,10 @@
         return FT_THROW( Invalid_Glyph_Format );
     }
 
-    error = cff_get_glyph_data( decoder->builder.face,
-                                (CF2_UInt)gid,
-                                &charstring,
-                                &len );
+    error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face,
+                                         (CF2_UInt)gid,
+                                         &charstring,
+                                         &len );
     /* TODO: for now, just pass the FreeType error through */
     if ( error )
       return error;
@@ -615,42 +705,142 @@
 
 
   FT_LOCAL_DEF( void )
-  cf2_freeSeacComponent( CFF_Decoder*  decoder,
-                         CF2_Buffer    buf )
+  cf2_freeSeacComponent( PS_Decoder*  decoder,
+                         CF2_Buffer   buf )
   {
     FT_ASSERT( decoder );
+    FT_ASSERT( !decoder->builder.is_t1 );
 
-    cff_free_glyph_data( decoder->builder.face,
-                         (FT_Byte**)&buf->start,
-                         (FT_ULong)( buf->end - buf->start ) );
+    decoder->free_glyph_callback( (TT_Face)decoder->builder.face,
+                                  (FT_Byte**)&buf->start,
+                                  (FT_ULong)( buf->end - buf->start ) );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cf2_getT1SeacComponent( PS_Decoder*  decoder,
+                          FT_UInt      glyph_index,
+                          CF2_Buffer   buf )
+  {
+    FT_Data   glyph_data;
+    FT_Error  error = FT_Err_Ok;
+    T1_Face   face  = (T1_Face)decoder->builder.face;
+    T1_Font   type1 = &face->type1;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec  *inc =
+      face->root.internal->incremental_interface;
+
+
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( inc )
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, &glyph_data );
+    else
+#endif
+    /* For ordinary fonts get the character data stored in the face record. */
+    {
+      glyph_data.pointer = type1->charstrings[glyph_index];
+      glyph_data.length  = (FT_Int)type1->charstrings_len[glyph_index];
+    }
+
+    if ( !error )
+    {
+      FT_Byte*  charstring_base = (FT_Byte*)glyph_data.pointer;
+      FT_ULong  charstring_len  = (FT_ULong)glyph_data.length;
+
+
+      FT_ASSERT( charstring_base + charstring_len >= charstring_base );
+
+      FT_ZERO( buf );
+      buf->start =
+      buf->ptr   = charstring_base;
+      buf->end   = charstring_base + charstring_len;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_freeT1SeacComponent( PS_Decoder*  decoder,
+                           CF2_Buffer   buf )
+  {
+    T1_Face  face;
+    FT_Data  data;
+
+
+    FT_ASSERT( decoder );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    face = (T1_Face)decoder->builder.face;
+
+    data.pointer = buf->start;
+    data.length  = (FT_Int)( buf->end - buf->start );
+
+    if ( face->root.internal->incremental_interface )
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &data );
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
   }
 
 
   FT_LOCAL_DEF( CF2_Int )
-  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
-                             CF2_UInt      idx,
-                             CF2_Buffer    buf )
+  cf2_initLocalRegionBuffer( PS_Decoder*  decoder,
+                             CF2_Int      subrNum,
+                             CF2_Buffer   buf )
   {
+    CF2_UInt  idx;
+
+
     FT_ASSERT( decoder );
 
     FT_ZERO( buf );
 
-    idx += (CF2_UInt)decoder->locals_bias;
+    idx = (CF2_UInt)( subrNum + decoder->locals_bias );
     if ( idx >= decoder->num_locals )
       return TRUE;     /* error */
 
     FT_ASSERT( decoder->locals );
 
-    buf->start =
-    buf->ptr   = decoder->locals[idx];
-    buf->end   = decoder->locals[idx + 1];
+    buf->start = decoder->locals[idx];
+
+    if ( decoder->builder.is_t1 )
+    {
+      /* The Type 1 driver stores subroutines without the seed bytes. */
+      /* The CID driver stores subroutines with seed bytes.  This     */
+      /* case is taken care of when decoder->subrs_len == 0.          */
+      if ( decoder->locals_len )
+        buf->end = buf->start + decoder->locals_len[idx];
+      else
+      {
+        /* We are using subroutines from a CID font.  We must adjust */
+        /* for the seed bytes.                                       */
+        buf->start += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+        buf->end    = decoder->locals[idx + 1];
+      }
+
+      if ( !buf->start )
+      {
+        FT_ERROR(( "cf2_initLocalRegionBuffer (Type 1 mode):"
+                   " invoking empty subrs\n" ));
+      }
+    }
+    else
+    {
+      buf->end = decoder->locals[idx + 1];
+    }
+
+    buf->ptr = buf->start;
 
     return FALSE;      /* success */
   }
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getDefaultWidthX( CFF_Decoder*  decoder )
+  cf2_getDefaultWidthX( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -660,7 +850,7 @@
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getNominalWidthX( CFF_Decoder*  decoder )
+  cf2_getNominalWidthX( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
@@ -672,7 +862,7 @@
   FT_LOCAL_DEF( void )
   cf2_outline_reset( CF2_Outline  outline )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
@@ -686,12 +876,12 @@
   FT_LOCAL_DEF( void )
   cf2_outline_close( CF2_Outline  outline )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
 
-    cff_builder_close_contour( &decoder->builder );
+    ps_builder_close_contour( &decoder->builder );
 
     FT_GlyphLoader_Add( decoder->builder.loader );
   }
diff --git a/src/psaux/psft.h b/src/psaux/psft.h
new file mode 100644
index 0000000..ab17211
--- /dev/null
+++ b/src/psaux/psft.h
@@ -0,0 +1,167 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psft.h                                                                 */
+/*                                                                         */
+/*    FreeType Glue Component to Adobe's Interpreter (specification).      */
+/*                                                                         */
+/*  Copyright 2013 Adobe Systems Incorporated.                             */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef PSFT_H_
+#define PSFT_H_
+
+
+#include "pstypes.h"
+
+
+  /* TODO: disable asserts for now */
+#define CF2_NDEBUG
+
+
+#include FT_SYSTEM_H
+
+#include "psglue.h"
+#include FT_INTERNAL_POSTSCRIPT_AUX_H    /* for PS_Decoder */
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  cf2_decoder_parse_charstrings( PS_Decoder*  decoder,
+                                 FT_Byte*     charstring_base,
+                                 FT_ULong     charstring_len );
+
+  FT_LOCAL( CFF_SubFont )
+  cf2_getSubfont( PS_Decoder*  decoder );
+
+  FT_LOCAL( CFF_VStore )
+  cf2_getVStore( PS_Decoder*  decoder );
+
+  FT_LOCAL( FT_UInt )
+  cf2_getMaxstack( PS_Decoder*  decoder );
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_LOCAL( FT_Error )
+  cf2_getNormalizedVector( PS_Decoder*  decoder,
+                           CF2_UInt    *len,
+                           FT_Fixed*   *vec );
+#endif
+
+  FT_LOCAL( CF2_Fixed )
+  cf2_getPpemY( PS_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getStdVW( PS_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getStdHW( PS_Decoder*  decoder );
+
+  FT_LOCAL( void )
+  cf2_getBlueMetrics( PS_Decoder*  decoder,
+                      CF2_Fixed*   blueScale,
+                      CF2_Fixed*   blueShift,
+                      CF2_Fixed*   blueFuzz );
+  FT_LOCAL( void )
+  cf2_getBlueValues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data );
+  FT_LOCAL( void )
+  cf2_getOtherBlues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data );
+  FT_LOCAL( void )
+  cf2_getFamilyBlues( PS_Decoder*  decoder,
+                      size_t*      count,
+                      FT_Pos*     *data );
+  FT_LOCAL( void )
+  cf2_getFamilyOtherBlues( PS_Decoder*  decoder,
+                           size_t*      count,
+                           FT_Pos*     *data );
+
+  FT_LOCAL( CF2_Int )
+  cf2_getLanguageGroup( PS_Decoder*  decoder );
+
+  FT_LOCAL( CF2_Int )
+  cf2_initGlobalRegionBuffer( PS_Decoder*  decoder,
+                              CF2_Int      subrNum,
+                              CF2_Buffer   buf );
+  FT_LOCAL( FT_Error )
+  cf2_getSeacComponent( PS_Decoder*  decoder,
+                        CF2_Int      code,
+                        CF2_Buffer   buf );
+  FT_LOCAL( void )
+  cf2_freeSeacComponent( PS_Decoder*  decoder,
+                         CF2_Buffer   buf );
+  FT_LOCAL( CF2_Int )
+  cf2_initLocalRegionBuffer( PS_Decoder*  decoder,
+                             CF2_Int      subrNum,
+                             CF2_Buffer   buf );
+
+  FT_LOCAL( CF2_Fixed )
+  cf2_getDefaultWidthX( PS_Decoder*  decoder );
+  FT_LOCAL( CF2_Fixed )
+  cf2_getNominalWidthX( PS_Decoder*  decoder );
+
+
+  FT_LOCAL( FT_Error )
+  cf2_getT1SeacComponent( PS_Decoder*  decoder,
+                          FT_UInt      glyph_index,
+                          CF2_Buffer   buf );
+  FT_LOCAL( void )
+  cf2_freeT1SeacComponent( PS_Decoder*  decoder,
+                           CF2_Buffer   buf );
+
+  /*
+   * FreeType client outline
+   *
+   * process output from the charstring interpreter
+   */
+  typedef struct  CF2_OutlineRec_
+  {
+    CF2_OutlineCallbacksRec  root;        /* base class must be first */
+    PS_Decoder*              decoder;
+
+  } CF2_OutlineRec, *CF2_Outline;
+
+
+  FT_LOCAL( void )
+  cf2_outline_reset( CF2_Outline  outline );
+  FT_LOCAL( void )
+  cf2_outline_close( CF2_Outline  outline );
+
+
+FT_END_HEADER
+
+
+#endif /* PSFT_H_ */
+
+
+/* END */
diff --git a/src/cff/cf2glue.h b/src/psaux/psglue.h
similarity index 95%
rename from src/cff/cf2glue.h
rename to src/psaux/psglue.h
index a24da39..5545e12 100644
--- a/src/cff/cf2glue.h
+++ b/src/psaux/psglue.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2glue.h                                                              */
+/*  psglue.h                                                               */
 /*                                                                         */
 /*    Adobe's code for shared stuff (specification only).                  */
 /*                                                                         */
@@ -36,15 +36,15 @@
 /***************************************************************************/
 
 
-#ifndef __CF2GLUE_H__
-#define __CF2GLUE_H__
+#ifndef PSGLUE_H_
+#define PSGLUE_H_
 
 
 /* common includes for other modules */
-#include "cf2error.h"
-#include "cf2fixed.h"
-#include "cf2arrst.h"
-#include "cf2read.h"
+#include "pserror.h"
+#include "psfixed.h"
+#include "psarrst.h"
+#include "psread.h"
 
 
 FT_BEGIN_HEADER
@@ -138,7 +138,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2GLUE_H__ */
+#endif /* PSGLUE_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2hints.c b/src/psaux/pshints.c
similarity index 85%
rename from src/cff/cf2hints.c
rename to src/psaux/pshints.c
index 0e27000..3615196 100644
--- a/src/cff/cf2hints.c
+++ b/src/psaux/pshints.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2hints.c                                                             */
+/*  pshints.c                                                              */
 /*                                                                         */
 /*    Adobe's code for handling CFF hints (body).                          */
 /*                                                                         */
@@ -36,13 +36,13 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2hints.h"
-#include "cf2intrp.h"
+#include "psglue.h"
+#include "psfont.h"
+#include "pshints.h"
+#include "psintrp.h"
 
 
   /*************************************************************************/
@@ -74,8 +74,8 @@
     /* cross product of pt1 position from origin with pt2 position from  */
     /* pt1; we reduce the precision so that the result fits into 32 bits */
 
-    return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -
-           ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );
+    return ( x1 >> 16 ) * ( SUB_INT32( y2, y1 ) >> 16 ) -
+           ( y1 >> 16 ) * ( SUB_INT32( x2, x1 ) >> 16 );
   }
 
 
@@ -105,7 +105,7 @@
                                          stemHintArray,
                                          indexStemHint );
 
-    width = stemHint->max - stemHint->min;
+    width = SUB_INT32( stemHint->max, stemHint->min );
 
     if ( width == cf2_intToFixed( -21 ) )
     {
@@ -185,11 +185,11 @@
     /* darkening.  Bottoms are not changed; tops are incremented by twice */
     /* `darkenY'.                                                         */
     if ( cf2_hint_isTop( hint ) )
-      hint->csCoord += 2 * font->darkenY;
+      hint->csCoord = ADD_INT32( hint->csCoord, 2 * font->darkenY );
 
-    hint->csCoord += hintOrigin;
-    hint->scale    = scale;
-    hint->index    = indexStemHint;   /* index in original stem hint array */
+    hint->csCoord = ADD_INT32( hint->csCoord, hintOrigin );
+    hint->scale   = scale;
+    hint->index   = indexStemHint;   /* index in original stem hint array */
 
     /* if original stem hint has been used, use the same position */
     if ( hint->flags != 0 && stemHint->used )
@@ -299,6 +299,36 @@
   }
 
 
+  static void
+  cf2_hintmap_dump( CF2_HintMap  hintmap )
+  {
+#ifdef FT_DEBUG_LEVEL_TRACE
+    CF2_UInt  i;
+
+
+    FT_TRACE6(( "  index  csCoord  dsCoord  scale  flags\n" ));
+
+    for ( i = 0; i < hintmap->count; i++ )
+    {
+      CF2_Hint  hint = &hintmap->edge[i];
+
+
+      FT_TRACE6(( "  %3d    %7.2f  %7.2f  %5d  %s%s%s%s\n",
+                  hint->index,
+                  hint->csCoord / 65536.0,
+                  hint->dsCoord / ( hint->scale * 1.0 ),
+                  hint->scale,
+                  ( cf2_hint_isPair( hint ) ? "p" : "g" ),
+                  ( cf2_hint_isTop( hint ) ? "t" : "b" ),
+                  ( cf2_hint_isLocked( hint ) ? "L" : ""),
+                  ( cf2_hint_isSynthetic( hint ) ? "S" : "" ) ));
+    }
+#else
+    FT_UNUSED( hintmap );
+#endif
+  }
+
+
   /* transform character space coordinate to device space using hint map */
   static CF2_Fixed
   cf2_hintmap_map( CF2_HintMap  hintmap,
@@ -314,6 +344,7 @@
       /* start linear search from last hit */
       CF2_UInt  i = hintmap->lastIndex;
 
+
       FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
 
       /* search up */
@@ -330,9 +361,10 @@
       if ( i == 0 && csCoord < hintmap->edge[0].csCoord )
       {
         /* special case for points below first edge: use uniform scale */
-        return FT_MulFix( csCoord - hintmap->edge[0].csCoord,
-                          hintmap->scale ) +
-                 hintmap->edge[0].dsCoord;
+        return ADD_INT32( FT_MulFix( SUB_INT32( csCoord,
+                                                hintmap->edge[0].csCoord ),
+                                     hintmap->scale ),
+                          hintmap->edge[0].dsCoord );
       }
       else
       {
@@ -340,9 +372,10 @@
          * Note: entries with duplicate csCoord are allowed.
          * Use edge[i], the highest entry where csCoord >= entry[i].csCoord
          */
-        return FT_MulFix( csCoord - hintmap->edge[i].csCoord,
-                          hintmap->edge[i].scale ) +
-                 hintmap->edge[i].dsCoord;
+        return ADD_INT32( FT_MulFix( SUB_INT32( csCoord,
+                                                hintmap->edge[i].csCoord ),
+                                     hintmap->edge[i].scale ),
+                          hintmap->edge[i].dsCoord );
       }
     }
   }
@@ -401,10 +434,10 @@
         /* calculate all four possibilities; moves down are negative */
         CF2_Fixed  downMoveDown = 0 - fracDown;
         CF2_Fixed  upMoveDown   = 0 - fracUp;
-        CF2_Fixed  downMoveUp   = fracDown == 0
+        CF2_Fixed  downMoveUp   = ( fracDown == 0 )
                                     ? 0
                                     : cf2_intToFixed( 1 ) - fracDown;
-        CF2_Fixed  upMoveUp     = fracUp == 0
+        CF2_Fixed  upMoveUp     = ( fracUp == 0 )
                                     ? 0
                                     : cf2_intToFixed( 1 ) - fracUp;
 
@@ -437,14 +470,16 @@
         /* is there room to move up?                                    */
         /* there is if we are at top of array or the next edge is at or */
         /* beyond proposed move up?                                     */
-        if ( j >= hintmap->count - 1                            ||
+        if ( j >= hintmap->count - 1                ||
              hintmap->edge[j + 1].dsCoord >=
-               hintmap->edge[j].dsCoord + moveUp + upMinCounter )
+               ADD_INT32( hintmap->edge[j].dsCoord,
+                          moveUp + upMinCounter )   )
         {
           /* there is room to move up; is there also room to move down? */
-          if ( i == 0                                                 ||
+          if ( i == 0                                   ||
                hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+                 ADD_INT32( hintmap->edge[i].dsCoord,
+                            moveDown - downMinCounter ) )
           {
             /* move smaller absolute amount */
             move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */
@@ -455,9 +490,10 @@
         else
         {
           /* is there room to move down? */
-          if ( i == 0                                                 ||
+          if ( i == 0                                   ||
                hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+                 ADD_INT32( hintmap->edge[i].dsCoord,
+                            moveDown - downMinCounter ) )
           {
             move     = moveDown;
             /* true if non-optimum move */
@@ -491,9 +527,11 @@
         }
 
         /* move the edge(s) */
-        hintmap->edge[i].dsCoord += move;
+        hintmap->edge[i].dsCoord = ADD_INT32( hintmap->edge[i].dsCoord,
+                                              move );
         if ( isPair )
-          hintmap->edge[j].dsCoord += move;
+          hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord,
+                                                move );
       }
 
       /* assert there are no overlaps in device space */
@@ -507,18 +545,20 @@
       {
         if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )
           hintmap->edge[i - 1].scale =
-            FT_DivFix(
-              hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,
-              hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );
+            FT_DivFix( SUB_INT32( hintmap->edge[i].dsCoord,
+                                  hintmap->edge[i - 1].dsCoord ),
+                       SUB_INT32( hintmap->edge[i].csCoord,
+                                  hintmap->edge[i - 1].csCoord ) );
       }
 
       if ( isPair )
       {
         if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )
           hintmap->edge[j - 1].scale =
-            FT_DivFix(
-              hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,
-              hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );
+            FT_DivFix( SUB_INT32( hintmap->edge[j].dsCoord,
+                                  hintmap->edge[j - 1].dsCoord ),
+                       SUB_INT32( hintmap->edge[j].csCoord,
+                                  hintmap->edge[j - 1].csCoord ) );
 
         i += 1;     /* skip upper edge on next loop */
       }
@@ -539,15 +579,18 @@
 
       /* is there room to move up? */
       if ( hintmap->edge[j + 1].dsCoord >=
-             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
+             ADD_INT32( hintmap->edge[j].dsCoord,
+                        hintMove->moveUp + CF2_MIN_COUNTER ) )
       {
         /* there is more room now, move edge up */
-        hintmap->edge[j].dsCoord += hintMove->moveUp;
+        hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord,
+                                              hintMove->moveUp );
 
         if ( cf2_hint_isPair( &hintmap->edge[j] ) )
         {
           FT_ASSERT( j > 0 );
-          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
+          hintmap->edge[j - 1].dsCoord =
+            ADD_INT32( hintmap->edge[j - 1].dsCoord, hintMove->moveUp );
         }
       }
     }
@@ -587,8 +630,9 @@
     }
 
     /* paired edges must be in proper order */
-    FT_ASSERT( !isPair                                         ||
-               topHintEdge->csCoord >= bottomHintEdge->csCoord );
+    if ( isPair                                         &&
+         topHintEdge->csCoord < bottomHintEdge->csCoord )
+      return;
 
     /* linear search to find index value of insertion point */
     indexInsert = 0;
@@ -598,6 +642,14 @@
         break;
     }
 
+    FT_TRACE7(( "  Got hint at %.2f (%.2f)\n",
+                firstHintEdge->csCoord / 65536.0,
+                firstHintEdge->dsCoord / 65536.0 ));
+    if ( isPair )
+      FT_TRACE7(( "  Got hint at %.2f (%.2f)\n",
+                  secondHintEdge->csCoord / 65536.0,
+                  secondHintEdge->dsCoord / 65536.0 ));
+
     /*
      * Discard any hints that overlap in character space.  Most often, this
      * is while building the initial map, where captured hints from all
@@ -634,18 +686,19 @@
       {
         /* Use hint map to position the center of stem, and nominal scale */
         /* to position the two edges.  This preserves the stem width.     */
-        CF2_Fixed  midpoint  = cf2_hintmap_map(
-                                 hintmap->initialHintMap,
-                                 ( secondHintEdge->csCoord +
-                                   firstHintEdge->csCoord ) / 2 );
-        CF2_Fixed  halfWidth = FT_MulFix(
-                                 ( secondHintEdge->csCoord -
-                                   firstHintEdge->csCoord ) / 2,
-                                 hintmap->scale );
+        CF2_Fixed  midpoint =
+                     cf2_hintmap_map(
+                       hintmap->initialHintMap,
+                       ADD_INT32( secondHintEdge->csCoord,
+                                  firstHintEdge->csCoord ) / 2 );
+        CF2_Fixed  halfWidth =
+                     FT_MulFix( SUB_INT32( secondHintEdge->csCoord,
+                                           firstHintEdge->csCoord ) / 2,
+                                hintmap->scale );
 
 
-        firstHintEdge->dsCoord  = midpoint - halfWidth;
-        secondHintEdge->dsCoord = midpoint + halfWidth;
+        firstHintEdge->dsCoord  = SUB_INT32( midpoint, halfWidth );
+        secondHintEdge->dsCoord = ADD_INT32( midpoint, halfWidth );
       }
       else
         firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
@@ -714,13 +767,22 @@
 
       /* insert first edge */
       hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */
-      hintmap->count += 1;
+      hintmap->count            += 1;
+
+      FT_TRACE7(( "  Inserting hint %.2f (%.2f)\n",
+                  firstHintEdge->csCoord / 65536.0,
+                  firstHintEdge->dsCoord / 65536.0 ));
 
       if ( isPair )
       {
         /* insert second edge */
         hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */
         hintmap->count                += 1;
+
+        FT_TRACE7(( "  Inserting hint %.2f (%.2f)\n",
+                    secondHintEdge->csCoord / 65536.0,
+                    secondHintEdge->dsCoord / 65536.0 ));
+
       }
     }
 
@@ -780,7 +842,15 @@
                            cf2_arrstack_size( hStemHintArray ) +
                              cf2_arrstack_size( vStemHintArray ) );
       if ( !cf2_hintmask_isValid( hintMask ) )
-          return;                   /* too many stem hints */
+      {
+        if ( font->isT1 )
+        {
+          /* no error, just continue unhinted */
+          *hintMask->error = FT_Err_Ok;
+          hintmap->hinted  = FALSE;
+        }
+        return;                   /* too many stem hints */
+      }
     }
 
     /* begin by clearing the map */
@@ -796,7 +866,7 @@
 
     /* Defense-in-depth.  Should never return here. */
     if ( bitCount > hintMask->bitCount )
-        return;
+      return;
 
     /* synthetic embox hints get highest priority */
     if ( font->blues.doEmBoxHints )
@@ -955,6 +1025,12 @@
       }
     }
 
+    FT_TRACE6(( initialMap ? "flags: [p]air [g]host [t]op "
+                             "[b]ottom [L]ocked [S]ynthetic\n"
+                             "Initial hintmap\n"
+                           : "Hints:\n" ));
+    cf2_hintmap_dump( hintmap );
+
     /*
      * Note: The following line is a convenient place to break when
      *       debugging hinting.  Examine `hintmap->edge' for the list of
@@ -967,6 +1043,9 @@
     /* adjust positions of hint edges that are not locked to blue zones */
     cf2_hintmap_adjustHints( hintmap );
 
+    FT_TRACE6(( "(adjusted)\n" ));
+    cf2_hintmap_dump( hintmap );
+
     /* save the position of all hints that were used in this hint map; */
     /* if we use them again, we'll locate them in the same position    */
     if ( !initialMap )
@@ -1062,7 +1141,7 @@
                                      cf2_fixedAbs( glyphpath->yOffset ) );
 
     /* .1 character space unit */
-    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
+    glyphpath->snapThreshold = cf2_doubleToFixed( 0.1 );
 
     glyphpath->moveIsPending = TRUE;
     glyphpath->pathIsOpen    = FALSE;
@@ -1094,16 +1173,20 @@
     FT_Vector  pt;   /* hinted point in upright DS */
 
 
-    pt.x = FT_MulFix( glyphpath->scaleX, x ) +
-             FT_MulFix( glyphpath->scaleC, y );
+    pt.x = ADD_INT32( FT_MulFix( glyphpath->scaleX, x ),
+                      FT_MulFix( glyphpath->scaleC, y ) );
     pt.y = cf2_hintmap_map( hintmap, y );
 
-    ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x )   +
-               FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +
-               glyphpath->fractionalTranslation.x;
-    ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x )   +
-               FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +
-               glyphpath->fractionalTranslation.y;
+    ppt->x = ADD_INT32(
+               FT_MulFix( glyphpath->font->outerTransform.a, pt.x ),
+               ADD_INT32(
+                 FT_MulFix( glyphpath->font->outerTransform.c, pt.y ),
+                 glyphpath->fractionalTranslation.x ) );
+    ppt->y = ADD_INT32(
+               FT_MulFix( glyphpath->font->outerTransform.b, pt.x ),
+               ADD_INT32(
+                 FT_MulFix( glyphpath->font->outerTransform.d, pt.y ),
+                 glyphpath->fractionalTranslation.y ) );
   }
 
 
@@ -1127,7 +1210,7 @@
      * second segment.
      * Let `w 'be the zero-based vector from `u1' to `v1'.
      * `perp' is the `perpendicular dot product'; see
-     * http://mathworld.wolfram.com/PerpDotProduct.html.
+     * https://mathworld.wolfram.com/PerpDotProduct.html.
      * `s' is the parameter for the parametric line for the first segment
      * (`u').
      *
@@ -1153,12 +1236,12 @@
     CF2_Fixed  denominator, s;
 
 
-    u.x = CF2_CS_SCALE( u2->x - u1->x );
-    u.y = CF2_CS_SCALE( u2->y - u1->y );
-    v.x = CF2_CS_SCALE( v2->x - v1->x );
-    v.y = CF2_CS_SCALE( v2->y - v1->y );
-    w.x = CF2_CS_SCALE( v1->x - u1->x );
-    w.y = CF2_CS_SCALE( v1->y - u1->y );
+    u.x = CF2_CS_SCALE( SUB_INT32( u2->x, u1->x ) );
+    u.y = CF2_CS_SCALE( SUB_INT32( u2->y, u1->y ) );
+    v.x = CF2_CS_SCALE( SUB_INT32( v2->x, v1->x ) );
+    v.y = CF2_CS_SCALE( SUB_INT32( v2->y, v1->y ) );
+    w.x = CF2_CS_SCALE( SUB_INT32( v1->x, u1->x ) );
+    w.y = CF2_CS_SCALE( SUB_INT32( v1->y, u1->y ) );
 
     denominator = cf2_perp( u, v );
 
@@ -1167,8 +1250,11 @@
 
     s = FT_DivFix( cf2_perp( w, v ), denominator );
 
-    intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );
-    intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );
+    intersection->x = ADD_INT32( u1->x,
+                                 FT_MulFix( s, SUB_INT32( u2->x, u1->x ) ) );
+    intersection->y = ADD_INT32( u1->y,
+                                 FT_MulFix( s, SUB_INT32( u2->y, u1->y ) ) );
+
 
     /*
      * Special case snapping for horizontal and vertical lines.
@@ -1179,25 +1265,29 @@
      *
      */
 
-    if ( u1->x == u2->x                                                     &&
-         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
+    if ( u1->x == u2->x                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->x,
+                                  u1->x ) ) < glyphpath->snapThreshold )
       intersection->x = u1->x;
-    if ( u1->y == u2->y                                                     &&
-         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
+    if ( u1->y == u2->y                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->y,
+                                  u1->y ) ) < glyphpath->snapThreshold )
       intersection->y = u1->y;
 
-    if ( v1->x == v2->x                                                     &&
-         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
+    if ( v1->x == v2->x                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->x,
+                                  v1->x ) ) < glyphpath->snapThreshold )
       intersection->x = v1->x;
-    if ( v1->y == v2->y                                                     &&
-         cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )
+    if ( v1->y == v2->y                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->y,
+                                  v1->y ) ) < glyphpath->snapThreshold )
       intersection->y = v1->y;
 
     /* limit the intersection distance from midpoint of u2 and v1 */
-    if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >
-           glyphpath->miterLimit                                   ||
-         cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >
-           glyphpath->miterLimit                                   )
+    if ( cf2_fixedAbs( intersection->x - ADD_INT32( u2->x, v1->x ) / 2 ) >
+           glyphpath->miterLimit                                           ||
+         cf2_fixedAbs( intersection->y - ADD_INT32( u2->y, v1->y ) / 2 ) >
+           glyphpath->miterLimit                                           )
       return FALSE;
 
     return TRUE;
@@ -1445,16 +1535,16 @@
                                CF2_Fixed*     x,
                                CF2_Fixed*     y )
   {
-    CF2_Fixed  dx = x2 - x1;
-    CF2_Fixed  dy = y2 - y1;
+    CF2_Fixed  dx = SUB_INT32( x2, x1 );
+    CF2_Fixed  dy = SUB_INT32( y2, y1 );
 
 
     /* note: negative offsets don't work here; negate deltas to change */
     /* quadrants, below                                                */
     if ( glyphpath->font->reverseWinding )
     {
-      dx = -dx;
-      dy = -dy;
+      dx = NEG_INT32( dx );
+      dy = NEG_INT32( dy );
     }
 
     *x = *y = 0;
@@ -1463,8 +1553,9 @@
         return;
 
     /* add momentum for this path element */
-    glyphpath->callbacks->windingMomentum +=
-      cf2_getWindingMomentum( x1, y1, x2, y2 );
+    glyphpath->callbacks->windingMomentum =
+      ADD_INT32( glyphpath->callbacks->windingMomentum,
+                 cf2_getWindingMomentum( x1, y1, x2, y2 ) );
 
     /* note: allow mixed integer and fixed multiplication here */
     if ( dx >= 0 )
@@ -1473,13 +1564,13 @@
       {
         /* first quadrant, +x +y */
 
-        if ( dx > 2 * dy )
+        if ( dx > MUL_INT32( 2, dy ) )
         {
           /* +x */
           *x = 0;
           *y = 0;
         }
-        else if ( dy > 2 * dx )
+        else if ( dy > MUL_INT32( 2, dx ) )
         {
           /* +y */
           *x = glyphpath->xOffset;
@@ -1488,9 +1579,9 @@
         else
         {
           /* +x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( 0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ),
                           glyphpath->yOffset );
         }
       }
@@ -1498,24 +1589,24 @@
       {
         /* fourth quadrant, +x -y */
 
-        if ( dx > -2 * dy )
+        if ( dx > MUL_INT32( -2, dy ) )
         {
           /* +x */
           *x = 0;
           *y = 0;
         }
-        else if ( -dy > 2 * dx )
+        else if ( NEG_INT32( dy ) > MUL_INT32( 2, dx ) )
         {
           /* -y */
-          *x = -glyphpath->xOffset;
+          *x = NEG_INT32( glyphpath->xOffset );
           *y = glyphpath->yOffset;
         }
         else
         {
           /* +x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( -0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ),
                           glyphpath->yOffset );
         }
       }
@@ -1526,13 +1617,13 @@
       {
         /* second quadrant, -x +y */
 
-        if ( -dx > 2 * dy )
+        if ( NEG_INT32( dx ) > MUL_INT32( 2, dy ) )
         {
           /* -x */
           *x = 0;
-          *y = 2 * glyphpath->yOffset;
+          *y = MUL_INT32( 2, glyphpath->yOffset );
         }
-        else if ( dy > -2 * dx )
+        else if ( dy > MUL_INT32( -2, dx ) )
         {
           /* +y */
           *x = glyphpath->xOffset;
@@ -1541,9 +1632,9 @@
         else
         {
           /* -x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( 0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ),
                           glyphpath->yOffset );
         }
       }
@@ -1551,24 +1642,24 @@
       {
         /* third quadrant, -x -y */
 
-        if ( -dx > -2 * dy )
+        if ( NEG_INT32( dx ) > MUL_INT32( -2, dy ) )
         {
           /* -x */
           *x = 0;
-          *y = 2 * glyphpath->yOffset;
+          *y = MUL_INT32( 2, glyphpath->yOffset );
         }
-        else if ( -dy > -2 * dx )
+        else if ( NEG_INT32( dy ) > MUL_INT32( -2, dx ) )
         {
           /* -y */
-          *x = -glyphpath->xOffset;
+          *x = NEG_INT32( glyphpath->xOffset );
           *y = glyphpath->yOffset;
         }
         else
         {
           /* -x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( -0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ),
                           glyphpath->yOffset );
         }
       }
@@ -1674,10 +1765,10 @@
                                  &yOffset );
 
     /* construct offset points */
-    P0.x = glyphpath->currentCS.x + xOffset;
-    P0.y = glyphpath->currentCS.y + yOffset;
-    P1.x = x + xOffset;
-    P1.y = y + yOffset;
+    P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset );
+    P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset );
+    P1.x = ADD_INT32( x, xOffset );
+    P1.y = ADD_INT32( y, yOffset );
 
     if ( glyphpath->moveIsPending )
     {
@@ -1752,19 +1843,20 @@
                                  &yOffset3 );
 
     /* add momentum from the middle segment */
-    glyphpath->callbacks->windingMomentum +=
-      cf2_getWindingMomentum( x1, y1, x2, y2 );
+    glyphpath->callbacks->windingMomentum =
+      ADD_INT32( glyphpath->callbacks->windingMomentum,
+                 cf2_getWindingMomentum( x1, y1, x2, y2 ) );
 
     /* construct offset points */
-    P0.x = glyphpath->currentCS.x + xOffset1;
-    P0.y = glyphpath->currentCS.y + yOffset1;
-    P1.x = x1 + xOffset1;
-    P1.y = y1 + yOffset1;
+    P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset1 );
+    P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset1 );
+    P1.x = ADD_INT32( x1, xOffset1 );
+    P1.y = ADD_INT32( y1, yOffset1 );
     /* note: preserve angle of final segment by using offset3 at both ends */
-    P2.x = x2 + xOffset3;
-    P2.y = y2 + yOffset3;
-    P3.x = x3 + xOffset3;
-    P3.y = y3 + yOffset3;
+    P2.x = ADD_INT32( x2, xOffset3 );
+    P2.y = ADD_INT32( y2, yOffset3 );
+    P3.x = ADD_INT32( x3, xOffset3 );
+    P3.y = ADD_INT32( y3, yOffset3 );
 
     if ( glyphpath->moveIsPending )
     {
diff --git a/src/cff/cf2hints.h b/src/psaux/pshints.h
similarity index 97%
rename from src/cff/cf2hints.h
rename to src/psaux/pshints.h
index f25d91b..92e37e9 100644
--- a/src/cff/cf2hints.h
+++ b/src/psaux/pshints.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2hints.h                                                             */
+/*  pshints.h                                                              */
 /*                                                                         */
 /*    Adobe's code for handling CFF hints (body).                          */
 /*                                                                         */
@@ -36,9 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef __CF2HINTS_H__
-#define __CF2HINTS_H__
-
+#ifndef PSHINT_H_
+#define PSHINT_H_
 
 FT_BEGIN_HEADER
 
@@ -220,7 +219,7 @@
 
     /* character space miter limit threshold */
     CF2_Fixed  miterLimit;
-    /* vertical/horzizontal snap distance in character space */
+    /* vertical/horizontal snap distance in character space */
     CF2_Fixed  snapThreshold;
 
     FT_Vector  offsetStart0;  /* first and second points of first */
@@ -283,7 +282,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2HINTS_H__ */
+#endif /* PSHINT_H_ */
 
 
 /* END */
diff --git a/src/psaux/psintrp.c b/src/psaux/psintrp.c
new file mode 100644
index 0000000..da5a8da
--- /dev/null
+++ b/src/psaux/psintrp.c
@@ -0,0 +1,3040 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psintrp.c                                                              */
+/*                                                                         */
+/*    Adobe's CFF Interpreter (body).                                      */
+/*                                                                         */
+/*  Copyright 2007-2014 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "psft.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "psglue.h"
+#include "psfont.h"
+#include "psstack.h"
+#include "pshints.h"
+#include "psintrp.h"
+
+#include "pserror.h"
+
+#include "psobjs.h"   /* for cff_random */
+#include "t1decode.h" /* for t1 seac    */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cf2interp
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_init( CF2_HintMask  hintmask,
+                     FT_Error*     error )
+  {
+    FT_ZERO( hintmask );
+
+    hintmask->error = error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isValid( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isValid;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isNew( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isNew;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setNew( CF2_HintMask  hintmask,
+                       FT_Bool       val )
+  {
+    hintmask->isNew = val;
+  }
+
+
+  /* clients call `getMaskPtr' in order to iterate */
+  /* through hint mask                             */
+
+  FT_LOCAL_DEF( FT_Byte* )
+  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )
+  {
+    return hintmask->mask;
+  }
+
+
+  static size_t
+  cf2_hintmask_setCounts( CF2_HintMask  hintmask,
+                          size_t        bitCount )
+  {
+    if ( bitCount > CF2_MAX_HINTS )
+    {
+      /* total of h and v stems must be <= 96 */
+      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
+      return 0;
+    }
+
+    hintmask->bitCount  = bitCount;
+    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
+
+    hintmask->isValid = TRUE;
+    hintmask->isNew   = TRUE;
+
+    return bitCount;
+  }
+
+
+  /* consume the hintmask bytes from the charstring, advancing the src */
+  /* pointer                                                           */
+  static void
+  cf2_hintmask_read( CF2_HintMask  hintmask,
+                     CF2_Buffer    charstring,
+                     size_t        bitCount )
+  {
+    size_t  i;
+
+#ifndef CF2_NDEBUG
+    /* these are the bits in the final mask byte that should be zero  */
+    /* Note: this variable is only used in an assert expression below */
+    /* and then only if CF2_NDEBUG is not defined                     */
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+#endif
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+
+    FT_TRACE4(( " (maskbytes:" ));
+
+    /* set mask and advance interpreter's charstring pointer */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+    {
+      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
+      FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
+    }
+
+    FT_TRACE4(( ")\n" ));
+
+    /* assert any unused bits in last byte are zero unless there's a prior */
+    /* error                                                               */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */
+#ifndef CF2_NDEBUG
+    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
+               *hintmask->error                                        );
+#endif
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setAll( CF2_HintMask  hintmask,
+                       size_t        bitCount )
+  {
+    size_t    i;
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+    FT_ASSERT( hintmask->byteCount <=
+                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
+
+    /* set mask to all ones */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+      hintmask->mask[i] = 0xFF;
+
+    /* clear unused bits                                              */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+    hintmask->mask[hintmask->byteCount - 1] &= ~mask;
+  }
+
+
+  /* Type2 charstring opcodes */
+  enum
+  {
+    cf2_cmdRESERVED_0,   /* 0 */
+    cf2_cmdHSTEM,        /* 1 */
+    cf2_cmdRESERVED_2,   /* 2 */
+    cf2_cmdVSTEM,        /* 3 */
+    cf2_cmdVMOVETO,      /* 4 */
+    cf2_cmdRLINETO,      /* 5 */
+    cf2_cmdHLINETO,      /* 6 */
+    cf2_cmdVLINETO,      /* 7 */
+    cf2_cmdRRCURVETO,    /* 8 */
+    cf2_cmdCLOSEPATH,    /* 9      T1 only */
+    cf2_cmdCALLSUBR,     /* 10 */
+    cf2_cmdRETURN,       /* 11 */
+    cf2_cmdESC,          /* 12 */
+    cf2_cmdHSBW,         /* 13     T1 only */
+    cf2_cmdENDCHAR,      /* 14 */
+    cf2_cmdVSINDEX,      /* 15 */
+    cf2_cmdBLEND,        /* 16 */
+    cf2_cmdRESERVED_17,  /* 17 */
+    cf2_cmdHSTEMHM,      /* 18 */
+    cf2_cmdHINTMASK,     /* 19 */
+    cf2_cmdCNTRMASK,     /* 20 */
+    cf2_cmdRMOVETO,      /* 21 */
+    cf2_cmdHMOVETO,      /* 22 */
+    cf2_cmdVSTEMHM,      /* 23 */
+    cf2_cmdRCURVELINE,   /* 24 */
+    cf2_cmdRLINECURVE,   /* 25 */
+    cf2_cmdVVCURVETO,    /* 26 */
+    cf2_cmdHHCURVETO,    /* 27 */
+    cf2_cmdEXTENDEDNMBR, /* 28 */
+    cf2_cmdCALLGSUBR,    /* 29 */
+    cf2_cmdVHCURVETO,    /* 30 */
+    cf2_cmdHVCURVETO     /* 31 */
+  };
+
+  enum
+  {
+    cf2_escDOTSECTION,   /* 0 */
+    cf2_escVSTEM3,       /* 1      T1 only */
+    cf2_escHSTEM3,       /* 2      T1 only */
+    cf2_escAND,          /* 3 */
+    cf2_escOR,           /* 4 */
+    cf2_escNOT,          /* 5 */
+    cf2_escSEAC,         /* 6      T1 only */
+    cf2_escSBW,          /* 7      T1 only */
+    cf2_escRESERVED_8,   /* 8 */
+    cf2_escABS,          /* 9 */
+    cf2_escADD,          /* 10     like otherADD */
+    cf2_escSUB,          /* 11     like otherSUB */
+    cf2_escDIV,          /* 12 */
+    cf2_escRESERVED_13,  /* 13 */
+    cf2_escNEG,          /* 14 */
+    cf2_escEQ,           /* 15 */
+    cf2_escCALLOTHERSUBR,/* 16     T1 only */
+    cf2_escPOP,          /* 17     T1 only */
+    cf2_escDROP,         /* 18 */
+    cf2_escRESERVED_19,  /* 19 */
+    cf2_escPUT,          /* 20     like otherPUT    */
+    cf2_escGET,          /* 21     like otherGET    */
+    cf2_escIFELSE,       /* 22     like otherIFELSE */
+    cf2_escRANDOM,       /* 23     like otherRANDOM */
+    cf2_escMUL,          /* 24     like otherMUL    */
+    cf2_escRESERVED_25,  /* 25 */
+    cf2_escSQRT,         /* 26 */
+    cf2_escDUP,          /* 27     like otherDUP    */
+    cf2_escEXCH,         /* 28     like otherEXCH   */
+    cf2_escINDEX,        /* 29 */
+    cf2_escROLL,         /* 30 */
+    cf2_escRESERVED_31,  /* 31 */
+    cf2_escRESERVED_32,  /* 32 */
+    cf2_escSETCURRENTPT, /* 33     T1 only */
+    cf2_escHFLEX,        /* 34 */
+    cf2_escFLEX,         /* 35 */
+    cf2_escHFLEX1,       /* 36 */
+    cf2_escFLEX1,        /* 37 */
+    cf2_escRESERVED_38   /* 38     & all higher     */
+  };
+
+
+  /* `stemHintArray' does not change once we start drawing the outline. */
+  static void
+  cf2_doStems( const CF2_Font  font,
+               CF2_Stack       opStack,
+               CF2_ArrStack    stemHintArray,
+               CF2_Fixed*      width,
+               FT_Bool*        haveWidth,
+               CF2_Fixed       hintOffset )
+  {
+    CF2_UInt  i;
+    CF2_UInt  count       = cf2_stack_count( opStack );
+    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );
+
+    /* variable accumulates delta values from operand stack */
+    CF2_Fixed  position = hintOffset;
+
+    if ( font->isT1 && !font->decoder->flex_state && !*haveWidth )
+      FT_ERROR(( "cf2_doStems (Type 1 mode):"
+                 " No width. Use hsbw/sbw as first op\n" ));
+
+    if ( !font->isT1 && hasWidthArg && !*haveWidth )
+      *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                          cf2_getNominalWidthX( font->decoder ) );
+
+    if ( font->decoder->width_only )
+      goto exit;
+
+    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
+    {
+      /* construct a CF2_StemHint and push it onto the list */
+      CF2_StemHintRec  stemhint;
+
+
+      stemhint.min =
+      position     = ADD_INT32( position,
+                                cf2_stack_getReal( opStack, i ) );
+      stemhint.max =
+      position     = ADD_INT32( position,
+                                cf2_stack_getReal( opStack, i + 1 ) );
+
+      stemhint.used  = FALSE;
+      stemhint.maxDS =
+      stemhint.minDS = 0;
+
+      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
+    }
+
+    cf2_stack_clear( opStack );
+
+  exit:
+    /* cf2_doStems must define a width (may be default) */
+    *haveWidth = TRUE;
+  }
+
+
+  static void
+  cf2_doFlex( CF2_Stack       opStack,
+              CF2_Fixed*      curX,
+              CF2_Fixed*      curY,
+              CF2_GlyphPath   glyphPath,
+              const FT_Bool*  readFromStack,
+              FT_Bool         doConditionalLastRead )
+  {
+    CF2_Fixed  vals[14];
+    CF2_UInt   idx;
+    FT_Bool    isHFlex;
+    CF2_Int    top, i, j;
+
+
+    vals[0] = *curX;
+    vals[1] = *curY;
+    idx     = 0;
+    isHFlex = FT_BOOL( readFromStack[9] == FALSE );
+    top     = isHFlex ? 9 : 10;
+
+    for ( i = 0; i < top; i++ )
+    {
+      vals[i + 2] = vals[i];
+      if ( readFromStack[i] )
+        vals[i + 2] = ADD_INT32( vals[i + 2], cf2_stack_getReal( opStack,
+                                                                 idx++ ) );
+    }
+
+    if ( isHFlex )
+      vals[9 + 2] = *curY;
+
+    if ( doConditionalLastRead )
+    {
+      FT_Bool    lastIsX = (FT_Bool)(
+                             cf2_fixedAbs( SUB_INT32( vals[10], *curX ) ) >
+                             cf2_fixedAbs( SUB_INT32( vals[11], *curY ) ) );
+      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, idx );
+
+
+      if ( lastIsX )
+      {
+        vals[12] = ADD_INT32( vals[10], lastVal );
+        vals[13] = *curY;
+      }
+      else
+      {
+        vals[12] = *curX;
+        vals[13] = ADD_INT32( vals[11], lastVal );
+      }
+    }
+    else
+    {
+      if ( readFromStack[10] )
+        vals[12] = ADD_INT32( vals[10],
+                              cf2_stack_getReal( opStack, idx++ ) );
+      else
+        vals[12] = *curX;
+
+      if ( readFromStack[11] )
+        vals[13] = ADD_INT32( vals[11],
+                              cf2_stack_getReal( opStack, idx ) );
+      else
+        vals[13] = *curY;
+    }
+
+    for ( j = 0; j < 2; j++ )
+      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
+                                        vals[j * 6 + 3],
+                                        vals[j * 6 + 4],
+                                        vals[j * 6 + 5],
+                                        vals[j * 6 + 6],
+                                        vals[j * 6 + 7] );
+
+    cf2_stack_clear( opStack );
+
+    *curX = vals[12];
+    *curY = vals[13];
+  }
+
+
+  /* Blend numOperands on the stack,                */
+  /* store results into the first numBlends values, */
+  /* then pop remaining arguments.                  */
+  static void
+  cf2_doBlend( const CFF_Blend  blend,
+               CF2_Stack        opStack,
+               CF2_UInt         numBlends )
+  {
+    CF2_UInt  delta;
+    CF2_UInt  base;
+    CF2_UInt  i, j;
+    CF2_UInt  numOperands = (CF2_UInt)( numBlends * blend->lenBV );
+
+
+    base  = cf2_stack_count( opStack ) - numOperands;
+    delta = base + numBlends;
+
+    for ( i = 0; i < numBlends; i++ )
+    {
+      const CF2_Fixed*  weight = &blend->BV[1];
+
+      /* start with first term */
+      CF2_Fixed  sum = cf2_stack_getReal( opStack, i + base );
+
+
+      for ( j = 1; j < blend->lenBV; j++ )
+        sum = ADD_INT32( sum,
+                         FT_MulFix( *weight++,
+                                    cf2_stack_getReal( opStack,
+                                                       delta++ ) ) );
+
+      /* store blended result  */
+      cf2_stack_setReal( opStack, i + base, sum );
+    }
+
+    /* leave only `numBlends' results on stack */
+    cf2_stack_pop( opStack, numOperands - numBlends );
+  }
+
+
+  /*
+   * `error' is a shared error code used by many objects in this
+   * routine.  Before the code continues from an error, it must check and
+   * record the error in `*error'.  The idea is that this shared
+   * error code will record the first error encountered.  If testing
+   * for an error anyway, the cost of `goto exit' is small, so we do it,
+   * even if continuing would be safe.  In this case, `lastError' is
+   * set, so the testing and storing can be done in one place, at `exit'.
+   *
+   * Continuing after an error is intended for objects which do their own
+   * testing of `*error', e.g., array stack functions.  This allows us to
+   * avoid an extra test after the call.
+   *
+   * Unimplemented opcodes are ignored.
+   *
+   */
+  FT_LOCAL_DEF( void )
+  cf2_interpT2CharString( CF2_Font              font,
+                          CF2_Buffer            buf,
+                          CF2_OutlineCallbacks  callbacks,
+                          const FT_Vector*      translation,
+                          FT_Bool               doingSeac,
+                          CF2_Fixed             curX,
+                          CF2_Fixed             curY,
+                          CF2_Fixed*            width )
+  {
+    /* lastError is used for errors that are immediately tested */
+    FT_Error  lastError = FT_Err_Ok;
+
+    /* pointer to parsed font object */
+    PS_Decoder*  decoder = font->decoder;
+
+    FT_Error*  error  = &font->error;
+    FT_Memory  memory = font->memory;
+
+    CF2_Fixed  scaleY        = font->innerTransform.d;
+    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );
+
+    /* stuff for Type 1 */
+    FT_Int   known_othersubr_result_cnt = 0;
+    FT_Bool  large_int                  = FALSE;
+    FT_Bool  initial_map_ready          = FALSE;
+
+#define PS_STORAGE_SIZE 3
+    CF2_F16Dot16  results[PS_STORAGE_SIZE];   /* for othersubr results */
+    FT_Int        result_cnt = 0;
+
+    /* save this for hinting seac accents */
+    CF2_Fixed  hintOriginY = curY;
+
+    CF2_Stack  opStack = NULL;
+    FT_UInt    stackSize;
+    FT_Byte    op1;                       /* first opcode byte */
+
+    CF2_F16Dot16  storage[CF2_STORAGE_SIZE];    /* for `put' and `get' */
+    CF2_F16Dot16  flexStore[6];                 /* for Type 1 flex     */
+
+    /* instruction limit; 20,000,000 matches Avalon */
+    FT_UInt32  instructionLimit = 20000000UL;
+
+    CF2_ArrStackRec  subrStack;
+
+    FT_Bool     haveWidth;
+    CF2_Buffer  charstring = NULL;
+
+    CF2_Int  charstringIndex = -1;       /* initialize to empty */
+
+    /* TODO: placeholders for hint structures */
+
+    /* objects used for hinting */
+    CF2_ArrStackRec  hStemHintArray;
+    CF2_ArrStackRec  vStemHintArray;
+
+    CF2_HintMaskRec   hintMask;
+    CF2_GlyphPathRec  glyphPath;
+
+
+    FT_ZERO( &storage );
+    FT_ZERO( &results );
+    FT_ZERO( &flexStore );
+
+    /* initialize the remaining objects */
+    cf2_arrstack_init( &subrStack,
+                       memory,
+                       error,
+                       sizeof ( CF2_BufferRec ) );
+    cf2_arrstack_init( &hStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+    cf2_arrstack_init( &vStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+
+    /* initialize CF2_StemHint arrays */
+    cf2_hintmask_init( &hintMask, error );
+
+    /* initialize path map to manage drawing operations */
+
+    /* Note: last 4 params are used to handle `MoveToPermissive', which */
+    /*       may need to call `hintMap.Build'                           */
+    /* TODO: MoveToPermissive is gone; are these still needed?          */
+    cf2_glyphpath_init( &glyphPath,
+                        font,
+                        callbacks,
+                        scaleY,
+                        /* hShift, */
+                        &hStemHintArray,
+                        &vStemHintArray,
+                        &hintMask,
+                        hintOriginY,
+                        &font->blues,
+                        translation );
+
+    /*
+     * Initialize state for width parsing.  From the CFF Spec:
+     *
+     *   The first stack-clearing operator, which must be one of hstem,
+     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
+     *   rmoveto, or endchar, takes an additional argument - the width (as
+     *   described earlier), which may be expressed as zero or one numeric
+     *   argument.
+     *
+     * What we implement here uses the first validly specified width, but
+     * does not detect errors for specifying more than one width.
+     *
+     * If one of the above operators occurs without explicitly specifying
+     * a width, we assume the default width.
+     *
+     * CFF2 charstrings always return the default width (0).
+     *
+     */
+    haveWidth = font->isCFF2 ? TRUE : FALSE;
+    *width    = cf2_getDefaultWidthX( decoder );
+
+    /*
+     * Note: At this point, all pointers to resources must be NULL
+     *       and all local objects must be initialized.
+     *       There must be no branches to `exit:' above this point.
+     *
+     */
+
+    /* allocate an operand stack */
+    stackSize = font->isCFF2 ? cf2_getMaxstack( decoder )
+                             : CF2_OPERAND_STACK_SIZE;
+    opStack   = cf2_stack_init( memory, error, stackSize );
+
+    if ( !opStack )
+    {
+      lastError = FT_THROW( Out_Of_Memory );
+      goto exit;
+    }
+
+    /* initialize subroutine stack by placing top level charstring as */
+    /* first element (max depth plus one for the charstring)          */
+    /* Note: Caller owns and must finalize the first charstring.      */
+    /*       Our copy of it does not change that requirement.         */
+    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
+
+    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+    *charstring = *buf;    /* structure copy */
+
+    charstringIndex = 0;       /* entry is valid now */
+
+    /* catch errors so far */
+    if ( *error )
+      goto exit;
+
+    /* main interpreter loop */
+    while ( 1 )
+    {
+      if ( font->isT1 )
+        FT_ASSERT( known_othersubr_result_cnt == 0 ||
+                   result_cnt == 0                 );
+
+      if ( cf2_buf_isEnd( charstring ) )
+      {
+        /* If we've reached the end of the charstring, simulate a */
+        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */
+        /* We do this for both CFF and CFF2.                      */
+        if ( charstringIndex )
+          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */
+        else
+          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
+      }
+      else
+      {
+        op1 = (FT_Byte)cf2_buf_readByte( charstring );
+
+        /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */
+        /* Note: Trace message will report 0 instead of 11 or 14. */
+        if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) &&
+             font->isCFF2                                      )
+          op1 = cf2_cmdRESERVED_0;
+      }
+
+      if ( font->isT1 )
+      {
+        if ( !initial_map_ready           &&
+             !( op1 == cf2_cmdHSTEM     ||
+                op1 == cf2_cmdVSTEM     ||
+                op1 == cf2_cmdHSBW      ||
+                op1 == cf2_cmdCALLSUBR  ||
+                op1 == cf2_cmdRETURN    ||
+                op1 == cf2_cmdESC       ||
+                op1 == cf2_cmdENDCHAR   ||
+                op1 >= 32 /* Numbers */ ) )
+        {
+          /* Skip outline commands first time round.       */
+          /* `endchar' will trigger initial hintmap build  */
+          /* and rewind the charstring.                    */
+          cf2_stack_clear( opStack );
+          continue;
+        }
+
+        if ( result_cnt > 0               &&
+             !( op1 == cf2_cmdCALLSUBR  ||
+                op1 == cf2_cmdRETURN    ||
+                op1 == cf2_cmdESC       ||
+                op1 >= 32 /* Numbers */ ) )
+        {
+          /* all operands have been transferred by previous pops */
+          result_cnt = 0;
+        }
+
+        if ( large_int && !( op1 >= 32 || op1 == cf2_escDIV ) )
+        {
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " no `div' after large integer\n" ));
+
+          large_int = FALSE;
+        }
+      }
+
+      /* check for errors once per loop */
+      if ( *error )
+        goto exit;
+
+      instructionLimit--;
+      if ( instructionLimit == 0 )
+      {
+        lastError = FT_THROW( Invalid_Glyph_Format );
+        goto exit;
+      }
+
+      switch( op1 )
+      {
+      case cf2_cmdRESERVED_0:
+      case cf2_cmdRESERVED_2:
+      case cf2_cmdRESERVED_17:
+        /* we may get here if we have a prior error */
+        FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        break;
+
+      case cf2_cmdVSINDEX:
+        FT_TRACE4(( " vsindex\n" ));
+
+        if ( !font->isCFF2 )
+          break;    /* clear stack & ignore */
+
+        if ( font->blend.usedBV )
+        {
+          /* vsindex not allowed after blend */
+          lastError = FT_THROW( Invalid_Glyph_Format );
+          goto exit;
+        }
+
+        {
+          FT_Int  temp = cf2_stack_popInt( opStack );
+
+
+          if ( temp >= 0 )
+            font->vsindex = (FT_UInt)temp;
+        }
+        break;
+
+      case cf2_cmdBLEND:
+        {
+          FT_UInt  numBlends;
+
+
+          FT_TRACE4(( " blend\n" ));
+
+          if ( !font->isCFF2 )
+            break;    /* clear stack & ignore */
+
+          /* do we have a `blend' op in a non-variant font? */
+          if ( !font->blend.font )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;
+          }
+
+          /* check cached blend vector */
+          if ( font->cffload->blend_check_vector( &font->blend,
+                                                  font->vsindex,
+                                                  font->lenNDV,
+                                                  font->NDV ) )
+          {
+            lastError = font->cffload->blend_build_vector( &font->blend,
+                                                           font->vsindex,
+                                                           font->lenNDV,
+                                                           font->NDV );
+            if ( lastError )
+              goto exit;
+          }
+
+          /* do the blend */
+          numBlends = (FT_UInt)cf2_stack_popInt( opStack );
+          if ( numBlends > stackSize )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;
+          }
+
+          cf2_doBlend( &font->blend, opStack, numBlends );
+
+          font->blend.usedBV = TRUE;
+        }
+        continue;     /* do not clear the stack */
+
+      case cf2_cmdHSTEMHM:
+      case cf2_cmdHSTEM:
+        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
+
+        if ( !font->isT1 )
+        {
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid horizontal hint mask\n" ));
+            break;
+          }
+        }
+
+        /* add left-sidebearing correction in Type 1 mode */
+        cf2_doStems( font,
+                     opStack,
+                     &hStemHintArray,
+                     width,
+                     &haveWidth,
+                     font->isT1 ? decoder->builder.left_bearing->y
+                                : 0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        break;
+
+      case cf2_cmdVSTEMHM:
+      case cf2_cmdVSTEM:
+        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
+
+        if ( !font->isT1 )
+        {
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid vertical hint mask\n" ));
+            break;
+          }
+        }
+
+        /* add left-sidebearing correction in Type 1 mode */
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     font->isT1 ? decoder->builder.left_bearing->x
+                                : 0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        break;
+
+      case cf2_cmdVMOVETO:
+        FT_TRACE4(( " vmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
+
+        if ( !decoder->flex_state )
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINETO:
+        {
+          CF2_UInt  idx;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+
+          FT_TRACE4(( " rlineto\n" ));
+
+          for ( idx = 0; idx < count; idx += 2 )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHLINETO:
+      case cf2_cmdVLINETO:
+        {
+          CF2_UInt  idx;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+          FT_Bool  isX = FT_BOOL( op1 == cf2_cmdHLINETO );
+
+
+          FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
+
+          for ( idx = 0; idx < count; idx++ )
+          {
+            CF2_Fixed  v = cf2_stack_getReal( opStack, idx );
+
+
+            if ( isX )
+              curX = ADD_INT32( curX, v );
+            else
+              curY = ADD_INT32( curY, v );
+
+            isX = !isX;
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;
+
+      case cf2_cmdRCURVELINE:
+      case cf2_cmdRRCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  idx   = 0;
+
+
+          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
+                                               : " rrcurveto\n" ));
+
+          while ( idx + 6 <= count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 6;
+          }
+
+          if ( op1 == cf2_cmdRCURVELINE )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdCLOSEPATH:
+        if ( !font->isT1 )
+          FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        else
+        {
+          FT_TRACE4(( " closepath" ));
+
+          /* if there is no path, `closepath' is a no-op */
+          ps_builder_close_contour( &decoder->builder );
+
+          haveWidth = TRUE;
+        }
+        break;
+
+      case cf2_cmdCALLGSUBR:
+      case cf2_cmdCALLSUBR:
+        {
+          CF2_Int  subrNum;
+
+
+          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
+                                              : " callsubr" ));
+
+          if ( ( !font->isT1 && charstringIndex > CF2_MAX_SUBR )       ||
+               (  font->isT1 && charstringIndex > T1_MAX_SUBRS_CALLS ) )
+          {
+            /* max subr plus one for charstring */
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;                      /* overflow of stack */
+          }
+
+          /* push our current CFF charstring region on subrStack */
+          charstring = (CF2_Buffer)
+                         cf2_arrstack_getPointer(
+                           &subrStack,
+                           (size_t)charstringIndex + 1 );
+
+          /* set up the new CFF region and pointer */
+          subrNum = cf2_stack_popInt( opStack );
+
+          if ( font->isT1 && decoder->locals_hash )
+          {
+            size_t*  val = ft_hash_num_lookup( subrNum,
+                                               decoder->locals_hash );
+
+
+            if ( val )
+              subrNum = *val;
+            else
+              subrNum = -1;
+          }
+
+          switch ( op1 )
+          {
+          case cf2_cmdCALLGSUBR:
+            FT_TRACE4(( " (idx %d, entering level %d)\n",
+                        subrNum + decoder->globals_bias,
+                        charstringIndex + 1 ));
+
+            if ( cf2_initGlobalRegionBuffer( decoder,
+                                             subrNum,
+                                             charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+            break;
+
+          default:
+            /* cf2_cmdCALLSUBR */
+            FT_TRACE4(( " (idx %d, entering level %d)\n",
+                        subrNum + decoder->locals_bias,
+                        charstringIndex + 1 ));
+
+            if ( cf2_initLocalRegionBuffer( decoder,
+                                            subrNum,
+                                            charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+          }
+
+          charstringIndex += 1;       /* entry is valid now */
+        }
+        continue; /* do not clear the stack */
+
+      case cf2_cmdRETURN:
+        FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
+
+        if ( charstringIndex < 1 )
+        {
+          /* Note: cannot return from top charstring */
+          lastError = FT_THROW( Invalid_Glyph_Format );
+          goto exit;                      /* underflow of stack */
+        }
+
+        /* restore position in previous charstring */
+        charstring = (CF2_Buffer)
+                       cf2_arrstack_getPointer(
+                         &subrStack,
+                         (CF2_UInt)--charstringIndex );
+        continue;     /* do not clear the stack */
+
+      case cf2_cmdESC:
+        {
+          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );
+
+
+          /* first switch for 2-byte operators handles CFF2      */
+          /* and opcodes that are reserved for both CFF and CFF2 */
+          switch ( op2 )
+          {
+          case cf2_escHFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, FALSE /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, FALSE /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE /* dy1 */,
+                TRUE /* dx2 */, TRUE /* dy2 */,
+                TRUE /* dx3 */, TRUE /* dy3 */,
+                TRUE /* dx4 */, TRUE /* dy4 */,
+                TRUE /* dx5 */, TRUE /* dy5 */,
+                TRUE /* dx6 */, TRUE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            break;      /* TODO: why is this not a continue? */
+
+          case cf2_escHFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE  /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, TRUE  /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE  /* dx1 */, TRUE  /* dy1 */,
+                TRUE  /* dx2 */, TRUE  /* dy2 */,
+                TRUE  /* dx3 */, TRUE  /* dy3 */,
+                TRUE  /* dx4 */, TRUE  /* dy4 */,
+                TRUE  /* dx5 */, TRUE  /* dy5 */,
+                FALSE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          TRUE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          /* these opcodes are always reserved */
+          case cf2_escRESERVED_8:
+          case cf2_escRESERVED_13:
+          case cf2_escRESERVED_19:
+          case cf2_escRESERVED_25:
+          case cf2_escRESERVED_31:
+          case cf2_escRESERVED_32:
+            FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+            break;
+
+          default:
+            {
+              if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 )
+                FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+              else if ( font->isT1 && result_cnt > 0 && op2 != cf2_escPOP )
+              {
+                /* all operands have been transferred by previous pops */
+                result_cnt = 0;
+              }
+              else
+              {
+                /* second switch for 2-byte operators handles */
+                /* CFF and Type 1                             */
+                switch ( op2 )
+                {
+
+                case cf2_escDOTSECTION:
+                  /* something about `flip type of locking' -- ignore it */
+                  FT_TRACE4(( " dotsection\n" ));
+
+                  break;
+
+                case cf2_escVSTEM3:
+                case cf2_escHSTEM3:
+                  /*
+                   * Type 1:                          Type 2:
+                   *   x0 dx0 x1 dx1 x2 dx2 vstem3      x dx {dxa dxb}* vstem
+                   *   y0 dy0 y1 dy1 y2 dy2 hstem3      y dy {dya dyb}* hstem
+                   *   relative to lsb point            relative to zero
+                   *
+                   */
+                  {
+                    if ( !font->isT1 )
+                      FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                    else
+                    {
+                      CF2_F16Dot16  v0, v1, v2;
+
+                      FT_Bool  isV = FT_BOOL( op2 == cf2_escVSTEM3 );
+
+
+                      FT_TRACE4(( isV ? " vstem3\n"
+                                      : " hstem3\n" ));
+
+                      FT_ASSERT( cf2_stack_count( opStack ) == 6 );
+
+                      v0 = cf2_stack_getReal( opStack, 0 );
+                      v1 = cf2_stack_getReal( opStack, 2 );
+                      v2 = cf2_stack_getReal( opStack, 4 );
+
+                      cf2_stack_setReal(
+                        opStack, 2,
+                        SUB_INT32( SUB_INT32( v1, v0 ),
+                                   cf2_stack_getReal( opStack, 1 ) ) );
+                      cf2_stack_setReal(
+                        opStack, 4,
+                        SUB_INT32( SUB_INT32( v2, v1 ),
+                                   cf2_stack_getReal( opStack, 3 ) ) );
+
+                      /* add left-sidebearing correction */
+                      cf2_doStems( font,
+                                   opStack,
+                                   isV ? &vStemHintArray : &hStemHintArray,
+                                   width,
+                                   &haveWidth,
+                                   isV ? decoder->builder.left_bearing->x
+                                       : decoder->builder.left_bearing->y );
+
+                      if ( decoder->width_only )
+                        goto exit;
+                    }
+                  }
+                  break;
+
+                case cf2_escAND:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " and\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 && arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escOR:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " or\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 || arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escNOT:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " not\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, !arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSEAC:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_Error   error2;
+                    CF2_Int    bchar_index, achar_index;
+                    FT_Vector  left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+                    T1_Face  face = (T1_Face)decoder->builder.face;
+#endif
+                    CF2_BufferRec  component;
+                    CF2_Fixed      dummyWidth;
+
+                    CF2_Int  achar = cf2_stack_popInt( opStack );
+                    CF2_Int  bchar = cf2_stack_popInt( opStack );
+
+                    FT_Pos  ady = cf2_stack_popFixed ( opStack );
+                    FT_Pos  adx = cf2_stack_popFixed ( opStack );
+                    FT_Pos  asb = cf2_stack_popFixed ( opStack );
+
+
+                    FT_TRACE4(( " seac\n" ));
+
+                    if ( doingSeac )
+                    {
+                      FT_ERROR(( " nested seac\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;      /* nested seac */
+                    }
+
+                    if ( decoder->builder.metrics_only )
+                    {
+                      FT_ERROR(( " unexpected seac\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;      /* unexpected seac */
+                    }
+
+                    /* `glyph_names' is set to 0 for CID fonts which do */
+                    /* not include an encoding.  How can we deal with   */
+                    /* these?                                           */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+                    if ( decoder->glyph_names == 0                   &&
+                         !face->root.internal->incremental_interface )
+#else
+                      if ( decoder->glyph_names == 0 )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+                      {
+                        FT_ERROR((
+                          "cf2_interpT2CharString: (Type 1 seac)"
+                          " glyph names table not available in this font\n" ));
+                        lastError = FT_THROW( Invalid_Glyph_Format );
+                        goto exit;
+                      }
+
+                    /* seac weirdness */
+                    adx += decoder->builder.left_bearing->x;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+                    if ( face->root.internal->incremental_interface )
+                    {
+                      /* the caller must handle the font encoding also */
+                      bchar_index = bchar;
+                      achar_index = achar;
+                    }
+                    else
+#endif
+                    {
+                      bchar_index = t1_lookup_glyph_by_stdcharcode_ps(
+                                      decoder, bchar );
+                      achar_index = t1_lookup_glyph_by_stdcharcode_ps(
+                                      decoder, achar );
+                    }
+
+                    if ( bchar_index < 0 || achar_index < 0 )
+                    {
+                      FT_ERROR((
+                        "cf2_interpT2CharString: (Type 1 seac)"
+                        " invalid seac character code arguments\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+
+                    /* if we are trying to load a composite glyph, */
+                    /* do not load the accent character and return */
+                    /* the array of subglyphs.                     */
+                    if ( decoder->builder.no_recurse )
+                    {
+                      FT_GlyphSlot    glyph  = (FT_GlyphSlot)decoder->builder.glyph;
+                      FT_GlyphLoader  loader = glyph->internal->loader;
+                      FT_SubGlyph     subg;
+
+
+                      /* reallocate subglyph array if necessary */
+                      error2 = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+                      if ( error2 )
+                      {
+                        lastError = error2; /* pass FreeType error through */
+                        goto exit;
+                      }
+
+                      subg = loader->current.subglyphs;
+
+                      /* subglyph 0 = base character */
+                      subg->index = bchar_index;
+                      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+                      subg->arg1  = 0;
+                      subg->arg2  = 0;
+                      subg++;
+
+                      /* subglyph 1 = accent character */
+                      subg->index = achar_index;
+                      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+                      subg->arg1  = (FT_Int)FIXED_TO_INT( adx - asb );
+                      subg->arg2  = (FT_Int)FIXED_TO_INT( ady );
+
+                      /* set up remaining glyph fields */
+                      glyph->num_subglyphs = 2;
+                      glyph->subglyphs     = loader->base.subglyphs;
+                      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+                      loader->current.num_subglyphs = 2;
+
+                      goto exit;
+                    }
+
+                    /* First load `bchar' in builder */
+                    /* now load the unscaled outline */
+
+                    /* prepare loader */
+                    FT_GlyphLoader_Prepare( decoder->builder.loader );
+
+                    error2 = cf2_getT1SeacComponent( decoder,
+                                                     (FT_UInt)bchar_index,
+                                                     &component );
+                    if ( error2 )
+                    {
+                      lastError = error2; /* pass FreeType error through */
+                      goto exit;
+                    }
+                    cf2_interpT2CharString( font,
+                                            &component,
+                                            callbacks,
+                                            translation,
+                                            TRUE,
+                                            0,
+                                            0,
+                                            &dummyWidth );
+                    cf2_freeT1SeacComponent( decoder, &component );
+
+                    /* save the left bearing and width of the base       */
+                    /* character as they will be erased by the next load */
+
+                    left_bearing = *decoder->builder.left_bearing;
+                    advance      = *decoder->builder.advance;
+
+                    decoder->builder.left_bearing->x = 0;
+                    decoder->builder.left_bearing->y = 0;
+
+                    /* Now load `achar' on top of */
+                    /* the base outline           */
+
+                    error2 = cf2_getT1SeacComponent( decoder,
+                                                     (FT_UInt)achar_index,
+                                                     &component );
+                    if ( error2 )
+                    {
+                      lastError = error2; /* pass FreeType error through */
+                      goto exit;
+                    }
+                    cf2_interpT2CharString( font,
+                                            &component,
+                                            callbacks,
+                                            translation,
+                                            TRUE,
+                                            adx - asb,
+                                            ady,
+                                            &dummyWidth );
+                    cf2_freeT1SeacComponent( decoder, &component );
+
+                    /* restore the left side bearing and   */
+                    /* advance width of the base character */
+
+                    *decoder->builder.left_bearing = left_bearing;
+                    *decoder->builder.advance      = advance;
+
+                    goto exit;
+                  }
+                  break;
+
+                case cf2_escSBW:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    CF2_Fixed    lsb_x, lsb_y;
+                    PS_Builder*  builder;
+
+
+                    FT_TRACE4(( " sbw" ));
+
+                    builder = &decoder->builder;
+
+                    builder->advance->y = cf2_stack_popFixed( opStack );
+                    builder->advance->x = cf2_stack_popFixed( opStack );
+
+                    lsb_y = cf2_stack_popFixed( opStack );
+                    lsb_x = cf2_stack_popFixed( opStack );
+
+                    builder->left_bearing->x =
+                      ADD_INT32( builder->left_bearing->x, lsb_x );
+                    builder->left_bearing->y =
+                      ADD_INT32( builder->left_bearing->y, lsb_y );
+
+                    haveWidth = TRUE;
+
+                    /* the `metrics_only' indicates that we only want */
+                    /* to compute the glyph's metrics (lsb + advance  */
+                    /* width), not load the  rest of it; so exit      */
+                    /* immediately                                    */
+                    if ( builder->metrics_only )
+                      goto exit;
+
+                    if ( initial_map_ready )
+                    {
+                      curX = ADD_INT32( curX, lsb_x );
+                      curY = ADD_INT32( curY, lsb_y );
+                    }
+                  }
+                  break;
+
+                case cf2_escABS:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " abs\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    if ( arg < -CF2_FIXED_MAX )
+                      cf2_stack_pushFixed( opStack, CF2_FIXED_MAX );
+                    else
+                      cf2_stack_pushFixed( opStack, FT_ABS( arg ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escADD:
+                  {
+                    CF2_F16Dot16  summand1;
+                    CF2_F16Dot16  summand2;
+
+
+                    FT_TRACE4(( " add\n" ));
+
+                    summand2 = cf2_stack_popFixed( opStack );
+                    summand1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         ADD_INT32( summand1,
+                                                    summand2 ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSUB:
+                  {
+                    CF2_F16Dot16  minuend;
+                    CF2_F16Dot16  subtrahend;
+
+
+                    FT_TRACE4(( " sub\n" ));
+
+                    subtrahend = cf2_stack_popFixed( opStack );
+                    minuend    = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         SUB_INT32( minuend, subtrahend ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDIV:
+                  {
+                    CF2_F16Dot16  dividend;
+                    CF2_F16Dot16  divisor;
+
+
+                    FT_TRACE4(( " div\n" ));
+
+                    if ( font->isT1 && large_int )
+                    {
+                      divisor  = (CF2_F16Dot16)cf2_stack_popInt( opStack );
+                      dividend = (CF2_F16Dot16)cf2_stack_popInt( opStack );
+
+                      large_int = FALSE;
+                    }
+                    else
+                    {
+                      divisor  = cf2_stack_popFixed( opStack );
+                      dividend = cf2_stack_popFixed( opStack );
+                    }
+
+                    cf2_stack_pushFixed( opStack,
+                                         FT_DivFix( dividend, divisor ) );
+
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escNEG:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " neg\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    if ( arg < -CF2_FIXED_MAX )
+                      cf2_stack_pushFixed( opStack, CF2_FIXED_MAX );
+                    else
+                      cf2_stack_pushFixed( opStack, -arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escEQ:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " eq\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 == arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escCALLOTHERSUBR:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    CF2_Int   subr_no;
+                    CF2_Int   arg_cnt;
+                    CF2_UInt  count;
+                    CF2_UInt  opIdx = 0;
+
+
+                    FT_TRACE4(( " callothersubr\n" ));
+
+                    subr_no = cf2_stack_popInt( opStack );
+                    arg_cnt = cf2_stack_popInt( opStack );
+
+                    /*******************************************************/
+                    /*                                                     */
+                    /* remove all operands to callothersubr from the stack */
+                    /*                                                     */
+                    /* for handled othersubrs, where we know the number of */
+                    /* arguments, we increase the stack by the value of    */
+                    /* known_othersubr_result_cnt                          */
+                    /*                                                     */
+                    /* for unhandled othersubrs the following pops adjust  */
+                    /* the stack pointer as necessary                      */
+
+                    count = cf2_stack_count( opStack );
+                    FT_ASSERT( (CF2_UInt)arg_cnt <= count );
+
+                    opIdx += count - (CF2_UInt)arg_cnt;
+
+                    known_othersubr_result_cnt = 0;
+                    result_cnt                 = 0;
+
+                    /* XXX TODO: The checks to `arg_count == <whatever>'   */
+                    /* might not be correct; an othersubr expects a        */
+                    /* certain number of operands on the PostScript stack  */
+                    /* (as opposed to the T1 stack) but it doesn't have to */
+                    /* put them there by itself; previous othersubrs might */
+                    /* have left the operands there if they were not       */
+                    /* followed by an appropriate number of pops           */
+                    /*                                                     */
+                    /* On the other hand, Adobe Reader 7.0.8 for Linux     */
+                    /* doesn't accept a font that contains charstrings     */
+                    /* like                                                */
+                    /*                                                     */
+                    /*     100 200 2 20 callothersubr                      */
+                    /*     300 1 20 callothersubr pop                      */
+                    /*                                                     */
+                    /* Perhaps this is the reason why BuildCharArray       */
+                    /* exists.                                             */
+
+                    switch ( subr_no )
+                    {
+                    case 0:                     /* end flex feature */
+                      if ( arg_cnt != 3 )
+                        goto Unexpected_OtherSubr;
+
+                      if ( initial_map_ready &&
+                           ( !decoder->flex_state           ||
+                             decoder->num_flex_vectors != 7 ) )
+                      {
+                        FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                   " unexpected flex end\n" ));
+                        lastError = FT_THROW( Invalid_Glyph_Format );
+                        goto exit;
+                      }
+
+                      /* the two `results' are popped     */
+                      /* by the following setcurrentpoint */
+                      cf2_stack_pushFixed( opStack, curX );
+                      cf2_stack_pushFixed( opStack, curY );
+                      known_othersubr_result_cnt = 2;
+                      break;
+
+                    case 1:                     /* start flex feature */
+                      if ( arg_cnt != 0 )
+                        goto Unexpected_OtherSubr;
+
+                      if ( !initial_map_ready )
+                        break;
+
+                      if ( ps_builder_check_points( &decoder->builder, 6 ) )
+                        goto exit;
+
+                      decoder->flex_state        = 1;
+                      decoder->num_flex_vectors  = 0;
+                      break;
+
+                    case 2:                     /* add flex vectors */
+                      {
+                        FT_Int  idx;
+                        FT_Int  idx2;
+
+
+                        if ( arg_cnt != 0 )
+                          goto Unexpected_OtherSubr;
+
+                        if ( !initial_map_ready )
+                          break;
+
+                        if ( !decoder->flex_state )
+                        {
+                          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                     " missing flex start\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        /* note that we should not add a point for      */
+                        /* index 0; this will move our current position */
+                        /* to the flex point without adding any point   */
+                        /* to the outline                               */
+                        idx = decoder->num_flex_vectors++;
+                        if ( idx > 0 && idx < 7 )
+                        {
+                          /* in malformed fonts it is possible to have    */
+                          /* other opcodes in the middle of a flex (which */
+                          /* don't increase `num_flex_vectors'); we thus  */
+                          /* have to check whether we can add a point     */
+
+                          if ( ps_builder_check_points( &decoder->builder,
+                                                        1 ) )
+                          {
+                            lastError = FT_THROW( Invalid_Glyph_Format );
+                            goto exit;
+                          }
+
+                          /* map: 1->2 2->4 3->6 4->2 5->4 6->6 */
+                          idx2 = ( idx > 3 ? idx - 3 : idx ) * 2;
+
+                          flexStore[idx2 - 2] = curX;
+                          flexStore[idx2 - 1] = curY;
+
+                          if ( idx == 3 || idx == 6 )
+                            cf2_glyphpath_curveTo( &glyphPath,
+                                                   flexStore[0],
+                                                   flexStore[1],
+                                                   flexStore[2],
+                                                   flexStore[3],
+                                                   flexStore[4],
+                                                   flexStore[5] );
+                        }
+                      }
+                      break;
+
+                    case 3:                     /* change hints */
+                      if ( arg_cnt != 1 )
+                        goto Unexpected_OtherSubr;
+
+                      if ( initial_map_ready )
+                      {
+                        /* do not clear hints if initial hintmap */
+                        /* is not ready - we need to collate all */
+                        cf2_arrstack_clear( &vStemHintArray );
+                        cf2_arrstack_clear( &hStemHintArray );
+
+                        cf2_hintmask_init( &hintMask, error );
+                        hintMask.isValid = FALSE;
+                        hintMask.isNew   = TRUE;
+                      }
+
+                      known_othersubr_result_cnt = 1;
+                      break;
+
+                    case 12:
+                    case 13:
+                      /* counter control hints, clear stack */
+                      cf2_stack_clear( opStack );
+                      break;
+
+                    case 14:
+                    case 15:
+                    case 16:
+                    case 17:
+                    case 18:                    /* multiple masters */
+                      {
+                        PS_Blend  blend = decoder->blend;
+                        FT_UInt   num_points, nn, mm;
+                        CF2_UInt  delta;
+                        CF2_UInt  values;
+
+
+                        if ( !blend )
+                        {
+                          FT_ERROR((
+                            "cf2_interpT2CharString:"
+                            " unexpected multiple masters operator\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        num_points = (FT_UInt)subr_no - 13 +
+                                       ( subr_no == 18 );
+                        if ( arg_cnt != (FT_Int)( num_points *
+                                                  blend->num_designs ) )
+                        {
+                          FT_ERROR((
+                            "cf2_interpT2CharString:"
+                            " incorrect number of multiple masters arguments\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        /* We want to compute                                */
+                        /*                                                   */
+                        /*   a0*w0 + a1*w1 + ... + ak*wk                     */
+                        /*                                                   */
+                        /* but we only have a0, a1-a0, a2-a0, ..., ak-a0.    */
+                        /*                                                   */
+                        /* However, given that w0 + w1 + ... + wk == 1, we   */
+                        /* can rewrite it easily as                          */
+                        /*                                                   */
+                        /*   a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */
+                        /*                                                   */
+                        /* where k == num_designs-1.                         */
+                        /*                                                   */
+                        /* I guess that's why it's written in this `compact' */
+                        /* form.                                             */
+                        /*                                                   */
+                        delta  = opIdx + num_points;
+                        values = opIdx;
+                        for ( nn = 0; nn < num_points; nn++ )
+                        {
+                          CF2_Fixed  tmp = cf2_stack_getReal( opStack,
+                                                              values );
+
+
+                          for ( mm = 1; mm < blend->num_designs; mm++ )
+                            tmp = ADD_INT32( tmp,
+                                             FT_MulFix(
+                                               cf2_stack_getReal( opStack,
+                                                                  delta++ ),
+                                               blend->weight_vector[mm] ) );
+
+                          cf2_stack_setReal( opStack, values++, tmp );
+                        }
+                        cf2_stack_pop( opStack,
+                                       (CF2_UInt)arg_cnt - num_points );
+
+                        known_othersubr_result_cnt = (FT_Int)num_points;
+                        break;
+                      }
+
+                    case 19:
+                      /* <idx> 1 19 callothersubr                 */
+                      /* ==> replace elements starting from index */
+                      /*     cvi( <idx> ) of BuildCharArray with  */
+                      /*     WeightVector                         */
+                      {
+                        FT_Int    idx;
+                        PS_Blend  blend = decoder->blend;
+
+
+                        if ( arg_cnt != 1 || !blend )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                             ||
+                             (FT_UInt)idx + blend->num_designs >
+                               decoder->len_buildchar            )
+                          goto Unexpected_OtherSubr;
+
+                        ft_memcpy( &decoder->buildchar[idx],
+                                   blend->weight_vector,
+                                   blend->num_designs *
+                                   sizeof ( blend->weight_vector[0] ) );
+                      }
+                      break;
+
+                    case 20:
+                      /* <arg1> <arg2> 2 20 callothersubr pop   */
+                      /* ==> push <arg1> + <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  summand1;
+                        CF2_F16Dot16  summand2;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        summand2 = cf2_stack_popFixed( opStack );
+                        summand1 = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             ADD_INT32( summand1,
+                                                        summand2 ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 21:
+                      /* <arg1> <arg2> 2 21 callothersubr pop   */
+                      /* ==> push <arg1> - <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  minuend;
+                        CF2_F16Dot16  subtrahend;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        subtrahend = cf2_stack_popFixed( opStack );
+                        minuend    = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             SUB_INT32( minuend,
+                                                        subtrahend ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 22:
+                      /* <arg1> <arg2> 2 22 callothersubr pop   */
+                      /* ==> push <arg1> * <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  factor1;
+                        CF2_F16Dot16  factor2;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        factor2 = cf2_stack_popFixed( opStack );
+                        factor1 = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             FT_MulFix( factor1, factor2 ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 23:
+                      /* <arg1> <arg2> 2 23 callothersubr pop   */
+                      /* ==> push <arg1> / <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  dividend;
+                        CF2_F16Dot16  divisor;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        divisor  = cf2_stack_popFixed( opStack );
+                        dividend = cf2_stack_popFixed( opStack );
+
+                        if ( divisor == 0 )
+                          goto Unexpected_OtherSubr;
+
+                        cf2_stack_pushFixed( opStack,
+                                             FT_DivFix( dividend,
+                                                        divisor ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 24:
+                      /* <val> <idx> 2 24 callothersubr               */
+                      /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+                      {
+                        CF2_Int   idx;
+                        PS_Blend  blend = decoder->blend;
+
+
+                        if ( arg_cnt != 2 || !blend )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                                ||
+                             (FT_UInt)idx >= decoder->len_buildchar )
+                          goto Unexpected_OtherSubr;
+
+                        decoder->buildchar[idx] =
+                          cf2_stack_popFixed( opStack );
+                      }
+                      break;
+
+                    case 25:
+                      /* <idx> 1 25 callothersubr pop        */
+                      /* ==> push BuildCharArray[cvi( idx )] */
+                      /*     onto T1 stack                   */
+                      {
+                        CF2_Int   idx;
+                        PS_Blend  blend = decoder->blend;
+
+
+                        if ( arg_cnt != 1 || !blend )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                                ||
+                             (FT_UInt)idx >= decoder->len_buildchar )
+                          goto Unexpected_OtherSubr;
+
+                        cf2_stack_pushFixed( opStack,
+                                             decoder->buildchar[idx] );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+#if 0
+                    case 26:
+                      /* <val> mark <idx>                              */
+                      /* ==> set BuildCharArray[cvi( <idx> )] = <val>, */
+                      /*     leave mark on T1 stack                    */
+                      /* <val> <idx>                                   */
+                      /* ==> set BuildCharArray[cvi( <idx> )] = <val>  */
+                      XXX which routine has left its mark on the
+                      XXX (PostScript) stack?;
+                      break;
+#endif
+
+                    case 27:
+                      /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */
+                      /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */
+                      /*     otherwise push <res2>                          */
+                      {
+                        CF2_F16Dot16  arg1;
+                        CF2_F16Dot16  arg2;
+                        CF2_F16Dot16  cond1;
+                        CF2_F16Dot16  cond2;
+
+
+                        if ( arg_cnt != 4 )
+                          goto Unexpected_OtherSubr;
+
+                        cond2 = cf2_stack_popFixed( opStack );
+                        cond1 = cf2_stack_popFixed( opStack );
+                        arg2  = cf2_stack_popFixed( opStack );
+                        arg1  = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             cond1 <= cond2 ? arg1 : arg2 );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 28:
+                      /* 0 28 callothersubr pop                     */
+                      /* ==> push random value from interval [0, 1) */
+                      /*     onto stack                             */
+                      {
+                        CF2_F16Dot16  r;
+
+
+                        if ( arg_cnt != 0 )
+                          goto Unexpected_OtherSubr;
+
+                        /* only use the lower 16 bits of `random'  */
+                        /* to generate a number in the range (0;1] */
+                        r = (CF2_F16Dot16)
+                              ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+
+                        decoder->current_subfont->random =
+                          cff_random( decoder->current_subfont->random );
+
+                        cf2_stack_pushFixed( opStack, r );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    default:
+                      if ( arg_cnt >= 0 && subr_no >= 0 )
+                      {
+                        FT_Int  i;
+
+
+                        FT_ERROR((
+                          "cf2_interpT2CharString (Type 1 mode):"
+                          " unknown othersubr [%d %d], wish me luck\n",
+                          arg_cnt, subr_no ));
+
+                        /* store the unused args        */
+                        /* for this unhandled OtherSubr */
+
+                        if ( arg_cnt > PS_STORAGE_SIZE )
+                          arg_cnt = PS_STORAGE_SIZE;
+                        result_cnt = arg_cnt;
+
+                        for ( i = 1; i <= arg_cnt; i++ )
+                          results[result_cnt - i] =
+                            cf2_stack_popFixed( opStack );
+
+                        break;
+                      }
+                      /* fall through */
+
+                    Unexpected_OtherSubr:
+                      FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                 " invalid othersubr [%d %d]\n",
+                                 arg_cnt, subr_no ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escPOP:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_TRACE4(( " pop" ));
+
+                    if ( known_othersubr_result_cnt > 0 )
+                    {
+                      known_othersubr_result_cnt--;
+                      /* ignore, we pushed the operands ourselves */
+                      continue;
+                    }
+
+                    if ( result_cnt == 0 )
+                    {
+                      FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                 " no more operands for othersubr\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+
+                    result_cnt--;
+                    cf2_stack_pushFixed( opStack, results[result_cnt] );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDROP:
+                  FT_TRACE4(( " drop\n" ));
+
+                  (void)cf2_stack_popFixed( opStack );
+                  continue; /* do not clear the stack */
+
+                case cf2_escPUT:
+                  {
+                    CF2_F16Dot16  val;
+                    CF2_Int       idx;
+
+
+                    FT_TRACE4(( " put\n" ));
+
+                    idx = cf2_stack_popInt( opStack );
+                    val = cf2_stack_popFixed( opStack );
+
+                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
+                      storage[idx] = val;
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escGET:
+                  {
+                    CF2_Int  idx;
+
+
+                    FT_TRACE4(( " get\n" ));
+
+                    idx = cf2_stack_popInt( opStack );
+
+                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
+                      cf2_stack_pushFixed( opStack, storage[idx] );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escIFELSE:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+                    CF2_F16Dot16  cond1;
+                    CF2_F16Dot16  cond2;
+
+
+                    FT_TRACE4(( " ifelse\n" ));
+
+                    cond2 = cf2_stack_popFixed( opStack );
+                    cond1 = cf2_stack_popFixed( opStack );
+                    arg2  = cf2_stack_popFixed( opStack );
+                    arg1  = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         cond1 <= cond2 ? arg1 : arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escRANDOM: /* in spec */
+                  {
+                    CF2_F16Dot16  r;
+
+
+                    FT_TRACE4(( " random\n" ));
+
+                    /* only use the lower 16 bits of `random'  */
+                    /* to generate a number in the range (0;1] */
+                    r = (CF2_F16Dot16)
+                          ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+
+                    decoder->current_subfont->random =
+                      cff_random( decoder->current_subfont->random );
+
+                    cf2_stack_pushFixed( opStack, r );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escMUL:
+                  {
+                    CF2_F16Dot16  factor1;
+                    CF2_F16Dot16  factor2;
+
+
+                    FT_TRACE4(( " mul\n" ));
+
+                    factor2 = cf2_stack_popFixed( opStack );
+                    factor1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         FT_MulFix( factor1, factor2 ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSQRT:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " sqrt\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+                    if ( arg > 0 )
+                    {
+                      /* use a start value that doesn't make */
+                      /* the algorithm's addition overflow   */
+                      FT_Fixed  root = arg < 10 ? arg : arg >> 1;
+                      FT_Fixed  new_root;
+
+
+                      /* Babylonian method */
+                      for (;;)
+                      {
+                        new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1;
+                        if ( new_root == root )
+                          break;
+                        root = new_root;
+                      }
+                      arg = new_root;
+                    }
+                    else
+                      arg = 0;
+
+                    cf2_stack_pushFixed( opStack, arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDUP:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " dup\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack, arg );
+                    cf2_stack_pushFixed( opStack, arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escEXCH:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " exch\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack, arg2 );
+                    cf2_stack_pushFixed( opStack, arg1 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escINDEX:
+                  {
+                    CF2_Int   idx;
+                    CF2_UInt  size;
+
+
+                    FT_TRACE4(( " index\n" ));
+
+                    idx  = cf2_stack_popInt( opStack );
+                    size = cf2_stack_count( opStack );
+
+                    if ( size > 0 )
+                    {
+                      /* for `cf2_stack_getReal',   */
+                      /* index 0 is bottom of stack */
+                      CF2_UInt  gr_idx;
+
+
+                      if ( idx < 0 )
+                        gr_idx = size - 1;
+                      else if ( (CF2_UInt)idx >= size )
+                        gr_idx = 0;
+                      else
+                        gr_idx = size - 1 - (CF2_UInt)idx;
+
+                      cf2_stack_pushFixed( opStack,
+                                           cf2_stack_getReal( opStack,
+                                                              gr_idx ) );
+                    }
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escROLL:
+                  {
+                    CF2_Int  idx;
+                    CF2_Int  count;
+
+
+                    FT_TRACE4(( " roll\n" ));
+
+                    idx   = cf2_stack_popInt( opStack );
+                    count = cf2_stack_popInt( opStack );
+
+                    cf2_stack_roll( opStack, count, idx );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSETCURRENTPT:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_TRACE4(( " setcurrentpoint" ));
+
+                    if ( !initial_map_ready )
+                      break;
+
+                    /* From the T1 specification, section 6.4:            */
+                    /*                                                    */
+                    /*   The setcurrentpoint command is used only in      */
+                    /*   conjunction with results from OtherSubrs         */
+                    /*   procedures.                                      */
+
+                    /* known_othersubr_result_cnt != 0 is already handled */
+                    /* above.                                             */
+
+                    /* Note, however, that both Ghostscript and Adobe     */
+                    /* Distiller handle this situation by silently        */
+                    /* ignoring the inappropriate `setcurrentpoint'       */
+                    /* instruction.  So we do the same.                   */
+#if 0
+
+                    if ( decoder->flex_state != 1 )
+                    {
+                      FT_ERROR(( "cf2_interpT2CharString:"
+                                 " unexpected `setcurrentpoint'\n" ));
+                      goto Syntax_Error;
+                    }
+                    else
+                      ...
+#endif
+
+                    curY = cf2_stack_popFixed( opStack );
+                    curX = cf2_stack_popFixed( opStack );
+
+                    decoder->flex_state = 0;
+                  }
+                  break;
+
+                } /* end of 2nd switch checking op2 */
+              }
+            }
+          } /* end of 1st switch checking op2 */
+        } /* case cf2_cmdESC */
+
+        break;
+
+      case cf2_cmdHSBW:
+        if ( !font->isT1 )
+          FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        else
+        {
+          CF2_Fixed    lsb_x;
+          PS_Builder*  builder;
+
+
+          FT_TRACE4(( " hsbw" ));
+
+          builder = &decoder->builder;
+
+          builder->advance->x = cf2_stack_popFixed( opStack );
+          builder->advance->y = 0;
+
+          lsb_x = cf2_stack_popFixed( opStack );
+
+          builder->left_bearing->x = ADD_INT32( builder->left_bearing->x,
+                                                lsb_x );
+
+          haveWidth = TRUE;
+
+          /* the `metrics_only' indicates that we only want to compute */
+          /* the glyph's metrics (lsb + advance width), not load the   */
+          /* rest of it; so exit immediately                           */
+          if ( builder->metrics_only )
+            goto exit;
+
+          if ( initial_map_ready )
+            curX = ADD_INT32( curX, lsb_x );
+        }
+        break;
+
+      case cf2_cmdENDCHAR:
+        FT_TRACE4(( " endchar\n" ));
+
+        if ( font->isT1 && !initial_map_ready )
+        {
+          FT_TRACE5(( "cf2_interpT2CharString (Type 1 mode): "
+                      "Build initial hintmap, rewinding...\n" ));
+
+          /* trigger initial hintmap build */
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+          initial_map_ready = TRUE;
+
+          /* change hints routine - clear for rewind */
+          cf2_arrstack_clear( &vStemHintArray );
+          cf2_arrstack_clear( &hStemHintArray );
+
+          cf2_hintmask_init( &hintMask, error );
+          hintMask.isValid = FALSE;
+          hintMask.isNew   = TRUE;
+
+          /* rewind charstring */
+          /* some charstrings use endchar from a final subroutine call */
+          /* without returning, detect these and exit to the top level */
+          /* charstring                                                */
+          while ( charstringIndex > 0 )
+          {
+            FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
+
+            /* restore position in previous charstring */
+            charstring = (CF2_Buffer)
+                           cf2_arrstack_getPointer(
+                             &subrStack,
+                             (CF2_UInt)--charstringIndex );
+          }
+          charstring->ptr = charstring->start;
+
+          break;
+        }
+
+        if ( cf2_stack_count( opStack ) == 1 ||
+             cf2_stack_count( opStack ) == 5 )
+        {
+          if ( !haveWidth )
+            *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                                nominalWidthX );
+        }
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        /* close path if still open */
+        cf2_glyphpath_closeOpenPath( &glyphPath );
+
+        /* disable seac for CFF2 and Type1        */
+        /* (charstring ending with args on stack) */
+        if ( !font->isCFF2 && !font->isT1 && cf2_stack_count( opStack ) > 1 )
+        {
+          /* must be either 4 or 5 --                       */
+          /* this is a (deprecated) implied `seac' operator */
+
+          CF2_Int        achar;
+          CF2_Int        bchar;
+          CF2_BufferRec  component;
+          CF2_Fixed      dummyWidth;   /* ignore component width */
+          FT_Error       error2;
+
+
+          if ( doingSeac )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;      /* nested seac */
+          }
+
+          achar = cf2_stack_popInt( opStack );
+          bchar = cf2_stack_popInt( opStack );
+
+          curY = cf2_stack_popFixed( opStack );
+          curX = cf2_stack_popFixed( opStack );
+
+          error2 = cf2_getSeacComponent( decoder, achar, &component );
+          if ( error2 )
+          {
+            lastError = error2;      /* pass FreeType error through */
+            goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  curX,
+                                  curY,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+
+          error2 = cf2_getSeacComponent( decoder, bchar, &component );
+          if ( error2 )
+          {
+            lastError = error2;      /* pass FreeType error through */
+            goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  0,
+                                  0,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+        }
+        goto exit;
+
+      case cf2_cmdCNTRMASK:
+      case cf2_cmdHINTMASK:
+        /* the final \n in the tracing message gets added in      */
+        /* `cf2_hintmask_read' (which also traces the mask bytes) */
+        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
+
+        /* never add hints after the mask is computed */
+        if ( cf2_stack_count( opStack ) > 1    &&
+             cf2_hintmask_isValid( &hintMask ) )
+        {
+          FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
+          break;
+        }
+
+        /* if there are arguments on the stack, there this is an */
+        /* implied cf2_cmdVSTEMHM                                */
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        if ( op1 == cf2_cmdHINTMASK )
+        {
+          /* consume the hint mask bytes which follow the operator */
+          cf2_hintmask_read( &hintMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+        }
+        else
+        {
+          /*
+           * Consume the counter mask bytes which follow the operator:
+           * Build a temporary hint map, just to place and lock those
+           * stems participating in the counter mask.  These are most
+           * likely the dominant hstems, and are grouped together in a
+           * few counter groups, not necessarily in correspondence
+           * with the hint groups.  This reduces the chances of
+           * conflicts between hstems that are initially placed in
+           * separate hint groups and then brought together.  The
+           * positions are copied back to `hStemHintArray', so we can
+           * discard `counterMask' and `counterHintMap'.
+           *
+           */
+          CF2_HintMapRec   counterHintMap;
+          CF2_HintMaskRec  counterMask;
+
+
+          cf2_hintmap_init( &counterHintMap,
+                            font,
+                            &glyphPath.initialHintMap,
+                            &glyphPath.hintMoves,
+                            scaleY );
+          cf2_hintmask_init( &counterMask, error );
+
+          cf2_hintmask_read( &counterMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+          cf2_hintmap_build( &counterHintMap,
+                             &hStemHintArray,
+                             &vStemHintArray,
+                             &counterMask,
+                             0,
+                             FALSE );
+        }
+        break;
+
+      case cf2_cmdRMOVETO:
+        FT_TRACE4(( " rmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
+        curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
+
+        if ( !decoder->flex_state )
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdHMOVETO:
+        FT_TRACE4(( " hmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
+
+        if ( !decoder->flex_state )
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINECURVE:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  idx   = 0;
+
+
+          FT_TRACE4(( " rlinecurve\n" ));
+
+          while ( idx + 6 < count )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+            idx += 2;
+          }
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 6;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVVCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+
+          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
+          /* we enforce it by clearing the second bit           */
+          /* (and sorting the stack indexing to suit)           */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( " vvcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - idx ) & 1 )
+            {
+              x1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curX );
+
+              idx++;
+            }
+            else
+              x1 = curX;
+
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+            x3 = x2;
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHHCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+
+          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
+          /* we enforce it by clearing the second bit           */
+          /* (and sorting the stack indexing to suit)           */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( " hhcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - idx ) & 1 )
+            {
+              y1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curY );
+
+              idx++;
+            }
+            else
+              y1 = curY;
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 );
+            y3 = y2;
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVHCURVETO:
+      case cf2_cmdHVCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+          FT_Bool  alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO );
+
+
+          /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */
+          /* 8n+4, or 8n+5, we enforce it by clearing the     */
+          /* second bit                                       */
+          /* (and sorting the stack indexing to suit)         */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed x1, x2, x3, y1, y2, y3;
+
+
+            if ( alternate )
+            {
+              x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+              y1 = curY;
+              x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+              y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+              y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 );
+
+              if ( count - idx == 5 )
+              {
+                x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+
+                idx++;
+              }
+              else
+                x3 = x2;
+
+              alternate = FALSE;
+            }
+            else
+            {
+              x1 = curX;
+              y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY );
+              x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+              y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+              x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 );
+
+              if ( count - idx == 5 )
+              {
+                y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), y2 );
+
+                idx++;
+              }
+              else
+                y3 = y2;
+
+              alternate = TRUE;
+            }
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;     /* no need to clear stack again */
+
+      case cf2_cmdEXTENDEDNMBR:
+        {
+          CF2_Int  v;
+
+          CF2_Int  byte1 = cf2_buf_readByte( charstring );
+          CF2_Int  byte2 = cf2_buf_readByte( charstring );
+
+
+          v = (FT_Short)( ( byte1 << 8 ) |
+                            byte2        );
+
+          FT_TRACE4(( " %d", v ));
+
+          cf2_stack_pushInt( opStack, v );
+        }
+        continue;
+
+      default:
+        /* numbers */
+        {
+          if ( /* op1 >= 32 && */ op1 <= 246 )
+          {
+            CF2_Int  v;
+
+
+            v = op1 - 139;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -107 .. 107 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 247 && */ op1 <= 250 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 247;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v += 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* 108 .. 1131 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 251 && */ op1 <= 254 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 251;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v  = -v - 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -1131 .. -108 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else /* op1 == 255 */
+          {
+            CF2_Fixed  v;
+
+            FT_UInt32  byte1 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte2 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte3 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte4 = (FT_UInt32)cf2_buf_readByte( charstring );
+
+
+            v = (CF2_Fixed)( ( byte1 << 24 ) |
+                             ( byte2 << 16 ) |
+                             ( byte3 <<  8 ) |
+                               byte4         );
+
+            /*
+             * For Type 1:
+             *
+             * According to the specification, values > 32000 or < -32000
+             * must be followed by a `div' operator to make the result be
+             * in the range [-32000;32000].  We expect that the second
+             * argument of `div' is not a large number.  Additionally, we
+             * don't handle stuff like `<large1> <large2> <num> div <num>
+             * div' or <large1> <large2> <num> div div'.  This is probably
+             * not allowed anyway.
+             *
+             * <large> <num> <num>+ div is not checked but should not be
+             * allowed as the large value remains untouched.
+             *
+             */
+            if ( font->isT1 )
+            {
+              if ( v > 32000 || v < -32000 )
+              {
+                if ( large_int )
+                  FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                             " no `div' after large integer\n" ));
+                else
+                  large_int = TRUE;
+              }
+
+              FT_TRACE4(( " %d", v ));
+
+              cf2_stack_pushInt( opStack, (CF2_Int)v );
+            }
+            else
+            {
+              FT_TRACE4(( " %.5fF", v / 65536.0 ));
+
+              cf2_stack_pushFixed( opStack, v );
+            }
+          }
+        }
+        continue;   /* don't clear stack */
+
+      } /* end of switch statement checking `op1' */
+
+      cf2_stack_clear( opStack );
+
+    } /* end of main interpreter loop */
+
+    /* we get here if the charstring ends without cf2_cmdENDCHAR */
+    FT_TRACE4(( "cf2_interpT2CharString:"
+                "  charstring ends without ENDCHAR\n" ));
+
+  exit:
+    /* check whether last error seen is also the first one */
+    cf2_setError( error, lastError );
+
+    if ( *error )
+      FT_TRACE4(( "charstring error %d\n", *error ));
+
+    /* free resources from objects we've used */
+    cf2_glyphpath_finalize( &glyphPath );
+    cf2_arrstack_finalize( &vStemHintArray );
+    cf2_arrstack_finalize( &hStemHintArray );
+    cf2_arrstack_finalize( &subrStack );
+    cf2_stack_free( opStack );
+
+    FT_TRACE4(( "\n" ));
+
+    return;
+  }
+
+
+/* END */
diff --git a/src/cff/cf2intrp.h b/src/psaux/psintrp.h
similarity index 95%
rename from src/cff/cf2intrp.h
rename to src/psaux/psintrp.h
index b5d8947..4790aaa 100644
--- a/src/cff/cf2intrp.h
+++ b/src/psaux/psintrp.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.h                                                              */
+/*  psintrp.h                                                              */
 /*                                                                         */
 /*    Adobe's CFF Interpreter (specification).                             */
 /*                                                                         */
@@ -36,12 +36,12 @@
 /***************************************************************************/
 
 
-#ifndef __CF2INTRP_H__
-#define __CF2INTRP_H__
+#ifndef PSINTRP_H_
+#define PSINTRP_H_
 
 
-#include "cf2ft.h"
-#include "cf2hints.h"
+#include "psft.h"
+#include "pshints.h"
 
 
 FT_BEGIN_HEADER
@@ -77,7 +77,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2INTRP_H__ */
+#endif /* PSINTRP_H_ */
 
 
 /* END */
diff --git a/src/psaux/psobjs.c b/src/psaux/psobjs.c
index c7cbc67..f54bc7e 100644
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auxiliary functions for PostScript fonts (body).                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,11 +20,13 @@
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_CALC_H
+#include FT_DRIVER_H
 
 #include "psobjs.h"
 #include "psconv.h"
 
 #include "psauxerr.h"
+#include "psauxmod.h"
 
 
   /*************************************************************************/
@@ -344,7 +346,7 @@
       FT_Byte  c = *cur;
 
 
-      ++cur;
+      cur++;
 
       if ( c == '\\' )
       {
@@ -370,17 +372,17 @@
         case '\\':
         case '(':
         case ')':
-          ++cur;
+          cur++;
           break;
 
         default:
           /* skip octal escape or ignore backslash */
-          for ( i = 0; i < 3 && cur < limit; ++i )
+          for ( i = 0; i < 3 && cur < limit; i++ )
           {
             if ( !IS_OCTAL_DIGIT( *cur ) )
               break;
 
-            ++cur;
+            cur++;
           }
         }
       }
@@ -455,19 +457,19 @@
 
     FT_ASSERT( **acur == '{' );
 
-    for ( cur = *acur; cur < limit && error == FT_Err_Ok; ++cur )
+    for ( cur = *acur; cur < limit && error == FT_Err_Ok; cur++ )
     {
       switch ( *cur )
       {
       case '{':
-        ++embed;
+        embed++;
         break;
 
       case '}':
-        --embed;
+        embed--;
         if ( embed == 0 )
         {
-          ++cur;
+          cur++;
           goto end;
         }
         break;
@@ -594,6 +596,9 @@
       error = FT_THROW( Invalid_File_Format );
     }
 
+    if ( cur > limit )
+      cur = limit;
+
     parser->error  = error;
     parser->cursor = cur;
   }
@@ -692,7 +697,7 @@
       /* ************ otherwise, it is any token **************/
     default:
       token->start = cur;
-      token->type  = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
+      token->type  = ( *cur == '/' ) ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY;
       ps_parser_skip_PS_token( parser );
       cur = parser->cursor;
       if ( !parser->error )
@@ -747,7 +752,7 @@
         if ( !token.type )
           break;
 
-        if ( tokens != NULL && cur < limit )
+        if ( tokens && cur < limit )
           *cur = token;
 
         cur++;
@@ -812,12 +817,12 @@
 
       old_cur = cur;
 
-      if ( coords != NULL && count >= max_coords )
+      if ( coords && count >= max_coords )
         break;
 
       /* call PS_Conv_ToFixed() even if coords == NULL */
       /* to properly parse number at `cur'             */
-      *( coords != NULL ? &coords[count] : &dummy ) =
+      *( coords ? &coords[count] : &dummy ) =
         (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
 
       if ( old_cur == cur )
@@ -892,12 +897,12 @@
 
       old_cur = cur;
 
-      if ( values != NULL && count >= max_values )
+      if ( values && count >= max_values )
         break;
 
       /* call PS_Conv_ToFixed() even if coords == NULL */
       /* to properly parse number at `cur'             */
-      *( values != NULL ? &values[count] : &dummy ) =
+      *( values ? &values[count] : &dummy ) =
         PS_Conv_ToFixed( &cur, limit, power_ten );
 
       if ( old_cur == cur )
@@ -1084,9 +1089,9 @@
 
     for ( ; count > 0; count--, idx++ )
     {
-      FT_Byte*    q = (FT_Byte*)objects[idx] + field->offset;
+      FT_Byte*    q      = (FT_Byte*)objects[idx] + field->offset;
       FT_Long     val;
-      FT_String*  string;
+      FT_String*  string = NULL;
 
 
       skip_spaces( &cur, limit );
@@ -1169,7 +1174,7 @@
 
           /* for this to work (FT_String**)q must have been */
           /* initialized to NULL                            */
-          if ( *(FT_String**)q != NULL )
+          if ( *(FT_String**)q )
           {
             FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
                         field->ident ));
@@ -1214,7 +1219,7 @@
       case T1_FIELD_TYPE_MM_BBOX:
         {
           FT_Memory  memory = parser->memory;
-          FT_Fixed*  temp;
+          FT_Fixed*  temp   = NULL;
           FT_Int     result;
           FT_UInt    i;
 
@@ -1229,15 +1234,17 @@
             if ( result < 0 || (FT_UInt)result < max_objects )
             {
               FT_ERROR(( "ps_parser_load_field:"
-                         " expected %d integers in the %s subarray\n"
+                         " expected %d integer%s in the %s subarray\n"
                          "                     "
                          " of /FontBBox in the /Blend dictionary\n",
-                         max_objects,
+                         max_objects, max_objects > 1 ? "s" : "",
                          i == 0 ? "first"
                                 : ( i == 1 ? "second"
                                            : ( i == 2 ? "third"
                                                       : "fourth" ) ) ));
               error = FT_THROW( Invalid_File_Format );
+
+              FT_FREE( temp );
               goto Exit;
             }
 
@@ -1546,7 +1553,7 @@
       builder->current = &loader->current.outline;
       FT_GlyphLoader_Rewind( loader );
 
-      builder->hints_globals = size->internal;
+      builder->hints_globals = size->internal->module_data;
       builder->hints_funcs   = NULL;
 
       if ( hinting )
@@ -1713,6 +1720,581 @@
     first = outline->n_contours <= 1
             ? 0 : outline->contours[outline->n_contours - 2] + 1;
 
+    /* in malformed fonts it can happen that a contour was started */
+    /* but no points were added                                    */
+    if ( outline->n_contours && first == outline->n_points )
+    {
+      outline->n_contours--;
+      return;
+    }
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first */
+      /* point and it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e.,  */
+      /* check whether the first and the last point is the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           CFF BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting is active.                              */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_builder_init( CFF_Builder*   builder,
+                    TT_Face        face,
+                    CFF_Size       size,
+                    CFF_GlyphSlot  glyph,
+                    FT_Bool        hinting )
+  {
+    builder->path_begun  = 0;
+    builder->load_points = 1;
+
+    builder->face   = face;
+    builder->glyph  = glyph;
+    builder->memory = face->root.memory;
+
+    if ( glyph )
+    {
+      FT_GlyphLoader  loader = glyph->root.internal->loader;
+
+
+      builder->loader  = loader;
+      builder->base    = &loader->base.outline;
+      builder->current = &loader->current.outline;
+      FT_GlyphLoader_Rewind( loader );
+
+      builder->hints_globals = NULL;
+      builder->hints_funcs   = NULL;
+
+      if ( hinting && size )
+      {
+        FT_Size       ftsize   = FT_SIZE( size );
+        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
+
+        if ( internal )
+        {
+          builder->hints_globals = (void *)internal->topfont;
+          builder->hints_funcs   = glyph->root.internal->glyph_hints;
+        }
+      }
+    }
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+    builder->advance.x      = 0;
+    builder->advance.y      = 0;
+
+    builder->funcs = cff_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_builder_done( CFF_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  cff_check_points( CFF_Builder*  builder,
+                    FT_Int        count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  FT_LOCAL_DEF( void )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+
+
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = x >> 16;
+        point->y = y >> 16;
+      }
+      else
+#endif
+      {
+        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+        point->x = x >> 10;
+        point->y = y >> 10;
+      }
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y )
+  {
+    FT_Error  error;
+
+
+    error = cff_check_points( builder, 1 );
+    if ( !error )
+      cff_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  cff_builder_add_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return FT_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  FT_LOCAL_DEF( FT_Error )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* test whether we are building a new contour */
+    if ( !builder->path_begun )
+    {
+      builder->path_begun = 1;
+      error = cff_builder_add_contour( builder );
+      if ( !error )
+        error = cff_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  cff_builder_close_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first    */
+      /* point and if it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e., */
+      /* check whether begin point and last point are the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_builder_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting should be applied.                      */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_builder_init( PS_Builder*  ps_builder,
+                   void*        builder,
+                   FT_Bool      is_t1 )
+  {
+    FT_ZERO( ps_builder );
+
+    if ( is_t1 )
+    {
+      T1_Builder  t1builder = (T1_Builder)builder;
+
+
+      ps_builder->memory  = t1builder->memory;
+      ps_builder->face    = (FT_Face)t1builder->face;
+      ps_builder->glyph   = (CFF_GlyphSlot)t1builder->glyph;
+      ps_builder->loader  = t1builder->loader;
+      ps_builder->base    = t1builder->base;
+      ps_builder->current = t1builder->current;
+
+      ps_builder->pos_x = &t1builder->pos_x;
+      ps_builder->pos_y = &t1builder->pos_y;
+
+      ps_builder->left_bearing = &t1builder->left_bearing;
+      ps_builder->advance      = &t1builder->advance;
+
+      ps_builder->bbox        = &t1builder->bbox;
+      ps_builder->path_begun  = 0;
+      ps_builder->load_points = t1builder->load_points;
+      ps_builder->no_recurse  = t1builder->no_recurse;
+
+      ps_builder->metrics_only = t1builder->metrics_only;
+    }
+    else
+    {
+      CFF_Builder*  cffbuilder = (CFF_Builder*)builder;
+
+
+      ps_builder->memory  = cffbuilder->memory;
+      ps_builder->face    = (FT_Face)cffbuilder->face;
+      ps_builder->glyph   = cffbuilder->glyph;
+      ps_builder->loader  = cffbuilder->loader;
+      ps_builder->base    = cffbuilder->base;
+      ps_builder->current = cffbuilder->current;
+
+      ps_builder->pos_x = &cffbuilder->pos_x;
+      ps_builder->pos_y = &cffbuilder->pos_y;
+
+      ps_builder->left_bearing = &cffbuilder->left_bearing;
+      ps_builder->advance      = &cffbuilder->advance;
+
+      ps_builder->bbox        = &cffbuilder->bbox;
+      ps_builder->path_begun  = cffbuilder->path_begun;
+      ps_builder->load_points = cffbuilder->load_points;
+      ps_builder->no_recurse  = cffbuilder->no_recurse;
+
+      ps_builder->metrics_only = cffbuilder->metrics_only;
+    }
+
+    ps_builder->is_t1 = is_t1;
+    ps_builder->funcs = ps_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_builder_done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_builder_done( PS_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_check_points( PS_Builder*  builder,
+                           FT_Int       count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  FT_LOCAL_DEF( void )
+  ps_builder_add_point( PS_Builder*  builder,
+                        FT_Pos       x,
+                        FT_Pos       y,
+                        FT_Byte      flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+
+
+      if ( !builder->is_t1 &&
+           driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = x >> 16;
+        point->y = y >> 16;
+      }
+      else
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+#endif
+      if ( builder->is_t1 &&
+           driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = FIXED_TO_INT( x );
+        point->y = FIXED_TO_INT( y );
+      }
+      else
+#endif
+      {
+        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+        point->x = x >> 10;
+        point->y = y >> 10;
+      }
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_add_point1( PS_Builder*  builder,
+                         FT_Pos       x,
+                         FT_Pos       y )
+  {
+    FT_Error  error;
+
+
+    error = ps_builder_check_points( builder, 1 );
+    if ( !error )
+      ps_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_add_contour( PS_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    /* this might happen in invalid fonts */
+    if ( !outline )
+    {
+      FT_ERROR(( "ps_builder_add_contour: no outline to add points to\n" ));
+      return FT_THROW( Invalid_File_Format );
+    }
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return FT_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_start_point( PS_Builder*  builder,
+                          FT_Pos       x,
+                          FT_Pos       y )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* test whether we are building a new contour */
+    if ( !builder->path_begun )
+    {
+      builder->path_begun = 1;
+      error = ps_builder_add_contour( builder );
+      if ( !error )
+        error = ps_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  ps_builder_close_contour( PS_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* in malformed fonts it can happen that a contour was started */
+    /* but no points were added                                    */
+    if ( outline->n_contours && first == outline->n_points )
+    {
+      outline->n_contours--;
+      return;
+    }
+
     /* We must not include the last point in the path if it */
     /* is located on the first point.                       */
     if ( outline->n_points > 1 )
@@ -1753,6 +2335,176 @@
   /*************************************************************************/
   /*************************************************************************/
 
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_decoder_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a wrapper decoder for use in the combined                  */
+  /*    Type 1 / CFF interpreter.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    ps_decoder :: A pointer to the decoder to initialize.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder    :: A pointer to the original decoder.                   */
+  /*                                                                       */
+  /*    is_t1      :: Flag indicating Type 1 or CFF                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_decoder_init( PS_Decoder*  ps_decoder,
+                   void*        decoder,
+                   FT_Bool      is_t1 )
+  {
+    FT_ZERO( ps_decoder );
+
+    if ( is_t1 )
+    {
+      T1_Decoder  t1_decoder = (T1_Decoder)decoder;
+
+
+      ps_builder_init( &ps_decoder->builder,
+                       &t1_decoder->builder,
+                       is_t1 );
+
+      ps_decoder->cf2_instance = &t1_decoder->cf2_instance;
+      ps_decoder->psnames      = t1_decoder->psnames;
+
+      ps_decoder->num_glyphs  = t1_decoder->num_glyphs;
+      ps_decoder->glyph_names = t1_decoder->glyph_names;
+      ps_decoder->hint_mode   = t1_decoder->hint_mode;
+      ps_decoder->blend       = t1_decoder->blend;
+
+      ps_decoder->num_locals  = (FT_UInt)t1_decoder->num_subrs;
+      ps_decoder->locals      = t1_decoder->subrs;
+      ps_decoder->locals_len  = t1_decoder->subrs_len;
+      ps_decoder->locals_hash = t1_decoder->subrs_hash;
+
+      ps_decoder->buildchar     = t1_decoder->buildchar;
+      ps_decoder->len_buildchar = t1_decoder->len_buildchar;
+
+      ps_decoder->lenIV = t1_decoder->lenIV;
+    }
+    else
+    {
+      CFF_Decoder*  cff_decoder = (CFF_Decoder*)decoder;
+
+
+      ps_builder_init( &ps_decoder->builder,
+                       &cff_decoder->builder,
+                       is_t1 );
+
+      ps_decoder->cff             = cff_decoder->cff;
+      ps_decoder->cf2_instance    = &cff_decoder->cff->cf2_instance;
+      ps_decoder->current_subfont = cff_decoder->current_subfont;
+
+      ps_decoder->num_globals  = cff_decoder->num_globals;
+      ps_decoder->globals      = cff_decoder->globals;
+      ps_decoder->globals_bias = cff_decoder->globals_bias;
+      ps_decoder->num_locals   = cff_decoder->num_locals;
+      ps_decoder->locals       = cff_decoder->locals;
+      ps_decoder->locals_bias  = cff_decoder->locals_bias;
+
+      ps_decoder->glyph_width   = &cff_decoder->glyph_width;
+      ps_decoder->width_only    = cff_decoder->width_only;
+
+      ps_decoder->hint_mode = cff_decoder->hint_mode;
+
+      ps_decoder->get_glyph_callback  = cff_decoder->get_glyph_callback;
+      ps_decoder->free_glyph_callback = cff_decoder->free_glyph_callback;
+    }
+  }
+
+
+  /* Synthesize a SubFont object for Type 1 fonts, for use in the  */
+  /* new interpreter to access Private dict data.                  */
+  FT_LOCAL_DEF( void )
+  t1_make_subfont( FT_Face      face,
+                   PS_Private   priv,
+                   CFF_SubFont  subfont )
+  {
+    CFF_Private  cpriv = &subfont->private_dict;
+    FT_UInt      n, count;
+
+
+    FT_ZERO( subfont );
+    FT_ZERO( cpriv );
+
+    count = cpriv->num_blue_values = priv->num_blue_values;
+    for ( n = 0; n < count; n++ )
+      cpriv->blue_values[n] = (FT_Pos)priv->blue_values[n];
+
+    count = cpriv->num_other_blues = priv->num_other_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->other_blues[n] = (FT_Pos)priv->other_blues[n];
+
+    count = cpriv->num_family_blues = priv->num_family_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->family_blues[n] = (FT_Pos)priv->family_blues[n];
+
+    count = cpriv->num_family_other_blues = priv->num_family_other_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->family_other_blues[n] = (FT_Pos)priv->family_other_blues[n];
+
+    cpriv->blue_scale = priv->blue_scale;
+    cpriv->blue_shift = (FT_Pos)priv->blue_shift;
+    cpriv->blue_fuzz  = (FT_Pos)priv->blue_fuzz;
+
+    cpriv->standard_width  = (FT_Pos)priv->standard_width[0];
+    cpriv->standard_height = (FT_Pos)priv->standard_height[0];
+
+    count = cpriv->num_snap_widths = priv->num_snap_widths;
+    for ( n = 0; n < count; n++ )
+      cpriv->snap_widths[n] = (FT_Pos)priv->snap_widths[n];
+
+    count = cpriv->num_snap_heights = priv->num_snap_heights;
+    for ( n = 0; n < count; n++ )
+      cpriv->snap_heights[n] = (FT_Pos)priv->snap_heights[n];
+
+    cpriv->force_bold       = priv->force_bold;
+    cpriv->lenIV            = priv->lenIV;
+    cpriv->language_group   = priv->language_group;
+    cpriv->expansion_factor = priv->expansion_factor;
+
+    cpriv->subfont = subfont;
+
+
+    /* Initialize the random number generator. */
+    if ( face->internal->random_seed != -1 )
+    {
+      /* If we have a face-specific seed, use it.    */
+      /* If non-zero, update it to a positive value. */
+      subfont->random = (FT_UInt32)face->internal->random_seed;
+      if ( face->internal->random_seed )
+      {
+        do
+        {
+          face->internal->random_seed = (FT_Int32)cff_random(
+            (FT_UInt32)face->internal->random_seed );
+
+        } while ( face->internal->random_seed < 0 );
+      }
+    }
+    if ( !subfont->random )
+    {
+      FT_UInt32  seed;
+
+
+      /* compute random seed from some memory addresses */
+      seed = (FT_UInt32)( (FT_Offset)(char*)&seed    ^
+                          (FT_Offset)(char*)&face    ^
+                          (FT_Offset)(char*)&subfont );
+      seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+      if ( seed == 0 )
+        seed = 0x7384;
+
+      subfont->random = seed;
+    }
+  }
+
+
   FT_LOCAL_DEF( void )
   t1_decrypt( FT_Byte*   buffer,
               FT_Offset  length,
@@ -1766,4 +2518,16 @@
   }
 
 
+  FT_LOCAL_DEF( FT_UInt32 )
+  cff_random( FT_UInt32  r )
+  {
+    /* a 32bit version of the `xorshift' algorithm */
+    r ^= r << 13;
+    r ^= r >> 17;
+    r ^= r << 5;
+
+    return r;
+  }
+
+
 /* END */
diff --git a/src/psaux/psobjs.h b/src/psaux/psobjs.h
index bf879c1..8e0fe5f 100644
--- a/src/psaux/psobjs.h
+++ b/src/psaux/psobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auxiliary functions for PostScript fonts (specification).            */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,12 +16,13 @@
 /***************************************************************************/
 
 
-#ifndef __PSOBJS_H__
-#define __PSOBJS_H__
+#ifndef PSOBJS_H_
+#define PSOBJS_H_
 
 
 #include <ft2build.h>
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 
 FT_BEGIN_HEADER
@@ -193,20 +194,120 @@
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                           CFF BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  cff_builder_init( CFF_Builder*   builder,
+                    TT_Face        face,
+                    CFF_Size       size,
+                    CFF_GlyphSlot  glyph,
+                    FT_Bool        hinting );
+
+  FT_LOCAL( void )
+  cff_builder_done( CFF_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  cff_check_points( CFF_Builder*  builder,
+                    FT_Int        count );
+
+  FT_LOCAL( void )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag );
+  FT_LOCAL( FT_Error )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y );
+  FT_LOCAL( FT_Error )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y );
+  FT_LOCAL( void )
+  cff_builder_close_contour( CFF_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  cff_builder_add_contour( CFF_Builder*  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  ps_builder_init( PS_Builder*  ps_builder,
+                   void*        builder,
+                   FT_Bool      is_t1 );
+
+
+  FT_LOCAL( void )
+  ps_builder_done( PS_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_check_points( PS_Builder*  builder,
+                           FT_Int       count );
+
+  FT_LOCAL( void )
+  ps_builder_add_point( PS_Builder*  builder,
+                        FT_Pos       x,
+                        FT_Pos       y,
+                        FT_Byte      flag );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_add_point1( PS_Builder*  builder,
+                         FT_Pos       x,
+                         FT_Pos       y );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_add_contour( PS_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_start_point( PS_Builder*  builder,
+                          FT_Pos       x,
+                          FT_Pos       y );
+
+  FT_LOCAL( void )
+  ps_builder_close_contour( PS_Builder*  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                            OTHER                              *****/
   /*****                                                               *****/
   /*************************************************************************/
   /*************************************************************************/
 
   FT_LOCAL( void )
+  ps_decoder_init( PS_Decoder*  ps_decoder,
+                   void*        decoder,
+                   FT_Bool      is_t1 );
+
+  FT_LOCAL( void )
+  t1_make_subfont( FT_Face      face,
+                   PS_Private   priv,
+                   CFF_SubFont  subfont );
+
+  FT_LOCAL( void )
   t1_decrypt( FT_Byte*   buffer,
               FT_Offset  length,
               FT_UShort  seed );
 
 
+  FT_LOCAL( FT_UInt32 )
+  cff_random( FT_UInt32  r );
+
+
 FT_END_HEADER
 
-#endif /* __PSOBJS_H__ */
+#endif /* PSOBJS_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2read.c b/src/psaux/psread.c
similarity index 96%
rename from src/cff/cf2read.c
rename to src/psaux/psread.c
index 2b429e3..719863c 100644
--- a/src/cff/cf2read.c
+++ b/src/psaux/psread.c
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2read.c                                                              */
+/*  psread.c                                                               */
 /*                                                                         */
 /*    Adobe's code for stream handling (body).                             */
 /*                                                                         */
@@ -36,12 +36,12 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
+#include "psglue.h"
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
   /* Define CF2_IO_FAIL as 1 to enable random errors and random */
diff --git a/src/cff/cf2read.h b/src/psaux/psread.h
similarity index 95%
rename from src/cff/cf2read.h
rename to src/psaux/psread.h
index 7ef7c8c..464b29b 100644
--- a/src/cff/cf2read.h
+++ b/src/psaux/psread.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2read.h                                                              */
+/*  psread.h                                                               */
 /*                                                                         */
 /*    Adobe's code for stream handling (specification).                    */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef __CF2READ_H__
-#define __CF2READ_H__
+#ifndef PSREAD_H_
+#define PSREAD_H_
 
 
 FT_BEGIN_HEADER
@@ -62,7 +62,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2READ_H__ */
+#endif /* PSREAD_H_ */
 
 
 /* END */
diff --git a/src/psaux/psstack.c b/src/psaux/psstack.c
new file mode 100644
index 0000000..69d0633
--- /dev/null
+++ b/src/psaux/psstack.c
@@ -0,0 +1,328 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psstack.c                                                              */
+/*                                                                         */
+/*    Adobe's code for emulating a CFF stack (body).                       */
+/*                                                                         */
+/*  Copyright 2007-2013 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "psft.h"
+#include FT_INTERNAL_DEBUG_H
+
+#include "psglue.h"
+#include "psfont.h"
+#include "psstack.h"
+
+#include "pserror.h"
+
+
+  /* Allocate and initialize an instance of CF2_Stack.       */
+  /* Note: This function returns NULL on error (does not set */
+  /* `error').                                               */
+  FT_LOCAL_DEF( CF2_Stack )
+  cf2_stack_init( FT_Memory  memory,
+                  FT_Error*  e,
+                  FT_UInt    stackSize )
+  {
+    FT_Error  error = FT_Err_Ok;     /* for FT_NEW */
+
+    CF2_Stack  stack = NULL;
+
+
+    if ( !FT_NEW( stack ) )
+    {
+      /* initialize the structure; FT_NEW zeroes it */
+      stack->memory = memory;
+      stack->error  = e;
+    }
+
+    /* allocate the stack buffer */
+    if ( FT_NEW_ARRAY( stack->buffer, stackSize ) )
+    {
+      FT_FREE( stack );
+      return NULL;
+    }
+
+    stack->stackSize = stackSize;
+    stack->top       = stack->buffer;     /* empty stack */
+
+    return stack;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_free( CF2_Stack  stack )
+  {
+    if ( stack )
+    {
+      FT_Memory  memory = stack->memory;
+
+      /* free the buffer */
+      FT_FREE( stack->buffer );
+
+      /* free the main structure */
+      FT_FREE( stack );
+    }
+  }
+
+
+  FT_LOCAL_DEF( CF2_UInt )
+  cf2_stack_count( CF2_Stack  stack )
+  {
+    return (CF2_UInt)( stack->top - stack->buffer );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_pushInt( CF2_Stack  stack,
+                     CF2_Int    val )
+  {
+    if ( stack->top == stack->buffer + stack->stackSize )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;     /* stack overflow */
+    }
+
+    stack->top->u.i  = val;
+    stack->top->type = CF2_NumberInt;
+    stack->top++;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_pushFixed( CF2_Stack  stack,
+                       CF2_Fixed  val )
+  {
+    if ( stack->top == stack->buffer + stack->stackSize )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;     /* stack overflow */
+    }
+
+    stack->top->u.r  = val;
+    stack->top->type = CF2_NumberFixed;
+    stack->top++;
+  }
+
+
+  /* this function is only allowed to pop an integer type */
+  FT_LOCAL_DEF( CF2_Int )
+  cf2_stack_popInt( CF2_Stack  stack )
+  {
+    if ( stack->top == stack->buffer )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Underflow );
+      return 0;   /* underflow */
+    }
+    if ( stack->top[-1].type != CF2_NumberInt )
+    {
+      CF2_SET_ERROR( stack->error, Syntax_Error );
+      return 0;   /* type mismatch */
+    }
+
+    stack->top--;
+
+    return stack->top->u.i;
+  }
+
+
+  /* Note: type mismatch is silently cast */
+  /* TODO: check this                     */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_stack_popFixed( CF2_Stack  stack )
+  {
+    if ( stack->top == stack->buffer )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Underflow );
+      return cf2_intToFixed( 0 );    /* underflow */
+    }
+
+    stack->top--;
+
+    switch ( stack->top->type )
+    {
+    case CF2_NumberInt:
+      return cf2_intToFixed( stack->top->u.i );
+    case CF2_NumberFrac:
+      return cf2_fracToFixed( stack->top->u.f );
+    default:
+      return stack->top->u.r;
+    }
+  }
+
+
+  /* Note: type mismatch is silently cast */
+  /* TODO: check this                     */
+  FT_LOCAL_DEF( CF2_Fixed )
+  cf2_stack_getReal( CF2_Stack  stack,
+                     CF2_UInt   idx )
+  {
+    FT_ASSERT( cf2_stack_count( stack ) <= stack->stackSize );
+
+    if ( idx >= cf2_stack_count( stack ) )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return cf2_intToFixed( 0 );    /* bounds error */
+    }
+
+    switch ( stack->buffer[idx].type )
+    {
+    case CF2_NumberInt:
+      return cf2_intToFixed( stack->buffer[idx].u.i );
+    case CF2_NumberFrac:
+      return cf2_fracToFixed( stack->buffer[idx].u.f );
+    default:
+      return stack->buffer[idx].u.r;
+    }
+  }
+
+
+  /* provide random access to stack */
+  FT_LOCAL_DEF( void )
+  cf2_stack_setReal( CF2_Stack  stack,
+                     CF2_UInt   idx,
+                     CF2_Fixed  val )
+  {
+    if ( idx > cf2_stack_count( stack ) )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;
+    }
+
+    stack->buffer[idx].u.r  = val;
+    stack->buffer[idx].type = CF2_NumberFixed;
+  }
+
+
+  /* discard (pop) num values from stack */
+  FT_LOCAL_DEF( void )
+  cf2_stack_pop( CF2_Stack  stack,
+                 CF2_UInt   num )
+  {
+    if ( num > cf2_stack_count( stack ) )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Underflow );
+      return;
+    }
+    stack->top -= num;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_roll( CF2_Stack  stack,
+                  CF2_Int    count,
+                  CF2_Int    shift )
+  {
+    /* we initialize this variable to avoid compiler warnings */
+    CF2_StackNumber  last = { { 0 }, CF2_NumberInt };
+
+    CF2_Int  start_idx, idx, i;
+
+
+    if ( count < 2 )
+      return; /* nothing to do (values 0 and 1), or undefined value */
+
+    if ( (CF2_UInt)count > cf2_stack_count( stack ) )
+    {
+      CF2_SET_ERROR( stack->error, Stack_Overflow );
+      return;
+    }
+
+    if ( shift < 0 )
+      shift = -( ( -shift ) % count );
+    else
+      shift %= count;
+
+    if ( shift == 0 )
+      return; /* nothing to do */
+
+    /* We use the following algorithm to do the rolling, */
+    /* which needs two temporary variables only.         */
+    /*                                                   */
+    /* Example:                                          */
+    /*                                                   */
+    /*   count = 8                                       */
+    /*   shift = 2                                       */
+    /*                                                   */
+    /*   stack indices before roll:  7 6 5 4 3 2 1 0     */
+    /*   stack indices after roll:   1 0 7 6 5 4 3 2     */
+    /*                                                   */
+    /* The value of index 0 gets moved to index 2, while */
+    /* the old value of index 2 gets moved to index 4,   */
+    /* and so on.  We thus have the following copying    */
+    /* chains for shift value 2.                         */
+    /*                                                   */
+    /*   0 -> 2 -> 4 -> 6 -> 0                           */
+    /*   1 -> 3 -> 5 -> 7 -> 1                           */
+    /*                                                   */
+    /* If `count' and `shift' are incommensurable, we    */
+    /* have a single chain only.  Otherwise, increase    */
+    /* the start index by 1 after the first chain, then  */
+    /* do the next chain until all elements in all       */
+    /* chains are handled.                               */
+
+    start_idx = -1;
+    idx       = -1;
+    for ( i = 0; i < count; i++ )
+    {
+      CF2_StackNumber  tmp;
+
+
+      if ( start_idx == idx )
+      {
+        start_idx++;
+        idx  = start_idx;
+        last = stack->buffer[idx];
+      }
+
+      idx += shift;
+      if ( idx >= count )
+        idx -= count;
+      else if ( idx < 0 )
+        idx += count;
+
+      tmp                = stack->buffer[idx];
+      stack->buffer[idx] = last;
+      last               = tmp;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_stack_clear( CF2_Stack  stack )
+  {
+    stack->top = stack->buffer;
+  }
+
+
+/* END */
diff --git a/src/cff/cf2stack.h b/src/psaux/psstack.h
similarity index 86%
rename from src/cff/cf2stack.h
rename to src/psaux/psstack.h
index 7d6d196..38f7b41 100644
--- a/src/cff/cf2stack.h
+++ b/src/psaux/psstack.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2stack.h                                                             */
+/*  psstack.h                                                              */
 /*                                                                         */
 /*    Adobe's code for emulating a CFF stack (specification).              */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef __CF2STACK_H__
-#define __CF2STACK_H__
+#ifndef PSSTACK_H_
+#define PSSTACK_H_
 
 
 FT_BEGIN_HEADER
@@ -62,15 +62,17 @@
   {
     FT_Memory         memory;
     FT_Error*         error;
-    CF2_StackNumber   buffer[CF2_OPERAND_STACK_SIZE];
+    CF2_StackNumber*  buffer;
     CF2_StackNumber*  top;
+    FT_UInt           stackSize;
 
   } CF2_StackRec, *CF2_Stack;
 
 
   FT_LOCAL( CF2_Stack )
   cf2_stack_init( FT_Memory  memory,
-                  FT_Error*  error );
+                  FT_Error*  error,
+                  FT_UInt    stackSize );
   FT_LOCAL( void )
   cf2_stack_free( CF2_Stack  stack );
 
@@ -92,6 +94,19 @@
   FT_LOCAL( CF2_Fixed )
   cf2_stack_getReal( CF2_Stack  stack,
                      CF2_UInt   idx );
+  FT_LOCAL( void )
+  cf2_stack_setReal( CF2_Stack  stack,
+                     CF2_UInt   idx,
+                     CF2_Fixed  val );
+
+  FT_LOCAL( void )
+  cf2_stack_pop( CF2_Stack  stack,
+                 CF2_UInt   num );
+
+  FT_LOCAL( void )
+  cf2_stack_roll( CF2_Stack  stack,
+                  CF2_Int    count,
+                  CF2_Int    idx );
 
   FT_LOCAL( void )
   cf2_stack_clear( CF2_Stack  stack );
@@ -100,7 +115,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2STACK_H__ */
+#endif /* PSSTACK_H_ */
 
 
 /* END */
diff --git a/src/cff/cf2types.h b/src/psaux/pstypes.h
similarity index 95%
rename from src/cff/cf2types.h
rename to src/psaux/pstypes.h
index ac6a022..dfbaa3d 100644
--- a/src/cff/cf2types.h
+++ b/src/psaux/pstypes.h
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2types.h                                                             */
+/*  pstypes.h                                                              */
 /*                                                                         */
 /*    Adobe's code for defining data types (specification only).           */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef __CF2TYPES_H__
-#define __CF2TYPES_H__
+#ifndef PSTYPES_H_
+#define PSTYPES_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -72,7 +72,7 @@
 FT_END_HEADER
 
 
-#endif /* __CF2TYPES_H__ */
+#endif /* PSTYPES_H_ */
 
 
 /* END */
diff --git a/src/psaux/rules.mk b/src/psaux/rules.mk
index 0d2118c..a87bfe9 100644
--- a/src/psaux/rules.mk
+++ b/src/psaux/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -33,12 +33,25 @@
                  $(PSAUX_DIR)/t1cmap.c   \
                  $(PSAUX_DIR)/afmparse.c \
                  $(PSAUX_DIR)/psconv.c   \
-                 $(PSAUX_DIR)/psauxmod.c
+                 $(PSAUX_DIR)/psauxmod.c \
+                 $(PSAUX_DIR)/psarrst.c \
+                 $(PSAUX_DIR)/psblues.c \
+                 $(PSAUX_DIR)/pserror.c \
+                 $(PSAUX_DIR)/psfont.c  \
+                 $(PSAUX_DIR)/psft.c    \
+                 $(PSAUX_DIR)/pshints.c \
+                 $(PSAUX_DIR)/psintrp.c \
+                 $(PSAUX_DIR)/psread.c  \
+                 $(PSAUX_DIR)/psstack.c \
+                 $(PSAUX_DIR)/cffdecode.c
 
 # PSAUX driver headers
 #
 PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h)  \
-               $(PSAUX_DIR)/psauxerr.h
+               $(PSAUX_DIR)/psauxerr.h \
+               $(PSAUX_DIR)/psfixed.h \
+               $(PSAUX_DIR)/psglue.h  \
+               $(PSAUX_DIR)/pstypes.h
 
 
 # PSAUX driver object(s)
diff --git a/src/psaux/t1cmap.c b/src/psaux/t1cmap.c
index 2e2d433..112a789 100644
--- a/src/psaux/t1cmap.c
+++ b/src/psaux/t1cmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 character map support (body).                                 */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -45,7 +45,7 @@
     cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
                                     : psnames->adobe_std_encoding;
 
-    FT_ASSERT( cmap->code_to_sid != NULL );
+    FT_ASSERT( cmap->code_to_sid );
   }
 
 
@@ -136,12 +136,16 @@
   {
     sizeof ( T1_CMapStdRec ),
 
-    (FT_CMap_InitFunc)     t1_cmap_standard_init,
-    (FT_CMap_DoneFunc)     t1_cmap_std_done,
-    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
-    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+    (FT_CMap_InitFunc)     t1_cmap_standard_init,   /* init       */
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,        /* done       */
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   };
 
 
@@ -161,12 +165,16 @@
   {
     sizeof ( T1_CMapStdRec ),
 
-    (FT_CMap_InitFunc)     t1_cmap_expert_init,
-    (FT_CMap_DoneFunc)     t1_cmap_std_done,
-    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
-    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+    (FT_CMap_InitFunc)     t1_cmap_expert_init,     /* init       */
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,        /* done       */
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   };
 
 
@@ -193,7 +201,7 @@
     cmap->count   = (FT_UInt)encoding->code_last - cmap->first;
     cmap->indices = encoding->char_index;
 
-    FT_ASSERT( cmap->indices != NULL );
+    FT_ASSERT( cmap->indices );
     FT_ASSERT( encoding->code_first <= encoding->code_last );
 
     return 0;
@@ -232,7 +240,7 @@
     FT_UInt32  char_code = *pchar_code;
 
 
-    ++char_code;
+    char_code++;
 
     if ( char_code < cmap->first )
       char_code = cmap->first;
@@ -257,12 +265,16 @@
   {
     sizeof ( T1_CMapCustomRec ),
 
-    (FT_CMap_InitFunc)     t1_cmap_custom_init,
-    (FT_CMap_DoneFunc)     t1_cmap_custom_done,
-    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
-    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
+    (FT_CMap_InitFunc)     t1_cmap_custom_init,        /* init       */
+    (FT_CMap_DoneFunc)     t1_cmap_custom_done,        /* done       */
+    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   };
 
 
@@ -343,12 +355,16 @@
   {
     sizeof ( PS_UnicodesRec ),
 
-    (FT_CMap_InitFunc)     t1_cmap_unicode_init,
-    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,
-    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
-    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
+    (FT_CMap_InitFunc)     t1_cmap_unicode_init,        /* init       */
+    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,        /* done       */
+    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,  /* char_index */
+    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,   /* char_next  */
 
-    NULL, NULL, NULL, NULL, NULL
+    (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+    (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+    (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+    (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+    (FT_CMap_VariantCharListFunc) NULL   /* variantchar_list */
   };
 
 
diff --git a/src/psaux/t1cmap.h b/src/psaux/t1cmap.h
index b8ba06c..4308e31 100644
--- a/src/psaux/t1cmap.h
+++ b/src/psaux/t1cmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 character map support (specification).                        */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1CMAP_H__
-#define __T1CMAP_H__
+#ifndef T1CMAP_H_
+#define T1CMAP_H_
 
 #include <ft2build.h>
 #include FT_INTERNAL_OBJECTS_H
@@ -99,7 +99,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1CMAP_H__ */
+#endif /* T1CMAP_H_ */
 
 
 /* END */
diff --git a/src/psaux/t1decode.c b/src/psaux/t1decode.c
index 2e19928..6ad1456 100644
--- a/src/psaux/t1decode.c
+++ b/src/psaux/t1decode.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript Type 1 decoding routines (body).                          */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,7 @@
 #include FT_INTERNAL_CALC_H
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_INTERNAL_HASH_H
 #include FT_OUTLINE_H
 
 #include "t1decode.h"
@@ -111,6 +112,56 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
+  /*    t1_lookup_glyph_by_stdcharcode_ps                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */
+  /*    implement the SEAC Type 1 operator in the Adobe engine             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: The current face object.                               */
+  /*                                                                       */
+  /*    charcode :: The character code to look for.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A glyph index in the font face.  Returns -1 if the corresponding   */
+  /*    glyph wasn't found.                                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Int )
+  t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder*  decoder,
+                                     FT_Int       charcode )
+  {
+    FT_UInt             n;
+    const FT_String*    glyph_name;
+    FT_Service_PsCMaps  psnames = decoder->psnames;
+
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+    glyph_name = psnames->adobe_std_strings(
+                   psnames->adobe_std_encoding[charcode]);
+
+    for ( n = 0; n < decoder->num_glyphs; n++ )
+    {
+      FT_String*  name = (FT_String*)decoder->glyph_names[n];
+
+
+      if ( name                               &&
+           name[0] == glyph_name[0]           &&
+           ft_strcmp( name, glyph_name ) == 0 )
+        return (FT_Int)n;
+    }
+
+    return -1;
+  }
+
+
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
   /*    t1_lookup_glyph_by_stdcharcode                                     */
   /*                                                                       */
   /* <Description>                                                         */
@@ -157,6 +208,15 @@
   }
 
 
+  /* parse a single Type 1 glyph */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_parse_glyph( T1_Decoder  decoder,
+                          FT_UInt     glyph )
+  {
+    return decoder->parse_callback( decoder, glyph );
+  }
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -404,9 +464,7 @@
                ( decoder->buildchar == NULL )  );
 
     if ( decoder->buildchar && decoder->len_buildchar > 0 )
-      ft_memset( &decoder->buildchar[0],
-                 0,
-                 sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );
+      FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar );
 
     FT_TRACE4(( "\n"
                 "Start charstring\n" ));
@@ -512,7 +570,7 @@
         break;
 
       case 12:
-        if ( ip > limit )
+        if ( ip >= limit )
         {
           FT_ERROR(( "t1_decoder_parse_charstrings:"
                      " invalid escape (12+EOF)\n" ));
@@ -667,9 +725,9 @@
 
 #ifdef FT_DEBUG_LEVEL_TRACE
         if ( large_int )
-          FT_TRACE4(( " %ld", value ));
+          FT_TRACE4(( " %d", value ));
         else
-          FT_TRACE4(( " %ld", Fix2Int( value ) ));
+          FT_TRACE4(( " %d", value / 65536 ));
 #endif
 
         *top++       = value;
@@ -735,7 +793,7 @@
           if ( arg_cnt != 3 )
             goto Unexpected_OtherSubr;
 
-          if ( decoder->flex_state       == 0 ||
+          if ( !decoder->flex_state           ||
                decoder->num_flex_vectors != 7 )
           {
             FT_ERROR(( "t1_decoder_parse_charstrings:"
@@ -753,13 +811,12 @@
           if ( arg_cnt != 0 )
             goto Unexpected_OtherSubr;
 
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ||
+               FT_SET_ERROR( t1_builder_check_points( builder, 6 ) )   )
+            goto Fail;
+
           decoder->flex_state        = 1;
           decoder->num_flex_vectors  = 0;
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok                                   ||
-               ( error = t1_builder_check_points( builder, 6 ) )
-                 != FT_Err_Ok                                   )
-            goto Fail;
           break;
 
         case 2:                     /* add flex vectors */
@@ -770,7 +827,7 @@
             if ( arg_cnt != 0 )
               goto Unexpected_OtherSubr;
 
-            if ( decoder->flex_state == 0 )
+            if ( !decoder->flex_state )
             {
               FT_ERROR(( "t1_decoder_parse_charstrings:"
                          " missing flex start\n" ));
@@ -782,10 +839,19 @@
             /* point without adding any point to the outline    */
             idx = decoder->num_flex_vectors++;
             if ( idx > 0 && idx < 7 )
+            {
+              /* in malformed fonts it is possible to have other */
+              /* opcodes in the middle of a flex (which don't    */
+              /* increase `num_flex_vectors'); we thus have to   */
+              /* check whether we can add a point                */
+              if ( FT_SET_ERROR( t1_builder_check_points( builder, 1 ) ) )
+                goto Syntax_Error;
+
               t1_builder_add_point( builder,
                                     x,
                                     y,
                                     (FT_Byte)( idx == 3 || idx == 6 ) );
+            }
           }
           break;
 
@@ -857,7 +923,9 @@
 
 
               for ( mm = 1; mm < blend->num_designs; mm++ )
-                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+                tmp = ADD_LONG( tmp,
+                                FT_MulFix( *delta++,
+                                           blend->weight_vector[mm] ) );
 
               *values++ = tmp;
             }
@@ -875,7 +943,7 @@
             PS_Blend  blend = decoder->blend;
 
 
-            if ( arg_cnt != 1 || blend == NULL )
+            if ( arg_cnt != 1 || !blend )
               goto Unexpected_OtherSubr;
 
             idx = Fix2Int( top[0] );
@@ -897,7 +965,7 @@
           if ( arg_cnt != 2 )
             goto Unexpected_OtherSubr;
 
-          top[0] += top[1]; /* XXX (over|under)flow */
+          top[0] = ADD_LONG( top[0], top[1] );
 
           known_othersubr_result_cnt = 1;
           break;
@@ -908,7 +976,7 @@
           if ( arg_cnt != 2 )
             goto Unexpected_OtherSubr;
 
-          top[0] -= top[1]; /* XXX (over|under)flow */
+          top[0] = SUB_LONG( top[0], top[1] );
 
           known_othersubr_result_cnt = 1;
           break;
@@ -943,7 +1011,7 @@
             PS_Blend  blend = decoder->blend;
 
 
-            if ( arg_cnt != 2 || blend == NULL )
+            if ( arg_cnt != 2 || !blend )
               goto Unexpected_OtherSubr;
 
             idx = Fix2Int( top[1] );
@@ -964,7 +1032,7 @@
             PS_Blend  blend = decoder->blend;
 
 
-            if ( arg_cnt != 1 || blend == NULL )
+            if ( arg_cnt != 1 || !blend )
               goto Unexpected_OtherSubr;
 
             idx = Fix2Int( top[0] );
@@ -1122,7 +1190,7 @@
 
             FT_TRACE4(( "BuildCharArray = [ " ));
 
-            for ( i = 0; i < decoder->len_buildchar; ++i )
+            for ( i = 0; i < decoder->len_buildchar; i++ )
               FT_TRACE4(( "%d ", decoder->buildchar[i] ));
 
             FT_TRACE4(( "]\n" ));
@@ -1140,11 +1208,13 @@
 
           builder->parse_state = T1_Parse_Have_Width;
 
-          builder->left_bearing.x += top[0];
-          builder->advance.x       = top[1];
-          builder->advance.y       = 0;
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
 
-          orig_x = x = builder->pos_x + top[0];
+          builder->advance.x = top[1];
+          builder->advance.y = 0;
+
+          orig_x = x = ADD_LONG( builder->pos_x, top[0] );
           orig_y = y = builder->pos_y;
 
           FT_UNUSED( orig_y );
@@ -1170,13 +1240,16 @@
 
           builder->parse_state = T1_Parse_Have_Width;
 
-          builder->left_bearing.x += top[0];
-          builder->left_bearing.y += top[1];
-          builder->advance.x       = top[2];
-          builder->advance.y       = top[3];
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+          builder->left_bearing.y = ADD_LONG( builder->left_bearing.y,
+                                              top[1] );
 
-          x = builder->pos_x + top[0];
-          y = builder->pos_y + top[1];
+          builder->advance.x = top[2];
+          builder->advance.y = top[3];
+
+          x = ADD_LONG( builder->pos_x, top[0] );
+          y = ADD_LONG( builder->pos_y, top[1] );
 
           /* the `metrics_only' indicates that we only want to compute */
           /* the glyph's metrics (lsb + advance width), not load the   */
@@ -1200,17 +1273,17 @@
         case op_hlineto:
           FT_TRACE4(( " hlineto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
           goto Add_Line;
 
         case op_hmoveto:
           FT_TRACE4(( " hmoveto" ));
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
@@ -1222,42 +1295,41 @@
         case op_hvcurveto:
           FT_TRACE4(( " hvcurveto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok                                   ||
-               ( error = t1_builder_check_points( builder, 3 ) )
-                 != FT_Err_Ok                                   )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ||
+               FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
+
+          x = ADD_LONG( x, top[1] );
+          y = ADD_LONG( y, top[2] );
           t1_builder_add_point( builder, x, y, 0 );
-          y += top[3];
+
+          y = ADD_LONG( y, top[3] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
         case op_rlineto:
           FT_TRACE4(( " rlineto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
 
         Add_Line:
-          if ( ( error = t1_builder_add_point1( builder, x, y ) )
-                 != FT_Err_Ok )
+          if ( FT_SET_ERROR( t1_builder_add_point1( builder, x, y ) ) )
             goto Fail;
           break;
 
         case op_rmoveto:
           FT_TRACE4(( " rmoveto" ));
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
@@ -1269,57 +1341,55 @@
         case op_rrcurveto:
           FT_TRACE4(( " rrcurveto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok                                   ||
-               ( error = t1_builder_check_points( builder, 3 ) )
-                 != FT_Err_Ok                                   )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ||
+               FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
           t1_builder_add_point( builder, x, y, 0 );
 
-          x += top[2];
-          y += top[3];
+          x = ADD_LONG( x, top[2] );
+          y = ADD_LONG( y, top[3] );
           t1_builder_add_point( builder, x, y, 0 );
 
-          x += top[4];
-          y += top[5];
+          x = ADD_LONG( x, top[4] );
+          y = ADD_LONG( y, top[5] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
         case op_vhcurveto:
           FT_TRACE4(( " vhcurveto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok                                   ||
-               ( error = t1_builder_check_points( builder, 3 ) )
-                 != FT_Err_Ok                                   )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ||
+               FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
+
+          x = ADD_LONG( x, top[1] );
+          y = ADD_LONG( y, top[2] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[3];
+
+          x = ADD_LONG( x, top[3] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
         case op_vlineto:
           FT_TRACE4(( " vlineto" ));
 
-          if ( ( error = t1_builder_start_point( builder, x, y ) )
-                 != FT_Err_Ok )
+          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
           goto Add_Line;
 
         case op_vmoveto:
           FT_TRACE4(( " vmoveto" ));
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
@@ -1335,7 +1405,7 @@
           /* otherwise, we divide numbers in 16.16 format --    */
           /* in both cases, it is the same operation            */
           *top = FT_DivFix( top[0], top[1] );
-          ++top;
+          top++;
 
           large_int = FALSE;
           break;
@@ -1348,6 +1418,19 @@
             FT_TRACE4(( " callsubr" ));
 
             idx = Fix2Int( top[0] );
+
+            if ( decoder->subrs_hash )
+            {
+              size_t*  val = ft_hash_num_lookup( idx,
+                                                 decoder->subrs_hash );
+
+
+              if ( val )
+                idx = *val;
+              else
+                idx = -1;
+            }
+
             if ( idx < 0 || idx >= decoder->num_subrs )
             {
               FT_ERROR(( "t1_decoder_parse_charstrings:"
@@ -1463,7 +1546,7 @@
           /* record vertical hint */
           if ( hinter )
           {
-            top[0] += orig_x;
+            top[0] = ADD_LONG( top[0], orig_x );
             hinter->stem( hinter->hints, 0, top );
           }
           break;
@@ -1477,9 +1560,9 @@
             FT_Pos  dx = orig_x;
 
 
-            top[0] += dx;
-            top[2] += dx;
-            top[4] += dx;
+            top[0] = ADD_LONG( top[0], dx );
+            top[2] = ADD_LONG( top[2], dx );
+            top[4] = ADD_LONG( top[4], dx );
             hinter->stem3( hinter->hints, 0, top );
           }
           break;
@@ -1555,14 +1638,286 @@
     return FT_THROW( Stack_Underflow );
   }
 
+#else /* T1_CONFIG_OPTION_OLD_ENGINE */
 
-  /* parse a single Type 1 glyph */
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_decoder_parse_metrics                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 1 charstrings program to extract width         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /*    charstring_base :: The base address of the charstring stream.      */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  t1_decoder_parse_glyph( T1_Decoder  decoder,
-                          FT_UInt     glyph )
+  t1_decoder_parse_metrics( T1_Decoder  decoder,
+                            FT_Byte*    charstring_base,
+                            FT_UInt     charstring_len )
   {
-    return decoder->parse_callback( decoder, glyph );
+    T1_Decoder_Zone  zone;
+    FT_Byte*         ip;
+    FT_Byte*         limit;
+    T1_Builder       builder = &decoder->builder;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool          bol = TRUE;
+#endif
+
+
+    /* First of all, initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+
+    builder->parse_state = T1_Parse_Start;
+
+    FT_TRACE4(( "\n"
+                "Start charstring: get width\n" ));
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    /* now, execute loop */
+    while ( ip < limit )
+    {
+      FT_Long*     top   = decoder->top;
+      T1_Operator  op    = op_none;
+      FT_Int32     value = 0;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( bol )
+      {
+        FT_TRACE5(( " (%d)", decoder->top - decoder->stack ));
+        bol = FALSE;
+      }
+#endif
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Decode operator or operand                                        */
+      /*                                                                   */
+      /*                                                                   */
+
+      /* first of all, decompress operator or value */
+      switch ( *ip++ )
+      {
+      case 1:
+      case 3:
+      case 4:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 10:
+      case 11:
+      case 14:
+      case 15:
+      case 21:
+      case 22:
+      case 30:
+      case 31:
+        goto No_Width;
+
+      case 13:
+        op = op_hsbw;
+        break;
+
+      case 12:
+        if ( ip >= limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " invalid escape (12+EOF)\n" ));
+          goto Syntax_Error;
+        }
+
+        switch ( *ip++ )
+        {
+        case 7:
+          op = op_sbw;
+          break;
+
+        default:
+          goto No_Width;
+        }
+        break;
+
+      case 255:    /* four bytes integer */
+        if ( ip + 4 > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " unexpected EOF in integer\n" ));
+          goto Syntax_Error;
+        }
+
+        value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] << 8  ) |
+                              (FT_UInt32)ip[3]         );
+        ip += 4;
+
+        /* According to the specification, values > 32000 or < -32000 must */
+        /* be followed by a `div' operator to make the result be in the    */
+        /* range [-32000;32000].  We expect that the second argument of    */
+        /* `div' is not a large number.  Additionally, we don't handle     */
+        /* stuff like `<large1> <large2> <num> div <num> div' or           */
+        /* <large1> <large2> <num> div div'.  This is probably not allowed */
+        /* anyway.                                                         */
+        if ( value > 32000 || value < -32000 )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " large integer found for width\n" ));
+          goto Syntax_Error;
+        }
+        else
+        {
+          value = (FT_Int32)( (FT_UInt32)value << 16 );
+        }
+
+        break;
+
+      default:
+        if ( ip[-1] >= 32 )
+        {
+          if ( ip[-1] < 247 )
+            value = (FT_Int32)ip[-1] - 139;
+          else
+          {
+            if ( ++ip > limit )
+            {
+              FT_ERROR(( "t1_decoder_parse_metrics:"
+                         " unexpected EOF in integer\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( ip[-2] < 251 )
+              value =    ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;
+            else
+              value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );
+          }
+
+          value = (FT_Int32)( (FT_UInt32)value << 16 );
+        }
+        else
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " invalid byte (%d)\n", ip[-1] ));
+          goto Syntax_Error;
+        }
+      }
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Push value on stack, or process operator                         */
+      /*                                                                   */
+      /*                                                                   */
+      if ( op == op_none )
+      {
+        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics: stack overflow\n" ));
+          goto Syntax_Error;
+        }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          FT_TRACE4(( " %d", value / 65536 ));
+#endif
+
+        *top++       = value;
+        decoder->top = top;
+      }
+      else  /* general operator */
+      {
+        FT_Int  num_args = t1_args_count[op];
+
+
+        FT_ASSERT( num_args >= 0 );
+
+        if ( top - decoder->stack < num_args )
+          goto Stack_Underflow;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        if ( top - decoder->stack != num_args )
+          FT_TRACE0(( "t1_decoder_parse_metrics:"
+                      " too much operands on the stack"
+                      " (seen %d, expected %d)\n",
+                      top - decoder->stack, num_args ));
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        top -= num_args;
+
+        switch ( op )
+        {
+        case op_hsbw:
+          FT_TRACE4(( " hsbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+
+          builder->advance.x = top[1];
+          builder->advance.y = 0;
+
+          /* we only want to compute the glyph's metrics */
+          /* (lsb + advance width), not load the rest of */
+          /* it; so exit immediately                     */
+          return FT_Err_Ok;
+
+        case op_sbw:
+          FT_TRACE4(( " sbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+          builder->left_bearing.y = ADD_LONG( builder->left_bearing.y,
+                                              top[1] );
+
+          builder->advance.x = top[2];
+          builder->advance.y = top[3];
+
+          /* we only want to compute the glyph's metrics */
+          /* (lsb + advance width), not load the rest of */
+          /* it; so exit immediately                     */
+          return FT_Err_Ok;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " unhandled opcode %d\n", op ));
+          goto Syntax_Error;
+        }
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  No_Width:
+    FT_ERROR(( "t1_decoder_parse_metrics:"
+               " no width, found op %d instead\n",
+               ip[-1] ));
+  Syntax_Error:
+    return FT_THROW( Syntax_Error );
+
+  Stack_Underflow:
+    return FT_THROW( Stack_Underflow );
   }
+#endif /* T1_CONFIG_OPTION_OLD_ENGINE */
 
 
   /* initialize T1 decoder */
@@ -1577,7 +1932,7 @@
                    FT_Render_Mode       hint_mode,
                    T1_Decoder_Callback  parse_callback )
   {
-    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+    FT_ZERO( decoder );
 
     /* retrieve PSNames interface from list of current modules */
     {
@@ -1617,7 +1972,16 @@
   FT_LOCAL_DEF( void )
   t1_decoder_done( T1_Decoder  decoder )
   {
+    FT_Memory  memory = decoder->builder.memory;
+
+
     t1_builder_done( &decoder->builder );
+
+    if ( decoder->cf2_instance.finalizer )
+    {
+      decoder->cf2_instance.finalizer( decoder->cf2_instance.data );
+      FT_FREE( decoder->cf2_instance.data );
+    }
   }
 
 
diff --git a/src/psaux/t1decode.h b/src/psaux/t1decode.h
index e83078f..1d9718d 100644
--- a/src/psaux/t1decode.h
+++ b/src/psaux/t1decode.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript Type 1 decoding routines (specification).                 */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1DECODE_H__
-#define __T1DECODE_H__
+#ifndef T1DECODE_H_
+#define T1DECODE_H_
 
 
 #include <ft2build.h>
@@ -31,7 +31,11 @@
   FT_CALLBACK_TABLE
   const T1_Decoder_FuncsRec  t1_decoder_funcs;
 
+  FT_LOCAL( FT_Int )
+  t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder*  decoder,
+                                     FT_Int       charcode );
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
   FT_LOCAL( FT_Error )
   t1_decoder_parse_glyph( T1_Decoder  decoder,
                           FT_UInt     glyph_index );
@@ -40,6 +44,12 @@
   t1_decoder_parse_charstrings( T1_Decoder  decoder,
                                 FT_Byte*    base,
                                 FT_UInt     len );
+#else
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_metrics( T1_Decoder  decoder,
+                            FT_Byte*    charstring_base,
+                            FT_UInt     charstring_len );
+#endif
 
   FT_LOCAL( FT_Error )
   t1_decoder_init( T1_Decoder           decoder,
@@ -58,7 +68,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1DECODE_H__ */
+#endif /* T1DECODE_H_ */
 
 
 /* END */
diff --git a/src/pshinter/Jamfile b/src/pshinter/Jamfile
index e763c47..3f5f0ae 100644
--- a/src/pshinter/Jamfile
+++ b/src/pshinter/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/pshinter Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,12 @@
 
   if $(FT2_MULTI)
   {
-    _sources = pshrec pshglob pshalgo pshmod pshpic ;
+    _sources = pshalgo
+               pshglob
+               pshmod
+               pshpic
+               pshrec
+               ;
   }
   else
   {
diff --git a/src/pshinter/module.mk b/src/pshinter/module.mk
index 1fd8e55..06707be 100644
--- a/src/pshinter/module.mk
+++ b/src/pshinter/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/pshinter/pshalgo.c b/src/pshinter/pshalgo.c
index bfdb3ed..b98077c 100644
--- a/src/pshinter/pshalgo.c
+++ b/src/pshinter/pshalgo.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinting algorithm (body).                                 */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -26,7 +26,7 @@
 
 
 #undef  FT_COMPONENT
-#define FT_COMPONENT  trace_pshalgo2
+#define FT_COMPONENT  trace_pshalgo
 
 
 #ifdef DEBUG_HINTER
@@ -779,7 +779,7 @@
            * It turns out though that minimizing the total number of lit
            * pixels is also important, so position C), with one edge
            * aligned with a pixel boundary is actually preferable
-           * to A).  There are also more possibile positions for C) than
+           * to A).  There are also more possible positions for C) than
            * for A) or B), so it involves less distortion of the overall
            * character shape.
            */
@@ -802,7 +802,7 @@
             }
 
             /* We choose between B) and C) above based on the amount
-             * of fractinal stem width; for small amounts, choose
+             * of fractional stem width; for small amounts, choose
              * C) always, for large amounts, B) always, and inbetween,
              * pick whichever one involves less stem movement.
              */
@@ -898,7 +898,7 @@
   static void
   psh_print_zone( PSH_Zone  zone )
   {
-    printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
+    printf( "zone [scale,delta,min,max] = [%.5f,%.2f,%d,%d]\n",
              zone->scale / 65536.0,
              zone->delta / 64.0,
              zone->min,
@@ -916,103 +916,9 @@
   /*************************************************************************/
   /*************************************************************************/
 
-#if 1
-
 #define  psh_corner_is_flat      ft_corner_is_flat
 #define  psh_corner_orientation  ft_corner_orientation
 
-#else
-
-  FT_LOCAL_DEF( FT_Int )
-  psh_corner_is_flat( FT_Pos  x_in,
-                      FT_Pos  y_in,
-                      FT_Pos  x_out,
-                      FT_Pos  y_out )
-  {
-    FT_Pos  ax = x_in;
-    FT_Pos  ay = y_in;
-
-    FT_Pos  d_in, d_out, d_corner;
-
-
-    if ( ax < 0 )
-      ax = -ax;
-    if ( ay < 0 )
-      ay = -ay;
-    d_in = ax + ay;
-
-    ax = x_out;
-    if ( ax < 0 )
-      ax = -ax;
-    ay = y_out;
-    if ( ay < 0 )
-      ay = -ay;
-    d_out = ax + ay;
-
-    ax = x_out + x_in;
-    if ( ax < 0 )
-      ax = -ax;
-    ay = y_out + y_in;
-    if ( ay < 0 )
-      ay = -ay;
-    d_corner = ax + ay;
-
-    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
-  }
-
-  static FT_Int
-  psh_corner_orientation( FT_Pos  in_x,
-                          FT_Pos  in_y,
-                          FT_Pos  out_x,
-                          FT_Pos  out_y )
-  {
-    FT_Int  result;
-
-
-    /* deal with the trivial cases quickly */
-    if ( in_y == 0 )
-    {
-      if ( in_x >= 0 )
-        result = out_y;
-      else
-        result = -out_y;
-    }
-    else if ( in_x == 0 )
-    {
-      if ( in_y >= 0 )
-        result = -out_x;
-      else
-        result = out_x;
-    }
-    else if ( out_y == 0 )
-    {
-      if ( out_x >= 0 )
-        result = in_y;
-      else
-        result = -in_y;
-    }
-    else if ( out_x == 0 )
-    {
-      if ( out_y >= 0 )
-        result = -in_x;
-      else
-        result =  in_x;
-    }
-    else /* general case */
-    {
-      long long  delta = (long long)in_x * out_y - (long long)in_y * out_x;
-
-      if ( delta == 0 )
-        result = 0;
-      else
-        result = 1 - 2 * ( delta < 0 );
-    }
-
-    return result;
-  }
-
-#endif /* !1 */
-
 
 #ifdef COMPUTE_INFLEXS
 
@@ -1256,7 +1162,7 @@
 
 
     /* clear all fields */
-    FT_MEM_ZERO( glyph, sizeof ( *glyph ) );
+    FT_ZERO( glyph );
 
     memory = glyph->memory = globals->memory;
 
@@ -1625,7 +1531,7 @@
           }
         }
 
-        if ( point->hint == NULL )
+        if ( !point->hint )
         {
           for ( nn = 0; nn < num_hints; nn++ )
           {
@@ -1666,8 +1572,8 @@
     PS_Mask         mask      = table->hint_masks->masks;
     FT_UInt         num_masks = table->hint_masks->num_masks;
     FT_UInt         first     = 0;
-    FT_Int          major_dir = dimension == 0 ? PSH_DIR_VERTICAL
-                                               : PSH_DIR_HORIZONTAL;
+    FT_Int          major_dir = ( dimension == 0 ) ? PSH_DIR_VERTICAL
+                                                   : PSH_DIR_HORIZONTAL;
     PSH_Dimension   dim       = &glyph->globals->dimension[dimension];
     FT_Fixed        scale     = dim->scale_mult;
     FT_Int          threshold;
diff --git a/src/pshinter/pshalgo.h b/src/pshinter/pshalgo.h
index 8373e5e..c50683f 100644
--- a/src/pshinter/pshalgo.h
+++ b/src/pshinter/pshalgo.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinting algorithm (specification).                        */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSHALGO_H__
-#define __PSHALGO_H__
+#ifndef PSHALGO_H_
+#define PSHALGO_H_
 
 
 #include "pshrec.h"
@@ -235,7 +235,7 @@
 FT_END_HEADER
 
 
-#endif /* __PSHALGO_H__ */
+#endif /* PSHALGO_H_ */
 
 
 /* END */
diff --git a/src/pshinter/pshglob.c b/src/pshinter/pshglob.c
index 6723b71..accc049 100644
--- a/src/pshinter/pshglob.c
+++ b/src/pshinter/pshglob.c
@@ -5,7 +5,7 @@
 /*    PostScript hinter global hinting management (body).                  */
 /*    Inspired by the new auto-hinter module.                              */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -80,7 +80,7 @@
 
 #if 0
 
-  /* org_width is is font units, result in device pixels, 26.6 format */
+  /* org_width is in font units, result in device pixels, 26.6 format */
   FT_LOCAL_DEF( FT_Pos )
   psh_dimension_snap_width( PSH_Dimension  dimension,
                             FT_Int         org_width )
@@ -227,8 +227,8 @@
   }
 
 
-  /* Re-read blue zones from the original fonts and store them into out */
-  /* private structure.  This function re-orders, sanitizes and         */
+  /* Re-read blue zones from the original fonts and store them into our */
+  /* private structure.  This function re-orders, sanitizes, and        */
   /* fuzz-expands the zones as well.                                    */
   static void
   psh_blues_set_zones( PSH_Blues  target,
@@ -339,7 +339,7 @@
             bot   = zone[1].org_bottom;
             delta = bot - top;
 
-            if ( delta < 2 * fuzz )
+            if ( delta / 2 < fuzz )
               zone[0].org_top = zone[1].org_bottom = top + delta / 2;
             else
             {
diff --git a/src/pshinter/pshglob.h b/src/pshinter/pshglob.h
index c376df7..cf80bf4 100644
--- a/src/pshinter/pshglob.h
+++ b/src/pshinter/pshglob.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinter global hinting management.                         */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSHGLOB_H__
-#define __PSHGLOB_H__
+#ifndef PSHGLOB_H_
+#define PSHGLOB_H_
 
 
 #include FT_FREETYPE_H
@@ -190,7 +190,7 @@
 FT_END_HEADER
 
 
-#endif /* __PSHGLOB_H__ */
+#endif /* PSHGLOB_H_ */
 
 
 /* END */
diff --git a/src/pshinter/pshinter.c b/src/pshinter/pshinter.c
index 9e65fe2..0eedac4 100644
--- a/src/pshinter/pshinter.c
+++ b/src/pshinter/pshinter.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript Hinting module                                   */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,13 +17,13 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
+
+#include "pshalgo.c"
+#include "pshglob.c"
+#include "pshmod.c"
 #include "pshpic.c"
 #include "pshrec.c"
-#include "pshglob.c"
-#include "pshalgo.c"
-#include "pshmod.c"
 
 
 /* END */
diff --git a/src/pshinter/pshmod.c b/src/pshinter/pshmod.c
index 961b468..0b8f6f9 100644
--- a/src/pshinter/pshmod.c
+++ b/src/pshinter/pshmod.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript hinter module implementation (body).             */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -95,9 +95,11 @@
 
   FT_DEFINE_PSHINTER_INTERFACE(
     pshinter_interface,
+
     pshinter_get_globals_funcs,
     pshinter_get_t1_funcs,
-    pshinter_get_t2_funcs )
+    pshinter_get_t2_funcs
+  )
 
 
   FT_DEFINE_MODULE(
@@ -111,9 +113,9 @@
 
     &PSHINTER_INTERFACE_GET,              /* module-specific interface */
 
-    (FT_Module_Constructor)ps_hinter_init,
-    (FT_Module_Destructor) ps_hinter_done,
-    (FT_Module_Requester)  NULL )   /* no additional interface for now */
-
+    (FT_Module_Constructor)ps_hinter_init,  /* module_init   */
+    (FT_Module_Destructor) ps_hinter_done,  /* module_done   */
+    (FT_Module_Requester)  NULL             /* get_interface */
+  )
 
 /* END */
diff --git a/src/pshinter/pshmod.h b/src/pshinter/pshmod.h
index a58d856..556de2f 100644
--- a/src/pshinter/pshmod.h
+++ b/src/pshinter/pshmod.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinter module interface (specification).                  */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSHMOD_H__
-#define __PSHMOD_H__
+#ifndef PSHMOD_H_
+#define PSHMOD_H_
 
 
 #include <ft2build.h>
@@ -33,7 +33,7 @@
 FT_END_HEADER
 
 
-#endif /* __PSHMOD_H__ */
+#endif /* PSHMOD_H_ */
 
 
 /* END */
diff --git a/src/pshinter/pshnterr.h b/src/pshinter/pshnterr.h
index ce790a8..b9d02d2 100644
--- a/src/pshinter/pshnterr.h
+++ b/src/pshinter/pshnterr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS Hinter error codes (specification only).                          */
 /*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __PSHNTERR_H__
-#define __PSHNTERR_H__
+#ifndef PSHNTERR_H_
+#define PSHNTERR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  PSH_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __PSHNTERR_H__ */
+#endif /* PSHNTERR_H_ */
 
 
 /* END */
diff --git a/src/pshinter/pshpic.c b/src/pshinter/pshpic.c
index afd8fb9..465ad31 100644
--- a/src/pshinter/pshpic.c
+++ b/src/pshinter/pshpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for pshinter module. */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/pshinter/pshpic.h b/src/pshinter/pshpic.h
index 62de457..4469ba8 100644
--- a/src/pshinter/pshpic.h
+++ b/src/pshinter/pshpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for pshinter module. */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,12 +16,10 @@
 /***************************************************************************/
 
 
-#ifndef __PSHPIC_H__
-#define __PSHPIC_H__
+#ifndef PSHPIC_H_
+#define PSHPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
 
@@ -33,6 +31,8 @@
 
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
 
+FT_BEGIN_HEADER
+
   typedef struct  PSHinterPIC_
   {
     PSHinter_Interface  pshinter_interface;
@@ -51,13 +51,13 @@
   FT_Error
   pshinter_module_class_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
-FT_END_HEADER
-
-#endif /* __PSHPIC_H__ */
+#endif /* PSHPIC_H_ */
 
 
 /* END */
diff --git a/src/pshinter/pshrec.c b/src/pshinter/pshrec.c
index f8895fc..6648d13 100644
--- a/src/pshinter/pshrec.c
+++ b/src/pshinter/pshrec.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript hints recorder (body).                           */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -818,7 +818,7 @@
   ps_hints_init( PS_Hints   hints,
                  FT_Memory  memory )
   {
-    FT_MEM_ZERO( hints, sizeof ( *hints ) );
+    FT_ZERO( hints );
     hints->memory = memory;
   }
 
@@ -1140,7 +1140,7 @@
   FT_LOCAL_DEF( void )
   t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )
   {
-    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );
+    FT_ZERO( funcs );
 
     funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;
     funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;
@@ -1206,7 +1206,7 @@
   FT_LOCAL_DEF( void )
   t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )
   {
-    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );
+    FT_ZERO( funcs );
 
     funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;
     funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;
diff --git a/src/pshinter/pshrec.h b/src/pshinter/pshrec.h
index 2b1ad94..7e3dfe0 100644
--- a/src/pshinter/pshrec.h
+++ b/src/pshinter/pshrec.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Postscript (Type1/Type2) hints recorder (specification).             */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -28,8 +28,8 @@
   /**************************************************************************/
 
 
-#ifndef __PSHREC_H__
-#define __PSHREC_H__
+#ifndef PSHREC_H_
+#define PSHREC_H_
 
 
 #include <ft2build.h>
@@ -166,7 +166,7 @@
 FT_END_HEADER
 
 
-#endif /* __PS_HINTER_RECORD_H__ */
+#endif /* PSHREC_H_ */
 
 
 /* END */
diff --git a/src/pshinter/rules.mk b/src/pshinter/rules.mk
index 7838e67..966690e 100644
--- a/src/pshinter/rules.mk
+++ b/src/pshinter/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/psnames/Jamfile b/src/psnames/Jamfile
index b9fe235..a0fd373 100644
--- a/src/psnames/Jamfile
+++ b/src/psnames/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/psnames Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,9 @@
 
   if $(FT2_MULTI)
   {
-    _sources = psmodule pspic ;
+    _sources = psmodule
+               pspic
+               ;
   }
   else
   {
diff --git a/src/psnames/module.mk b/src/psnames/module.mk
index 3708f60..410f48a 100644
--- a/src/psnames/module.mk
+++ b/src/psnames/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c
index 0f04c2f..8929ebe 100644
--- a/src/psnames/psmodule.c
+++ b/src/psnames/psmodule.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PSNames module implementation (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,22 @@
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 
 #include "psmodule.h"
+
+  /*
+   *  The file `pstables.h' with its arrays and its function
+   *  `ft_get_adobe_glyph_index' is useful for other projects also (for
+   *  example, `pdfium' is using it).  However, if used as a C++ header,
+   *  including it in two different source files makes it necessary to use
+   *  `extern const' for the declaration of its arrays, otherwise the data
+   *  would be duplicated as mandated by the C++ standard.
+   *
+   *  For this reason, we use `DEFINE_PS_TABLES' to guard the function
+   *  definitions, and `DEFINE_PS_TABLES_DATA' to provide both proper array
+   *  declarations and definitions.
+   */
+#include "pstables.h"
+#define  DEFINE_PS_TABLES
+#define  DEFINE_PS_TABLES_DATA
 #include "pstables.h"
 
 #include "psnamerr.h"
@@ -525,37 +541,42 @@
 
   FT_DEFINE_SERVICE_PSCMAPSREC(
     pscmaps_interface,
-    (PS_Unicode_ValueFunc)     ps_unicode_value,
-    (PS_Unicodes_InitFunc)     ps_unicodes_init,
-    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,
-    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,
 
-    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
-    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+    (PS_Unicode_ValueFunc)     ps_unicode_value,        /* unicode_value         */
+    (PS_Unicodes_InitFunc)     ps_unicodes_init,        /* unicodes_init         */
+    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,  /* unicodes_char_index   */
+    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,   /* unicodes_char_next    */
 
-    t1_standard_encoding,
-    t1_expert_encoding )
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,   /* macintosh_name        */
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings     */
+
+    t1_standard_encoding,                               /* adobe_std_encoding    */
+    t1_expert_encoding                                  /* adobe_expert_encoding */
+  )
 
 #else
 
   FT_DEFINE_SERVICE_PSCMAPSREC(
     pscmaps_interface,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
 
-    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
-    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+    NULL,                                               /* unicode_value         */
+    NULL,                                               /* unicodes_init         */
+    NULL,                                               /* unicodes_char_index   */
+    NULL,                                               /* unicodes_char_next    */
 
-    t1_standard_encoding,
-    t1_expert_encoding )
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,   /* macintosh_name        */
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings     */
+
+    t1_standard_encoding,                               /* adobe_std_encoding    */
+    t1_expert_encoding                                  /* adobe_expert_encoding */
+  )
 
 #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
 
 
   FT_DEFINE_SERVICEDESCREC1(
     pscmaps_services,
+
     FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET )
 
 
@@ -601,9 +622,11 @@
 
     PUT_PS_NAMES_SERVICE(
       (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */
-    (FT_Module_Constructor)NULL,
-    (FT_Module_Destructor) NULL,
-    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) )
+
+    (FT_Module_Constructor)NULL,                                       /* module_init   */
+    (FT_Module_Destructor) NULL,                                       /* module_done   */
+    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */
+  )
 
 
 /* END */
diff --git a/src/psnames/psmodule.h b/src/psnames/psmodule.h
index f85f322..3e94f8b 100644
--- a/src/psnames/psmodule.h
+++ b/src/psnames/psmodule.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level PSNames module interface (specification).                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __PSMODULE_H__
-#define __PSMODULE_H__
+#ifndef PSMODULE_H_
+#define PSMODULE_H_
 
 
 #include <ft2build.h>
@@ -32,7 +32,7 @@
 
 FT_END_HEADER
 
-#endif /* __PSMODULE_H__ */
+#endif /* PSMODULE_H_ */
 
 
 /* END */
diff --git a/src/psnames/psnamerr.h b/src/psnames/psnamerr.h
index 09cc247..14eb76c 100644
--- a/src/psnames/psnamerr.h
+++ b/src/psnames/psnamerr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS names module error codes (specification only).                    */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __PSNAMERR_H__
-#define __PSNAMERR_H__
+#ifndef PSNAMERR_H_
+#define PSNAMERR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  PSnames_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __PSNAMERR_H__ */
+#endif /* PSNAMERR_H_ */
 
 
 /* END */
diff --git a/src/psnames/psnames.c b/src/psnames/psnames.c
index a438596..febb80d 100644
--- a/src/psnames/psnames.c
+++ b/src/psnames/psnames.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PSNames module component (body only).                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,10 +17,10 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "pspic.c"
+
 #include "psmodule.c"
+#include "pspic.c"
 
 
 /* END */
diff --git a/src/psnames/pspic.c b/src/psnames/pspic.c
index 1394f97..85a06f3 100644
--- a/src/psnames/pspic.c
+++ b/src/psnames/pspic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for psnames module.  */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/psnames/pspic.h b/src/psnames/pspic.h
index 88ccda3..889780c 100644
--- a/src/psnames/pspic.h
+++ b/src/psnames/pspic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for psnames module.  */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,14 +16,13 @@
 /***************************************************************************/
 
 
-#ifndef __PSPIC_H__
-#define __PSPIC_H__
+#ifndef PSPIC_H_
+#define PSPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
+
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define PSCMAPS_SERVICES_GET   pscmaps_services
@@ -33,6 +32,9 @@
 
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 
+
+FT_BEGIN_HEADER
+
   typedef struct  PSModulePIC_
   {
     FT_ServiceDescRec*     pscmaps_services;
@@ -54,13 +56,13 @@
   FT_Error
   psnames_module_class_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
-FT_END_HEADER
-
-#endif /* __PSPIC_H__ */
+#endif /* PSPIC_H_ */
 
 
 /* END */
diff --git a/src/psnames/pstables.h b/src/psnames/pstables.h
index 3f31c31..79545ee 100644
--- a/src/psnames/pstables.h
+++ b/src/psnames/pstables.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript glyph names.                                              */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,7 +19,16 @@
   /* This file has been generated automatically -- do not edit! */
 
 
-  static const char  ft_standard_glyph_names[3696] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const char  ft_standard_glyph_names[3696]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
     '.','n','u','l','l', 0,
     'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
@@ -441,14 +450,25 @@
     'R','e','g','u','l','a','r', 0,
     'R','o','m','a','n', 0,
     'S','e','m','i','b','o','l','d', 0,
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
 #define FT_NUM_MAC_NAMES  258
 
   /* Values are offsets into the `ft_standard_glyph_names' table */
 
-  static const short  ft_mac_names[FT_NUM_MAC_NAMES] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const short  ft_mac_names[FT_NUM_MAC_NAMES]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
      253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
      360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,
@@ -469,14 +489,25 @@
     1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,
     1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
      209, 218, 225, 232, 239, 246
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
 #define FT_NUM_SID_NAMES  391
 
   /* Values are offsets into the `ft_standard_glyph_names' table */
 
-  static const short  ft_sid_names[FT_NUM_SID_NAMES] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const short  ft_sid_names[FT_NUM_SID_NAMES]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
      253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
      371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,
@@ -506,11 +537,22 @@
     3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,
     3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,
     3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
   /* the following are indices into the SID name table */
-  static const unsigned short  t1_standard_encoding[256] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const unsigned short  t1_standard_encoding[256]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -528,11 +570,22 @@
     137,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
       0,138,  0,139,  0,  0,  0,  0,140,141,142,143,  0,  0,  0,  0,
       0,144,  0,  0,  0,145,  0,  0,146,147,148,149,  0,  0,  0,  0
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
   /* the following are indices into the SID name table */
-  static const unsigned short  t1_expert_encoding[256] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const unsigned short  t1_expert_encoding[256]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
@@ -550,7 +603,9 @@
     331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,
     347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,
     363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
   /*
@@ -564,7 +619,16 @@
 
 #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
 
-  static const unsigned char  ft_adobe_glyph_list[55997L] =
+#ifndef  DEFINE_PS_TABLES_DATA
+#ifdef  __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+#endif
+  const unsigned char  ft_adobe_glyph_list[55997L]
+#ifdef  DEFINE_PS_TABLES_DATA
+  =
   {
       0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,
      11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,
@@ -4066,9 +4130,12 @@
     248,232,239,239,107,128,  2,144,243,244,242,239,235,101,128,  1,
     182,117,  2,218,167,218,178,232,233,242,225,231,225,238, 97,128,
      48, 90,235,225,244,225,235,225,238, 97,128, 48,186
-  };
+  }
+#endif /* DEFINE_PS_TABLES_DATA */
+  ;
 
 
+#ifdef  DEFINE_PS_TABLES
   /*
    *  This function searches the compressed table efficiently.
    */
@@ -4163,6 +4230,7 @@
   NotFound:
     return 0;
   }
+#endif /* DEFINE_PS_TABLES */
 
 #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
 
diff --git a/src/psnames/rules.mk b/src/psnames/rules.mk
index 3c77486..4d629d8 100644
--- a/src/psnames/rules.mk
+++ b/src/psnames/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/raster/Jamfile b/src/raster/Jamfile
index f03ed32..838e7ef 100644
--- a/src/raster/Jamfile
+++ b/src/raster/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/raster Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,10 @@
 
   if $(FT2_MULTI)
   {
-    _sources = ftraster ftrend1 rastpic ;
+    _sources = ftraster
+               ftrend1
+               rastpic
+               ;
   }
   else
   {
diff --git a/src/raster/ftmisc.h b/src/raster/ftmisc.h
index 19be4ca..7e40119 100644
--- a/src/raster/ftmisc.h
+++ b/src/raster/ftmisc.h
@@ -5,7 +5,7 @@
 /*    Miscellaneous macros for stand-alone rasterizer (specification       */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -24,8 +24,8 @@
   /*                                                 */
   /***************************************************/
 
-#ifndef __FTMISC_H__
-#define __FTMISC_H__
+#ifndef FTMISC_H_
+#define FTMISC_H_
 
 
   /* memset */
@@ -37,7 +37,7 @@
 #define FT_LOCAL_DEF( x )   static x
 
 
-  /* from include/freetype2/fttypes.h */
+  /* from include/freetype/fttypes.h */
 
   typedef unsigned char  FT_Byte;
   typedef signed int     FT_Int;
@@ -54,7 +54,7 @@
               (FT_ULong)_x4         )
 
 
-  /* from include/freetype2/ftsystem.h */
+  /* from include/freetype/ftsystem.h */
 
   typedef struct FT_MemoryRec_*  FT_Memory;
 
@@ -136,7 +136,7 @@
     return ( s > 0 ) ? d : -d;
   }
 
-#endif /* __FTMISC_H__ */
+#endif /* FTMISC_H_ */
 
 
 /* END */
diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c
index eeab143..4354730 100644
--- a/src/raster/ftraster.c
+++ b/src/raster/ftraster.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,18 +18,18 @@
   /*************************************************************************/
   /*                                                                       */
   /* This file can be compiled without the rest of the FreeType engine, by */
-  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* defining the STANDALONE_ macro when compiling it.  You also need to   */
   /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */
   /* directory.  Typically, you should do something like                   */
   /*                                                                       */
   /* - copy `src/raster/ftraster.c' (this file) to your current directory  */
   /*                                                                       */
-  /* - copy `include/ftimage.h' and `src/raster/ftmisc.h' to your current  */
-  /*   directory                                                           */
+  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' to your */
+  /*   current directory                                                   */
   /*                                                                       */
-  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */
+  /* - compile `ftraster' with the STANDALONE_ macro defined, as in        */
   /*                                                                       */
-  /*     cc -c -D_STANDALONE_ ftraster.c                                   */
+  /*     cc -c -DSTANDALONE_ ftraster.c                                    */
   /*                                                                       */
   /* The renderer can be initialized with a call to                        */
   /* `ft_standard_raster.raster_new'; a bitmap can be generated            */
@@ -47,7 +47,7 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
   /* The size in bytes of the render pool used by the scan-line converter  */
   /* to do all of its work.                                                */
@@ -60,7 +60,7 @@
 #include "ftmisc.h"
 #include "ftimage.h"
 
-#else /* !_STANDALONE_ */
+#else /* !STANDALONE_ */
 
 #include <ft2build.h>
 #include "ftraster.h"
@@ -68,7 +68,7 @@
 
 #include "rastpic.h"
 
-#endif /* !_STANDALONE_ */
+#endif /* !STANDALONE_ */
 
 
   /*************************************************************************/
@@ -173,14 +173,12 @@
 #define FT_COMPONENT  trace_raster
 
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
   /* Auxiliary macros for token concatenation. */
 #define FT_ERR_XCAT( x, y )  x ## y
 #define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
 
-#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
-
   /* This macro is used to indicate that a function parameter is unused. */
   /* Its purpose is simply to reduce compiler warnings.  Note also that  */
   /* simply defining it as `(void)x' doesn't avoid warnings with certain */
@@ -226,7 +224,7 @@
             raster_done_                                            \
          };
 
-#else /* !_STANDALONE_ */
+#else /* !STANDALONE_ */
 
 
 #include FT_INTERNAL_OBJECTS_H
@@ -242,7 +240,7 @@
 #define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph
 
 
-#endif /* !_STANDALONE_ */
+#endif /* !STANDALONE_ */
 
 
 #ifndef FT_MEM_SET
@@ -253,6 +251,10 @@
 #define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
 #endif
 
+#ifndef FT_ZERO
+#define FT_ZERO( p )  FT_MEM_ZERO( p, sizeof ( *(p) ) )
+#endif
+
   /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */
   /* typically a small value and the result of a*b is known to fit into */
   /* 32 bits.                                                           */
@@ -450,13 +452,21 @@
 #define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )
 #define TRUNC( x )    ( (Long)(x) >> ras.precision_bits )
 #define FRAC( x )     ( (x) & ( ras.precision - 1 ) )
-#define SCALED( x )   ( ( (Long)(x) << ras.scale_shift ) - ras.precision_half )
+#define SCALED( x )   ( ( (x) < 0 ? -( -(x) << ras.scale_shift )   \
+                                  :  (  (x) << ras.scale_shift ) ) \
+                        - ras.precision_half )
 
 #define IS_BOTTOM_OVERSHOOT( x ) \
           (Bool)( CEILING( x ) - x >= ras.precision_half )
 #define IS_TOP_OVERSHOOT( x )    \
           (Bool)( x - FLOOR( x ) >= ras.precision_half )
 
+#if FT_RENDER_POOL_SIZE > 2048
+#define FT_MAX_BLACK_POOL  ( FT_RENDER_POOL_SIZE / sizeof ( Long ) )
+#else
+#define FT_MAX_BLACK_POOL  ( 2048 / sizeof ( Long ) )
+#endif
+
   /* The most used variables are positioned at the top of the structure. */
   /* Thus, their offset can be coded with less opcodes, resulting in a   */
   /* smaller executable.                                                 */
@@ -799,15 +809,14 @@
 
     /* if it is <, simply insert it, ignore if == */
     if ( n >= 0 && y > y_turns[n] )
-      while ( n >= 0 )
+      do
       {
         Int  y2 = (Int)y_turns[n];
 
 
         y_turns[n] = y;
         y = y2;
-        n--;
-      }
+      } while ( --n >= 0 );
 
     if ( n < 0 )
     {
@@ -848,7 +857,7 @@
 
     if ( n > 1 && p )
     {
-      while ( n > 0 )
+      do
       {
         Int  bottom, top;
 
@@ -876,8 +885,7 @@
           return FAILURE;
 
         p = p->link;
-        n--;
-      }
+      } while ( --n );
     }
     else
       ras.fProfile = NULL;
@@ -1248,7 +1256,7 @@
 
     start_arc = arc;
 
-    while ( arc >= start_arc && e <= e2 )
+    do
     {
       ras.joint = FALSE;
 
@@ -1281,7 +1289,7 @@
         }
         arc -= degree;
       }
-    }
+    } while ( arc >= start_arc && e <= e2 );
 
   Fin:
     ras.top  = top;
@@ -1512,8 +1520,9 @@
         state_bez = y1 < y3 ? Ascending_State : Descending_State;
         if ( ras.state != state_bez )
         {
-          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
-                                                 : IS_TOP_OVERSHOOT( y1 );
+          Bool  o = ( state_bez == Ascending_State )
+                      ? IS_BOTTOM_OVERSHOOT( y1 )
+                      : IS_TOP_OVERSHOOT( y1 );
 
 
           /* finalize current profile if any */
@@ -1648,8 +1657,9 @@
         /* detect a change of direction */
         if ( ras.state != state_bez )
         {
-          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
-                                                 : IS_TOP_OVERSHOOT( y1 );
+          Bool  o = ( state_bez == Ascending_State )
+                      ? IS_BOTTOM_OVERSHOOT( y1 )
+                      : IS_TOP_OVERSHOOT( y1 );
 
 
           /* finalize current profile if any */
@@ -2114,7 +2124,7 @@
     while ( current )
     {
       current->X       = *current->offset;
-      current->offset += current->flags & Flow_Up ? 1 : -1;
+      current->offset += ( current->flags & Flow_Up ) ? 1 : -1;
       current->height--;
       current = current->link;
     }
@@ -2382,7 +2392,7 @@
           pxl = e2;
 
         /* check that the other pixel isn't set */
-        e1 = pxl == e1 ? e2 : e1;
+        e1 = ( pxl == e1 ) ? e2 : e1;
 
         e1 = TRUNC( e1 );
 
@@ -2583,7 +2593,7 @@
           pxl = e2;
 
         /* check that the other pixel isn't set */
-        e1 = pxl == e1 ? e2 : e1;
+        e1 = ( pxl == e1 ) ? e2 : e1;
 
         e1 = TRUNC( e1 );
 
@@ -3041,7 +3051,7 @@
   /****                         a static object.                  *****/
 
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
 
   static int
@@ -3053,7 +3063,7 @@
 
 
      *araster = (FT_Raster)&the_raster;
-     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+     FT_ZERO( &the_raster );
      ft_black_init( &the_raster );
 
      return 0;
@@ -3068,7 +3078,7 @@
   }
 
 
-#else /* !_STANDALONE_ */
+#else /* !STANDALONE_ */
 
 
   static int
@@ -3102,13 +3112,13 @@
   }
 
 
-#endif /* !_STANDALONE_ */
+#endif /* !STANDALONE_ */
 
 
   static void
-  ft_black_reset( black_PRaster  raster,
-                  char*          pool_base,
-                  Long           pool_size )
+  ft_black_reset( FT_Raster  raster,
+                  PByte      pool_base,
+                  ULong      pool_size )
   {
     FT_UNUSED( raster );
     FT_UNUSED( pool_base );
@@ -3117,20 +3127,20 @@
 
 
   static int
-  ft_black_set_mode( black_PRaster  raster,
-                     ULong          mode,
-                     const char*    palette )
+  ft_black_set_mode( FT_Raster  raster,
+                     ULong      mode,
+                     void*      args )
   {
     FT_UNUSED( raster );
     FT_UNUSED( mode );
-    FT_UNUSED( palette );
+    FT_UNUSED( args );
 
     return 0;
   }
 
 
   static int
-  ft_black_render( black_PRaster            raster,
+  ft_black_render( FT_Raster                raster,
                    const FT_Raster_Params*  params )
   {
     const FT_Outline*  outline    = (const FT_Outline*)params->source;
@@ -3138,7 +3148,7 @@
 
     black_TWorker  worker[1];
 
-    Long  buffer[FT_MAX( FT_RENDER_POOL_SIZE, 2048 ) / sizeof ( Long )];
+    Long  buffer[FT_MAX_BLACK_POOL];
 
 
     if ( !raster )
@@ -3175,6 +3185,20 @@
     if ( !target_map->buffer )
       return FT_THROW( Invalid );
 
+    /* reject too large outline coordinates */
+    {
+      FT_Vector*  vec   = outline->points;
+      FT_Vector*  limit = vec + outline->n_points;
+
+
+      for ( ; vec < limit; vec++ )
+      {
+        if ( vec->x < -0x1000000L || vec->x > 0x1000000L ||
+             vec->y < -0x1000000L || vec->y > 0x1000000L )
+         return FT_THROW( Invalid );
+      }
+    }
+
     ras.outline = *outline;
     ras.target  = *target_map;
 
@@ -3190,11 +3214,12 @@
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Raster_New_Func)     ft_black_new,
-    (FT_Raster_Reset_Func)   ft_black_reset,
-    (FT_Raster_Set_Mode_Func)ft_black_set_mode,
-    (FT_Raster_Render_Func)  ft_black_render,
-    (FT_Raster_Done_Func)    ft_black_done )
+    (FT_Raster_New_Func)     ft_black_new,       /* raster_new      */
+    (FT_Raster_Reset_Func)   ft_black_reset,     /* raster_reset    */
+    (FT_Raster_Set_Mode_Func)ft_black_set_mode,  /* raster_set_mode */
+    (FT_Raster_Render_Func)  ft_black_render,    /* raster_render   */
+    (FT_Raster_Done_Func)    ft_black_done       /* raster_done     */
+  )
 
 
 /* END */
diff --git a/src/raster/ftraster.h b/src/raster/ftraster.h
index a270d48..40b5d6d 100644
--- a/src/raster/ftraster.h
+++ b/src/raster/ftraster.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer (specification).                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTRASTER_H__
-#define __FTRASTER_H__
+#ifndef FTRASTER_H_
+#define FTRASTER_H_
 
 
 #include <ft2build.h>
@@ -33,14 +33,14 @@
   /* Uncomment the following line if you are using ftraster.c as a         */
   /* standalone module, fully independent of FreeType.                     */
   /*                                                                       */
-/* #define _STANDALONE_ */
+/* #define STANDALONE_ */
 
   FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;
 
 
 FT_END_HEADER
 
-#endif /* __FTRASTER_H__ */
+#endif /* FTRASTER_H_ */
 
 
 /* END */
diff --git a/src/raster/ftrend1.c b/src/raster/ftrend1.c
index f314392..a7ce973 100644
--- a/src/raster/ftrend1.c
+++ b/src/raster/ftrend1.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer interface (body).                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,12 +31,7 @@
   static FT_Error
   ft_raster1_init( FT_Renderer  render )
   {
-    FT_Library  library = FT_MODULE_LIBRARY( render );
-
-
-    render->clazz->raster_class->raster_reset( render->raster,
-                                               library->raster_pool,
-                                               library->raster_pool_size );
+    render->clazz->raster_class->raster_reset( render->raster, NULL, 0 );
 
     return FT_Err_Ok;
   }
@@ -88,7 +83,7 @@
                        FT_GlyphSlot  slot,
                        FT_BBox*      cbox )
   {
-    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+    FT_ZERO( cbox );
 
     if ( slot->format == render->glyph_format )
       FT_Outline_Get_CBox( &slot->outline, cbox );
@@ -102,12 +97,12 @@
                      FT_Render_Mode    mode,
                      const FT_Vector*  origin )
   {
-    FT_Error     error;
-    FT_Outline*  outline;
-    FT_BBox      cbox, cbox0;
-    FT_UInt      width, height, pitch;
-    FT_Bitmap*   bitmap;
-    FT_Memory    memory;
+    FT_Error     error   = FT_Err_Ok;
+    FT_Outline*  outline = &slot->outline;
+    FT_Bitmap*   bitmap  = &slot->bitmap;
+    FT_Memory    memory  = render->root.memory;
+    FT_Pos       x_shift = 0;
+    FT_Pos       y_shift = 0;
 
     FT_Raster_Params  params;
 
@@ -126,60 +121,6 @@
       return FT_THROW( Cannot_Render_Glyph );
     }
 
-    outline = &slot->outline;
-
-    /* translate the outline to the new origin if needed */
-    if ( origin )
-      FT_Outline_Translate( outline, origin->x, origin->y );
-
-    /* compute the control box, and grid fit it */
-    FT_Outline_Get_CBox( outline, &cbox0 );
-
-    /* undocumented but confirmed: bbox values get rounded */
-#if 1
-    cbox.xMin = FT_PIX_ROUND( cbox0.xMin );
-    cbox.yMin = FT_PIX_ROUND( cbox0.yMin );
-    cbox.xMax = FT_PIX_ROUND( cbox0.xMax );
-    cbox.yMax = FT_PIX_ROUND( cbox0.yMax );
-#else
-    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
-    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
-    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
-    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
-#endif
-
-    /* If either `width' or `height' round to 0, try    */
-    /* explicitly rounding up/down.  In the case of     */
-    /* glyphs containing only one very narrow feature,  */
-    /* this gives the drop-out compensation in the scan */
-    /* conversion code a chance to do its stuff.        */
-    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
-    if ( width == 0 )
-    {
-      cbox.xMin = FT_PIX_FLOOR( cbox0.xMin );
-      cbox.xMax = FT_PIX_CEIL( cbox0.xMax );
-
-      width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
-    }
-
-    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
-    if ( height == 0 )
-    {
-      cbox.yMin = FT_PIX_FLOOR( cbox0.yMin );
-      cbox.yMax = FT_PIX_CEIL( cbox0.yMax );
-
-      height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
-    }
-
-    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    bitmap = &slot->bitmap;
-    memory = render->root.memory;
-
     /* release old bitmap buffer */
     if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
@@ -187,44 +128,54 @@
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
-    pitch              = ( ( width + 15 ) >> 4 ) << 1;
-    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+    ft_glyphslot_preset_bitmap( slot, mode, origin );
 
-    bitmap->width = width;
-    bitmap->rows  = height;
-    bitmap->pitch = (int)pitch;
-
-    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+    /* allocate new one */
+    if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) )
       goto Exit;
 
     slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
 
+    x_shift = -slot->bitmap_left * 64;
+    y_shift = ( (FT_Int)bitmap->rows - slot->bitmap_top ) * 64;
+
+    if ( origin )
+    {
+      x_shift += origin->x;
+      y_shift += origin->y;
+    }
+
     /* translate outline to render it into the bitmap */
-    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, x_shift, y_shift );
 
     /* set up parameters */
     params.target = bitmap;
     params.source = outline;
-    params.flags  = 0;
+    params.flags  = FT_RASTER_FLAG_DEFAULT;
 
     /* render outline into the bitmap */
     error = render->raster_render( render->raster, &params );
 
-    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
-
-    if ( error )
-      goto Exit;
-
-    slot->format      = FT_GLYPH_FORMAT_BITMAP;
-    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
-    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );
-
   Exit:
+    if ( !error )
+      /* everything is fine; the glyph is now officially a bitmap */
+      slot->format = FT_GLYPH_FORMAT_BITMAP;
+    else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, -x_shift, -y_shift );
+
     return error;
   }
 
 
-  FT_DEFINE_RENDERER( ft_raster1_renderer_class,
+  FT_DEFINE_RENDERER(
+    ft_raster1_renderer_class,
 
       FT_MODULE_RENDERER,
       sizeof ( FT_RendererRec ),
@@ -233,21 +184,20 @@
       0x10000L,
       0x20000L,
 
-      0,    /* module specific interface */
+      NULL,    /* module specific interface */
 
-      (FT_Module_Constructor)ft_raster1_init,
-      (FT_Module_Destructor) 0,
-      (FT_Module_Requester)  0
-    ,
+      (FT_Module_Constructor)ft_raster1_init,  /* module_init   */
+      (FT_Module_Destructor) NULL,             /* module_done   */
+      (FT_Module_Requester)  NULL,             /* get_interface */
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Renderer_RenderFunc)   ft_raster1_render,
-    (FT_Renderer_TransformFunc)ft_raster1_transform,
-    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,
-    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,
+    (FT_Renderer_RenderFunc)   ft_raster1_render,     /* render_glyph    */
+    (FT_Renderer_TransformFunc)ft_raster1_transform,  /* transform_glyph */
+    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,   /* get_glyph_cbox  */
+    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,   /* set_mode        */
 
-    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET
+    (FT_Raster_Funcs*)&FT_STANDARD_RASTER_GET         /* raster_class    */
   )
 
 
diff --git a/src/raster/ftrend1.h b/src/raster/ftrend1.h
index c367260..2abdf2d 100644
--- a/src/raster/ftrend1.h
+++ b/src/raster/ftrend1.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer interface (specification).             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTREND1_H__
-#define __FTREND1_H__
+#ifndef FTREND1_H_
+#define FTREND1_H_
 
 
 #include <ft2build.h>
@@ -29,16 +29,10 @@
 
   FT_DECLARE_RENDERER( ft_raster1_renderer_class )
 
-  /* this renderer is _NOT_ part of the default modules, you'll need */
-  /* to register it by hand in your application.  It should only be  */
-  /* used for backwards-compatibility with FT 1.x anyway.            */
-  /*                                                                 */
-  FT_DECLARE_RENDERER( ft_raster5_renderer_class )
-
 
 FT_END_HEADER
 
-#endif /* __FTREND1_H__ */
+#endif /* FTREND1_H_ */
 
 
 /* END */
diff --git a/src/raster/module.mk b/src/raster/module.mk
index 75ea107..b115f41 100644
--- a/src/raster/module.mk
+++ b/src/raster/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/raster/raster.c b/src/raster/raster.c
index 21bb16d..76edd21 100644
--- a/src/raster/raster.c
+++ b/src/raster/raster.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType monochrome rasterer module component (body only).           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,11 +17,11 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "rastpic.c"
+
 #include "ftraster.c"
 #include "ftrend1.c"
+#include "rastpic.c"
 
 
 /* END */
diff --git a/src/raster/rasterrs.h b/src/raster/rasterrs.h
index e7f00bc..22a3e15 100644
--- a/src/raster/rasterrs.h
+++ b/src/raster/rasterrs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    monochrome renderer error codes (specification only).                */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __RASTERRS_H__
-#define __RASTERRS_H__
+#ifndef RASTERRS_H_
+#define RASTERRS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  Raster_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __RASTERRS_H__ */
+#endif /* RASTERRS_H_ */
 
 
 /* END */
diff --git a/src/raster/rastpic.c b/src/raster/rastpic.c
index fe58c99..1dc8981 100644
--- a/src/raster/rastpic.c
+++ b/src/raster/rastpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for raster module.   */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -59,8 +59,9 @@
     FT_Memory          memory        = library->memory;
 
 
-    /* since this function also serves raster5 renderer, */
-    /* it implements reference counting                  */
+    /* XXX: since this function also served the no longer available  */
+    /*      raster5 renderer it uses reference counting, which could */
+    /*      be removed now                                           */
     if ( pic_container->raster )
     {
       ((RasterPIC*)pic_container->raster)->ref_count++;
@@ -82,21 +83,6 @@
     return error;
   }
 
-
-  /* re-route these init and free functions to the above functions */
-  FT_Error
-  ft_raster5_renderer_class_pic_init( FT_Library  library )
-  {
-    return ft_raster1_renderer_class_pic_init( library );
-  }
-
-
-  void
-  ft_raster5_renderer_class_pic_free( FT_Library  library )
-  {
-    ft_raster1_renderer_class_pic_free( library );
-  }
-
 #endif /* FT_CONFIG_OPTION_PIC */
 
 
diff --git a/src/raster/rastpic.h b/src/raster/rastpic.h
index a875884..6d0877c 100644
--- a/src/raster/rastpic.h
+++ b/src/raster/rastpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for raster module.   */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,15 +16,15 @@
 /***************************************************************************/
 
 
-#ifndef __RASTPIC_H__
-#define __RASTPIC_H__
+#ifndef RASTPIC_H_
+#define RASTPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
 
+FT_BEGIN_HEADER
+
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define FT_STANDARD_RASTER_GET  ft_standard_raster
@@ -48,22 +48,16 @@
   void
   ft_raster1_renderer_class_pic_free( FT_Library  library );
 
-  void
-  ft_raster5_renderer_class_pic_free( FT_Library  library );
-
   FT_Error
   ft_raster1_renderer_class_pic_init( FT_Library  library );
 
-  FT_Error
-  ft_raster5_renderer_class_pic_init( FT_Library  library );
-
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
 FT_END_HEADER
 
-#endif /* __RASTPIC_H__ */
+#endif /* RASTPIC_H_ */
 
 
 /* END */
diff --git a/src/raster/rules.mk b/src/raster/rules.mk
index c214b35..9aef1f0 100644
--- a/src/raster/rules.mk
+++ b/src/raster/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/sfnt/Jamfile b/src/sfnt/Jamfile
index 73c6e15..57977fc 100644
--- a/src/sfnt/Jamfile
+++ b/src/sfnt/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/sfnt Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,18 @@
 
   if $(FT2_MULTI)
   {
-    _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;
+    _sources = pngshim
+               sfdriver
+               sfntpic
+               sfobjs
+               ttbdf
+               ttcmap
+               ttkern
+               ttload
+               ttmtx
+               ttpost
+               ttsbit
+               ;
   }
   else
   {
diff --git a/src/sfnt/module.mk b/src/sfnt/module.mk
index 535fe22..51ca67e 100644
--- a/src/sfnt/module.mk
+++ b/src/sfnt/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/sfnt/pngshim.c b/src/sfnt/pngshim.c
index ea60452..1602026 100644
--- a/src/sfnt/pngshim.c
+++ b/src/sfnt/pngshim.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PNG Bitmap glyph support.                                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  Google, Inc.                                                           */
 /*  Written by Stuart Gill and Behdad Esfahbod.                            */
 /*                                                                         */
@@ -24,9 +24,10 @@
 #include FT_CONFIG_STANDARD_LIBRARY_H
 
 
-#ifdef FT_CONFIG_OPTION_USE_PNG
+#if defined( TT_CONFIG_OPTION_EMBEDDED_BITMAPS ) && \
+    defined( FT_CONFIG_OPTION_USE_PNG )
 
-  /* We always include <stjmp.h>, so make libpng shut up! */
+  /* We always include <setjmp.h>, so make libpng shut up! */
 #define PNG_SKIP_SETJMP_CHECK 1
 #include <png.h>
 #include "pngshim.h"
@@ -48,18 +49,85 @@
   }
 
 
-  /* Premultiplies data and converts RGBA bytes => native endian. */
+  /* Premultiplies data and converts RGBA bytes => BGRA. */
   static void
   premultiply_data( png_structp    png,
                     png_row_infop  row_info,
                     png_bytep      data )
   {
-    unsigned int  i;
+    unsigned int  i = 0, limit;
+
+    /* The `vector_size' attribute was introduced in gcc 3.1, which */
+    /* predates clang; the `__BYTE_ORDER__' preprocessor symbol was */
+    /* introduced in gcc 4.6 and clang 3.2, respectively.           */
+    /* `__builtin_shuffle' for gcc was introduced in gcc 4.7.0.     */
+#if ( ( defined( __GNUC__ )                                &&             \
+        ( ( __GNUC__ >= 5 )                              ||               \
+        ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ >= 7 ) ) ) )         ||   \
+      ( defined( __clang__ )                                       &&     \
+        ( ( __clang_major__ >= 4 )                               ||       \
+        ( ( __clang_major__ == 3 ) && ( __clang_minor__ >= 2 ) ) ) ) ) && \
+    defined( __OPTIMIZE__ )                                            && \
+    __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+
+#ifdef __clang__
+    /* the clang documentation doesn't cover the two-argument case of */
+    /* `__builtin_shufflevector'; however, it is is implemented since */
+    /* version 2.8                                                    */
+#define vector_shuffle  __builtin_shufflevector
+#else
+#define vector_shuffle  __builtin_shuffle
+#endif
+
+    typedef unsigned short  v82 __attribute__(( vector_size( 16 ) ));
+
+
+    if ( row_info->rowbytes > 15 )
+    {
+      /* process blocks of 16 bytes in one rush, which gives a nice speed-up */
+      limit = row_info->rowbytes - 16 + 1;
+      for ( ; i < limit; i += 16 )
+      {
+        unsigned char*  base = &data[i];
+
+        v82  s, s0, s1, a;
+
+        /* clang <= 3.9 can't apply scalar values to vectors */
+        /* (or rather, it needs a different syntax)          */
+        v82  n0x80 = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+        v82  n0xFF = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+        v82  n8    = { 8, 8, 8, 8, 8, 8, 8, 8 };
+
+        v82  ma = { 1, 1, 3, 3, 5, 5, 7, 7 };
+        v82  o1 = { 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF };
+        v82  m0 = { 1, 0, 3, 2, 5, 4, 7, 6 };
+
+
+        ft_memcpy( &s, base, 16 );            /* RGBA RGBA RGBA RGBA */
+        s0 = s & n0xFF;                       /*  R B  R B  R B  R B */
+        s1 = s >> n8;                         /*  G A  G A  G A  G A */
+
+        a   = vector_shuffle( s1, ma );       /*  A A  A A  A A  A A */
+        s1 |= o1;                             /*  G 1  G 1  G 1  G 1 */
+        s0  = vector_shuffle( s0, m0 );       /*  B R  B R  B R  B R */
+
+        s0 *= a;
+        s1 *= a;
+        s0 += n0x80;
+        s1 += n0x80;
+        s0  = ( s0 + ( s0 >> n8 ) ) >> n8;
+        s1  = ( s1 + ( s1 >> n8 ) ) >> n8;
+
+        s = s0 | ( s1 << n8 );
+        ft_memcpy( base, &s, 16 );
+      }
+    }
+#endif /* use `vector_size' */
 
     FT_UNUSED( png );
 
-
-    for ( i = 0; i < row_info->rowbytes; i += 4 )
+    limit = row_info->rowbytes;
+    for ( ; i < limit; i += 4 )
     {
       unsigned char*  base  = &data[i];
       unsigned int    alpha = base[3];
@@ -169,7 +237,7 @@
       return;
     }
 
-    memcpy( data, stream->cursor, length );
+    ft_memcpy( data, stream->cursor, length );
 
     FT_FRAME_EXIT();
   }
@@ -184,7 +252,8 @@
                  FT_Memory        memory,
                  FT_Byte*         data,
                  FT_UInt          png_len,
-                 FT_Bool          populate_map_and_metrics )
+                 FT_Bool          populate_map_and_metrics,
+                 FT_Bool          metrics_only )
   {
     FT_Bitmap    *map   = &slot->bitmap;
     FT_Error      error = FT_Err_Ok;
@@ -258,9 +327,6 @@
 
     if ( populate_map_and_metrics )
     {
-      FT_ULong  size;
-
-
       metrics->width  = (FT_UShort)imgWidth;
       metrics->height = (FT_UShort)imgHeight;
 
@@ -276,13 +342,6 @@
         error = FT_THROW( Array_Too_Large );
         goto DestroyExit;
       }
-
-      /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */
-      size = map->rows * (FT_ULong)map->pitch;
-
-      error = ft_glyphslot_alloc_bitmap( slot, size );
-      if ( error )
-        goto DestroyExit;
     }
 
     /* convert palette/gray image to rgb */
@@ -334,6 +393,9 @@
       goto DestroyExit;
     }
 
+    if ( metrics_only )
+      goto DestroyExit;
+
     switch ( color_type )
     {
     default:
@@ -349,6 +411,17 @@
       break;
     }
 
+    if ( populate_map_and_metrics )
+    {
+      /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */
+      FT_ULong  size = map->rows * (FT_ULong)map->pitch;
+
+
+      error = ft_glyphslot_alloc_bitmap( slot, size );
+      if ( error )
+        goto DestroyExit;
+    }
+
     if ( FT_NEW_ARRAY( rows, imgHeight ) )
     {
       error = FT_THROW( Out_Of_Memory );
@@ -372,7 +445,12 @@
     return error;
   }
 
-#endif /* FT_CONFIG_OPTION_USE_PNG */
+#else /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _pngshim_dummy;
+
+#endif /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */
 
 
 /* END */
diff --git a/src/sfnt/pngshim.h b/src/sfnt/pngshim.h
index 4cc5c2b..194238c 100644
--- a/src/sfnt/pngshim.h
+++ b/src/sfnt/pngshim.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PNG Bitmap glyph support.                                            */
 /*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  Google, Inc.                                                           */
 /*  Written by Stuart Gill and Behdad Esfahbod.                            */
 /*                                                                         */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __PNGSHIM_H__
-#define __PNGSHIM_H__
+#ifndef PNGSHIM_H_
+#define PNGSHIM_H_
 
 
 #include <ft2build.h>
@@ -38,13 +38,14 @@
                  FT_Memory        memory,
                  FT_Byte*         data,
                  FT_UInt          png_len,
-                 FT_Bool          populate_map_and_metrics );
+                 FT_Bool          populate_map_and_metrics,
+                 FT_Bool          metrics_only );
 
 #endif
 
 FT_END_HEADER
 
-#endif /* __PNGSHIM_H__ */
+#endif /* PNGSHIM_H_ */
 
 
 /* END */
diff --git a/src/sfnt/rules.mk b/src/sfnt/rules.mk
index 3cc76b3..83acc66 100644
--- a/src/sfnt/rules.mk
+++ b/src/sfnt/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c
index 0948ad4..303e1ca 100644
--- a/src/sfnt/sfdriver.c
+++ b/src/sfnt/sfdriver.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level SFNT driver interface (body).                             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,7 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_SFNT_H
 #include FT_INTERNAL_OBJECTS_H
+#include FT_TRUETYPE_IDS_H
 
 #include "sfdriver.h"
 #include "ttload.h"
@@ -50,6 +51,11 @@
 #include FT_SERVICE_SFNT_H
 #include FT_SERVICE_TT_CMAP_H
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#endif
+
 
   /*************************************************************************/
   /*                                                                       */
@@ -88,7 +94,7 @@
       break;
 
     case FT_SFNT_OS2:
-      table = face->os2.version == 0xFFFFU ? NULL : &face->os2;
+      table = ( face->os2.version == 0xFFFFU ) ? NULL : &face->os2;
       break;
 
     case FT_SFNT_POST:
@@ -139,9 +145,11 @@
 
   FT_DEFINE_SERVICE_SFNT_TABLEREC(
     sfnt_service_sfnt_table,
-    (FT_SFNT_TableLoadFunc)tt_face_load_any,
-    (FT_SFNT_TableGetFunc) get_sfnt_table,
-    (FT_SFNT_TableInfoFunc)sfnt_table_info )
+
+    (FT_SFNT_TableLoadFunc)tt_face_load_any,     /* load_table */
+    (FT_SFNT_TableGetFunc) get_sfnt_table,       /* get_table  */
+    (FT_SFNT_TableInfoFunc)sfnt_table_info       /* table_info */
+  )
 
 
 #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
@@ -152,7 +160,7 @@
    */
 
   static FT_Error
-  sfnt_get_glyph_name( TT_Face     face,
+  sfnt_get_glyph_name( FT_Face     face,
                        FT_UInt     glyph_index,
                        FT_Pointer  buffer,
                        FT_UInt     buffer_max )
@@ -161,7 +169,7 @@
     FT_Error    error;
 
 
-    error = tt_face_get_ps_name( face, glyph_index, &gname );
+    error = tt_face_get_ps_name( (TT_Face)face, glyph_index, &gname );
     if ( !error )
       FT_STRCPYN( buffer, gname, buffer_max );
 
@@ -170,26 +178,26 @@
 
 
   static FT_UInt
-  sfnt_get_name_index( TT_Face     face,
+  sfnt_get_name_index( FT_Face     face,
                        FT_String*  glyph_name )
   {
-    FT_Face  root = &face->root;
+    TT_Face  ttface = (TT_Face)face;
 
     FT_UInt  i, max_gid = FT_UINT_MAX;
 
 
-    if ( root->num_glyphs < 0 )
+    if ( face->num_glyphs < 0 )
       return 0;
-    else if ( (FT_ULong)root->num_glyphs < FT_UINT_MAX )
-      max_gid = (FT_UInt)root->num_glyphs;
+    else if ( (FT_ULong)face->num_glyphs < FT_UINT_MAX )
+      max_gid = (FT_UInt)face->num_glyphs;
     else
       FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
-                  FT_UINT_MAX, root->num_glyphs ));
+                  FT_UINT_MAX, face->num_glyphs ));
 
     for ( i = 0; i < max_gid; i++ )
     {
       FT_String*  gname;
-      FT_Error    error = tt_face_get_ps_name( face, i, &gname );
+      FT_Error    error = tt_face_get_ps_name( ttface, i, &gname );
 
 
       if ( error )
@@ -205,9 +213,10 @@
 
   FT_DEFINE_SERVICE_GLYPHDICTREC(
     sfnt_service_glyph_dict,
-    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,
-    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index )
 
+    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,    /* get_name   */
+    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index     /* name_index */
+  )
 
 #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
 
@@ -217,120 +226,850 @@
    *
    */
 
-  static const char*
-  sfnt_get_ps_name( TT_Face  face )
+  /* an array representing allowed ASCII characters in a PS string */
+  static const unsigned char sfnt_ps_map[16] =
   {
-    FT_Int       n, found_win, found_apple;
-    const char*  result = NULL;
+                /*             4        0        C        8 */
+    0x00, 0x00, /* 0x00: 0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0 */
+    0x00, 0x00, /* 0x10: 0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0 */
+    0xDE, 0x7C, /* 0x20: 1 1 0 1  1 1 1 0  0 1 1 1  1 1 0 0 */
+    0xFF, 0xAF, /* 0x30: 1 1 1 1  1 1 1 1  1 0 1 0  1 1 1 1 */
+    0xFF, 0xFF, /* 0x40: 1 1 1 1  1 1 1 1  1 1 1 1  1 1 1 1 */
+    0xFF, 0xD7, /* 0x50: 1 1 1 1  1 1 1 1  1 1 0 1  0 1 1 1 */
+    0xFF, 0xFF, /* 0x60: 1 1 1 1  1 1 1 1  1 1 1 1  1 1 1 1 */
+    0xFF, 0x57  /* 0x70: 1 1 1 1  1 1 1 1  0 1 0 1  0 1 1 1 */
+  };
 
 
-    /* shouldn't happen, but just in case to avoid memory leaks */
-    if ( face->postscript_name )
-      return face->postscript_name;
+  static int
+  sfnt_is_postscript( int  c )
+  {
+    unsigned int  cc;
 
-    /* scan the name table to see whether we have a Postscript name here, */
-    /* either in Macintosh or Windows platform encodings                  */
-    found_win   = -1;
-    found_apple = -1;
+
+    if ( c < 0 || c >= 0x80 )
+      return 0;
+
+    cc = (unsigned int)c;
+
+    return sfnt_ps_map[cc >> 3] & ( 1 << ( cc & 0x07 ) );
+  }
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+  /* Only ASCII letters and digits are taken for a variation font */
+  /* instance's PostScript name.                                  */
+  /*                                                              */
+  /* `ft_isalnum' is a macro, but we need a function here, thus   */
+  /* this definition.                                             */
+  static int
+  sfnt_is_alphanumeric( int  c )
+  {
+    return ft_isalnum( c );
+  }
+
+
+  /* the implementation of MurmurHash3 is taken and adapted from          */
+  /* https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */
+
+#define ROTL32( x, r )  ( x << r ) | ( x >> ( 32 - r ) )
+
+
+  static FT_UInt32
+  fmix32( FT_UInt32  h )
+  {
+    h ^= h >> 16;
+    h *= 0x85ebca6b;
+    h ^= h >> 13;
+    h *= 0xc2b2ae35;
+    h ^= h >> 16;
+
+    return h;
+  }
+
+
+  static void
+  murmur_hash_3_128( const void*         key,
+                     const unsigned int  len,
+                     FT_UInt32           seed,
+                     void*               out )
+  {
+    const FT_Byte*  data    = (const FT_Byte*)key;
+    const int       nblocks = (int)len / 16;
+
+    FT_UInt32  h1 = seed;
+    FT_UInt32  h2 = seed;
+    FT_UInt32  h3 = seed;
+    FT_UInt32  h4 = seed;
+
+    const FT_UInt32  c1 = 0x239b961b;
+    const FT_UInt32  c2 = 0xab0e9789;
+    const FT_UInt32  c3 = 0x38b34ae5;
+    const FT_UInt32  c4 = 0xa1e38b93;
+
+    const FT_UInt32*  blocks = (const FT_UInt32*)( data + nblocks * 16 );
+
+    int  i;
+
+
+    for( i = -nblocks; i; i++ )
+    {
+      FT_UInt32  k1 = blocks[i * 4 + 0];
+      FT_UInt32  k2 = blocks[i * 4 + 1];
+      FT_UInt32  k3 = blocks[i * 4 + 2];
+      FT_UInt32  k4 = blocks[i * 4 + 3];
+
+
+      k1 *= c1;
+      k1  = ROTL32( k1, 15 );
+      k1 *= c2;
+      h1 ^= k1;
+
+      h1  = ROTL32( h1, 19 );
+      h1 += h2;
+      h1  = h1 * 5 + 0x561ccd1b;
+
+      k2 *= c2;
+      k2  = ROTL32( k2, 16 );
+      k2 *= c3;
+      h2 ^= k2;
+
+      h2  = ROTL32( h2, 17 );
+      h2 += h3;
+      h2  = h2 * 5 + 0x0bcaa747;
+
+      k3 *= c3;
+      k3  = ROTL32( k3, 17 );
+      k3 *= c4;
+      h3 ^= k3;
+
+      h3  = ROTL32( h3, 15 );
+      h3 += h4;
+      h3  = h3 * 5 + 0x96cd1c35;
+
+      k4 *= c4;
+      k4  = ROTL32( k4, 18 );
+      k4 *= c1;
+      h4 ^= k4;
+
+      h4  = ROTL32( h4, 13 );
+      h4 += h1;
+      h4  = h4 * 5 + 0x32ac3b17;
+    }
+
+    {
+      const FT_Byte*  tail = (const FT_Byte*)( data + nblocks * 16 );
+
+      FT_UInt32  k1 = 0;
+      FT_UInt32  k2 = 0;
+      FT_UInt32  k3 = 0;
+      FT_UInt32  k4 = 0;
+
+
+      switch ( len & 15 )
+      {
+      case 15:
+        k4 ^= (FT_UInt32)tail[14] << 16;
+      case 14:
+        k4 ^= (FT_UInt32)tail[13] << 8;
+      case 13:
+        k4 ^= (FT_UInt32)tail[12];
+        k4 *= c4;
+        k4  = ROTL32( k4, 18 );
+        k4 *= c1;
+        h4 ^= k4;
+
+      case 12:
+        k3 ^= (FT_UInt32)tail[11] << 24;
+      case 11:
+        k3 ^= (FT_UInt32)tail[10] << 16;
+      case 10:
+        k3 ^= (FT_UInt32)tail[9] << 8;
+      case 9:
+        k3 ^= (FT_UInt32)tail[8];
+        k3 *= c3;
+        k3  = ROTL32( k3, 17 );
+        k3 *= c4;
+        h3 ^= k3;
+
+      case 8:
+        k2 ^= (FT_UInt32)tail[7] << 24;
+      case 7:
+        k2 ^= (FT_UInt32)tail[6] << 16;
+      case 6:
+        k2 ^= (FT_UInt32)tail[5] << 8;
+      case 5:
+        k2 ^= (FT_UInt32)tail[4];
+        k2 *= c2;
+        k2  = ROTL32( k2, 16 );
+        k2 *= c3;
+        h2 ^= k2;
+
+      case 4:
+        k1 ^= (FT_UInt32)tail[3] << 24;
+      case 3:
+        k1 ^= (FT_UInt32)tail[2] << 16;
+      case 2:
+        k1 ^= (FT_UInt32)tail[1] << 8;
+      case 1:
+        k1 ^= (FT_UInt32)tail[0];
+        k1 *= c1;
+        k1  = ROTL32( k1, 15 );
+        k1 *= c2;
+        h1 ^= k1;
+      }
+    }
+
+    h1 ^= len;
+    h2 ^= len;
+    h3 ^= len;
+    h4 ^= len;
+
+    h1 += h2;
+    h1 += h3;
+    h1 += h4;
+
+    h2 += h1;
+    h3 += h1;
+    h4 += h1;
+
+    h1 = fmix32( h1 );
+    h2 = fmix32( h2 );
+    h3 = fmix32( h3 );
+    h4 = fmix32( h4 );
+
+    h1 += h2;
+    h1 += h3;
+    h1 += h4;
+
+    h2 += h1;
+    h3 += h1;
+    h4 += h1;
+
+    ((FT_UInt32*)out)[0] = h1;
+    ((FT_UInt32*)out)[1] = h2;
+    ((FT_UInt32*)out)[2] = h3;
+    ((FT_UInt32*)out)[3] = h4;
+  }
+
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+  typedef int (*char_type_func)( int  c );
+
+
+  /* handling of PID/EID 3/0 and 3/1 is the same */
+#define IS_WIN( n )  ( (n)->platformID == 3                             && \
+                       ( (n)->encodingID == 1 || (n)->encodingID == 0 ) && \
+                       (n)->languageID == 0x409                         )
+
+#define IS_APPLE( n )  ( (n)->platformID == 1 && \
+                         (n)->encodingID == 0 && \
+                         (n)->languageID == 0 )
+
+  static char*
+  get_win_string( FT_Memory       memory,
+                  FT_Stream       stream,
+                  TT_Name         entry,
+                  char_type_func  char_type,
+                  FT_Bool         report_invalid_characters )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+    char*       result = NULL;
+    FT_String*  r;
+    FT_Char*    p;
+    FT_UInt     len;
+
+    FT_UNUSED( error );
+
+
+    if ( FT_ALLOC( result, entry->stringLength / 2 + 1 ) )
+      return NULL;
+
+    if ( FT_STREAM_SEEK( entry->stringOffset ) ||
+         FT_FRAME_ENTER( entry->stringLength ) )
+    {
+      FT_FREE( result );
+      entry->stringLength = 0;
+      entry->stringOffset = 0;
+      FT_FREE( entry->string );
+
+      return NULL;
+    }
+
+    r = (FT_String*)result;
+    p = (FT_Char*)stream->cursor;
+
+    for ( len = entry->stringLength / 2; len > 0; len--, p += 2 )
+    {
+      if ( p[0] == 0 )
+      {
+        if ( char_type( p[1] ) )
+          *r++ = p[1];
+        else
+        {
+          if ( report_invalid_characters )
+          {
+            FT_TRACE0(( "get_win_string:"
+                        " Character `%c' (0x%X) invalid in PS name string\n",
+                        p[1], p[1] ));
+            /* it's not the job of FreeType to correct PS names... */
+            *r++ = p[1];
+          }
+        }
+      }
+    }
+    *r = '\0';
+
+    FT_FRAME_EXIT();
+
+    return result;
+  }
+
+
+  static char*
+  get_apple_string( FT_Memory       memory,
+                    FT_Stream       stream,
+                    TT_Name         entry,
+                    char_type_func  char_type,
+                    FT_Bool         report_invalid_characters )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+    char*       result = NULL;
+    FT_String*  r;
+    FT_Char*    p;
+    FT_UInt     len;
+
+    FT_UNUSED( error );
+
+
+    if ( FT_ALLOC( result, entry->stringLength + 1 ) )
+      return NULL;
+
+    if ( FT_STREAM_SEEK( entry->stringOffset ) ||
+         FT_FRAME_ENTER( entry->stringLength ) )
+    {
+      FT_FREE( result );
+      entry->stringOffset = 0;
+      entry->stringLength = 0;
+      FT_FREE( entry->string );
+
+      return NULL;
+    }
+
+    r = (FT_String*)result;
+    p = (FT_Char*)stream->cursor;
+
+    for ( len = entry->stringLength; len > 0; len--, p++ )
+    {
+      if ( char_type( *p ) )
+        *r++ = *p;
+      else
+      {
+        if ( report_invalid_characters )
+        {
+          FT_TRACE0(( "get_apple_string:"
+                      " Character `%c' (0x%X) invalid in PS name string\n",
+                      *p, *p ));
+          /* it's not the job of FreeType to correct PS names... */
+          *r++ = *p;
+        }
+      }
+    }
+    *r = '\0';
+
+    FT_FRAME_EXIT();
+
+    return result;
+  }
+
+
+  static FT_Bool
+  sfnt_get_name_id( TT_Face    face,
+                    FT_UShort  id,
+                    FT_Int    *win,
+                    FT_Int    *apple )
+  {
+    FT_Int  n;
+
+
+    *win   = -1;
+    *apple = -1;
 
     for ( n = 0; n < face->num_names; n++ )
     {
-      TT_NameEntryRec*  name = face->name_table.names + n;
+      TT_Name  name = face->name_table.names + n;
 
 
-      if ( name->nameID == 6 && name->stringLength > 0 )
+      if ( name->nameID == id && name->stringLength > 0 )
       {
-        if ( name->platformID == 3     &&
-             name->encodingID == 1     &&
-             name->languageID == 0x409 )
-          found_win = n;
+        if ( IS_WIN( name ) )
+          *win = n;
 
-        if ( name->platformID == 1 &&
-             name->encodingID == 0 &&
-             name->languageID == 0 )
-          found_apple = n;
+        if ( IS_APPLE( name ) )
+          *apple = n;
       }
     }
 
-    if ( found_win != -1 )
+    return ( *win >= 0 ) || ( *apple >= 0 );
+  }
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+  /*
+      The maximum length of an axis value descriptor.
+
+      We need 65536 different values for the decimal fraction; this fits
+      nicely into five decimal places.  Consequently, it consists of
+
+        . the minus sign if the number is negative,
+        . up to five characters for the digits before the decimal point,
+        . the decimal point if there is a fractional part, and
+        . up to five characters for the digits after the decimal point.
+
+      We also need one byte for the leading `_' character and up to four
+      bytes for the axis tag.
+   */
+#define MAX_VALUE_DESCRIPTOR_LEN  ( 1 + 5 + 1 + 5 + 1 + 4 )
+
+
+  /* the maximum length of PostScript font names */
+#define MAX_PS_NAME_LEN  127
+
+
+  /*
+   *  Find the shortest decimal representation of a 16.16 fixed point
+   *  number.  The function fills `buf' with the result, returning a pointer
+   *  to the position after the representation's last byte.
+   */
+
+  static char*
+  fixed2float( FT_Int  fixed,
+               char*   buf )
+  {
+    char*  p;
+    char*  q;
+    char   tmp[5];
+
+    FT_Int  int_part;
+    FT_Int  frac_part;
+
+    FT_Int  i;
+
+
+    p = buf;
+
+    if ( fixed == 0 )
     {
-      FT_Memory         memory = face->root.memory;
-      TT_NameEntryRec*  name   = face->name_table.names + found_win;
-      FT_UInt           len    = name->stringLength / 2;
-      FT_Error          error  = FT_Err_Ok;
-
-      FT_UNUSED( error );
-
-
-      if ( !FT_ALLOC( result, name->stringLength + 1 ) )
-      {
-        FT_Stream   stream = face->name_table.stream;
-        FT_String*  r      = (FT_String*)result;
-        FT_Char*    p;
-
-
-        if ( FT_STREAM_SEEK( name->stringOffset ) ||
-             FT_FRAME_ENTER( name->stringLength ) )
-        {
-          FT_FREE( result );
-          name->stringLength = 0;
-          name->stringOffset = 0;
-          FT_FREE( name->string );
-
-          goto Exit;
-        }
-
-        p = (FT_Char*)stream->cursor;
-
-        for ( ; len > 0; len--, p += 2 )
-        {
-          if ( p[0] == 0 && p[1] >= 32 )
-            *r++ = p[1];
-        }
-        *r = '\0';
-
-        FT_FRAME_EXIT();
-      }
-      goto Exit;
+      *p++ = '0';
+      return p;
     }
 
-    if ( found_apple != -1 )
+    if ( fixed < 0 )
     {
-      FT_Memory         memory = face->root.memory;
-      TT_NameEntryRec*  name   = face->name_table.names + found_apple;
-      FT_UInt           len    = name->stringLength;
-      FT_Error          error  = FT_Err_Ok;
+      *p++ = '-';
+      fixed = -fixed;
+    }
 
-      FT_UNUSED( error );
+    int_part  = ( fixed >> 16 ) & 0xFFFF;
+    frac_part = fixed & 0xFFFF;
+
+    /* get digits of integer part (in reverse order) */
+    q = tmp;
+    while ( int_part > 0 )
+    {
+      *q++      = '0' + int_part % 10;
+      int_part /= 10;
+    }
+
+    /* copy digits in correct order to buffer */
+    while ( q > tmp )
+      *p++ = *--q;
+
+    if ( !frac_part )
+      return p;
+
+    /* save position of point */
+    q    = p;
+    *p++ = '.';
+
+    /* apply rounding */
+    frac_part = frac_part * 10 + 5;
+
+    /* get digits of fractional part */
+    for ( i = 0; i < 5; i++ )
+    {
+      *p++ = '0' + (char)( frac_part / 0x10000L );
+
+      frac_part %= 0x10000L;
+      if ( !frac_part )
+        break;
+
+      frac_part *= 10;
+    }
+
+    /*
+        If the remainder stored in `frac_part' (after the last FOR loop) is
+        smaller than 34480*10, the resulting decimal value minus 0.00001 is
+        an equivalent representation of `fixed'.
+
+        The above FOR loop always finds the larger of the two values; I
+        verified this by iterating over all possible fixed point numbers.
+
+        If the remainder is 17232*10, both values are equally good, and we
+        take the next even number (following IEEE 754's `round to nearest,
+        ties to even' rounding rule).
+
+        If the remainder is smaller than 17232*10, the lower of the two
+        numbers is nearer to the exact result (values 17232 and 34480 were
+        also found by testing all possible fixed point values).
+
+        We use this to find a shorter decimal representation.  If not ending
+        with digit zero, we take the representation with less error.
+     */
+    p--;
+    if ( p - q == 5 )  /* five digits? */
+    {
+      /* take the representation that has zero as the last digit */
+      if ( frac_part < 34480 * 10 &&
+           *p == '1'              )
+        *p = '0';
+
+      /* otherwise use the one with less error */
+      else if ( frac_part == 17232 * 10 &&
+                *p & 1                  )
+        *p -= 1;
+
+      else if ( frac_part < 17232 * 10 &&
+                *p != '0'              )
+        *p -= 1;
+    }
+
+    /* remove trailing zeros */
+    while ( *p == '0' )
+      *p-- = '\0';
+
+    return p + 1;
+  }
 
 
-      if ( !FT_ALLOC( result, len + 1 ) )
+  static const char  hexdigits[16] =
+  {
+    '0', '1', '2', '3', '4', '5', '6', '7',
+    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
+  };
+
+
+  static const char*
+  sfnt_get_var_ps_name( TT_Face  face )
+  {
+    FT_Error   error;
+    FT_Memory  memory = face->root.memory;
+
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+    FT_UInt     num_coords;
+    FT_Fixed*   coords;
+    FT_MM_Var*  mm_var;
+
+    FT_Int   found, win, apple;
+    FT_UInt  i, j;
+
+    char*  result = NULL;
+    char*  p;
+
+
+    if ( !face->var_postscript_prefix )
+    {
+      FT_UInt  len;
+
+
+      /* check whether we have a Variations PostScript Name Prefix */
+      found = sfnt_get_name_id( face,
+                                TT_NAME_ID_VARIATIONS_PREFIX,
+                                &win,
+                                &apple );
+      if ( !found )
       {
-        FT_Stream  stream = face->name_table.stream;
+        /* otherwise use the typographic family name */
+        found = sfnt_get_name_id( face,
+                                  TT_NAME_ID_TYPOGRAPHIC_FAMILY,
+                                  &win,
+                                  &apple );
+      }
+
+      if ( !found )
+      {
+        /* as a last resort we try the family name; note that this is */
+        /* not in the Adobe TechNote, but GX fonts (which predate the */
+        /* TechNote) benefit from this behaviour                      */
+        found = sfnt_get_name_id( face,
+                                  TT_NAME_ID_FONT_FAMILY,
+                                  &win,
+                                  &apple );
+      }
+
+      if ( !found )
+      {
+        FT_TRACE0(( "sfnt_get_var_ps_name:"
+                    " Can't construct PS name prefix for font instances\n" ));
+        return NULL;
+      }
+
+      /* prefer Windows entries over Apple */
+      if ( win != -1 )
+        result = get_win_string( face->root.memory,
+                                 face->name_table.stream,
+                                 face->name_table.names + win,
+                                 sfnt_is_alphanumeric,
+                                 0 );
+      else
+        result = get_apple_string( face->root.memory,
+                                   face->name_table.stream,
+                                   face->name_table.names + apple,
+                                   sfnt_is_alphanumeric,
+                                   0 );
+
+      len = ft_strlen( result );
+
+      /* sanitize if necessary; we reserve space for 36 bytes (a 128bit  */
+      /* checksum as a hex number, preceded by `-' and followed by three */
+      /* ASCII dots, to be used if the constructed PS name would be too  */
+      /* long); this is also sufficient for a single instance            */
+      if ( len > MAX_PS_NAME_LEN - ( 1 + 32 + 3 ) )
+      {
+        len         = MAX_PS_NAME_LEN - ( 1 + 32 + 3 );
+        result[len] = '\0';
+
+        FT_TRACE0(( "sfnt_get_var_ps_name:"
+                    " Shortening variation PS name prefix\n"
+                    "                     "
+                    " to %d characters\n", len ));
+      }
+
+      face->var_postscript_prefix     = result;
+      face->var_postscript_prefix_len = len;
+    }
+
+    mm->get_var_blend( FT_FACE( face ),
+                       &num_coords,
+                       &coords,
+                       NULL,
+                       &mm_var );
+
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) &&
+         !FT_IS_VARIATION( FT_FACE( face ) )     )
+    {
+      SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+      FT_Long  instance = ( ( face->root.face_index & 0x7FFF0000L ) >> 16 ) - 1;
+      FT_UInt  psid     = mm_var->namedstyle[instance].psid;
+
+      char*  ps_name = NULL;
 
 
-        if ( FT_STREAM_SEEK( name->stringOffset ) ||
-             FT_STREAM_READ( result, len )        )
+      /* try first to load the name string with index `postScriptNameID' */
+      if ( psid == 6                      ||
+           ( psid > 255 && psid < 32768 ) )
+        (void)sfnt->get_name( face, (FT_UShort)psid, &ps_name );
+
+      if ( ps_name )
+      {
+        result = ps_name;
+        p      = result + ft_strlen( result ) + 1;
+
+        goto check_length;
+      }
+      else
+      {
+        /* otherwise construct a name using `subfamilyNameID' */
+        FT_UInt  strid = mm_var->namedstyle[instance].strid;
+
+        char*  subfamily_name;
+        char*  s;
+
+
+        (void)sfnt->get_name( face, (FT_UShort)strid, &subfamily_name );
+
+        if ( !subfamily_name )
         {
-          name->stringOffset = 0;
-          name->stringLength = 0;
-          FT_FREE( name->string );
-          FT_FREE( result );
-          goto Exit;
+          FT_TRACE1(( "sfnt_get_var_ps_name:"
+                      " can't construct named instance PS name;\n"
+                      "                     "
+                      " trying to construct normal instance PS name\n" ));
+          goto construct_instance_name;
         }
-        ((char*)result)[len] = '\0';
+
+        /* after the prefix we have character `-' followed by the   */
+        /* subfamily name (using only characters a-z, A-Z, and 0-9) */
+        if ( FT_ALLOC( result, face->var_postscript_prefix_len +
+                               1 + ft_strlen( subfamily_name ) + 1 ) )
+          return NULL;
+
+        ft_strcpy( result, face->var_postscript_prefix );
+
+        p = result + face->var_postscript_prefix_len;
+        *p++ = '-';
+
+        s = subfamily_name;
+        while ( *s )
+        {
+          if ( ft_isalnum( *s ) )
+            *p++ = *s;
+          s++;
+        }
+        *p++ = '\0';
+
+        FT_FREE( subfamily_name );
+      }
+    }
+    else
+    {
+      FT_Var_Axis*  axis;
+
+
+    construct_instance_name:
+      axis = mm_var->axis;
+
+      if ( FT_ALLOC( result,
+                     face->var_postscript_prefix_len +
+                       num_coords * MAX_VALUE_DESCRIPTOR_LEN + 1 ) )
+        return NULL;
+
+      p = result;
+
+      ft_strcpy( p, face->var_postscript_prefix );
+      p += face->var_postscript_prefix_len;
+
+      for ( i = 0; i < num_coords; i++, coords++, axis++ )
+      {
+        char  t;
+
+
+        /* omit axis value descriptor if it is identical */
+        /* to the default axis value                     */
+        if ( *coords == axis->def )
+          continue;
+
+        *p++ = '_';
+        p    = fixed2float( *coords, p );
+
+        t = (char)( axis->tag >> 24 );
+        if ( t != ' ' && ft_isalnum( t ) )
+          *p++ = t;
+        t = (char)( axis->tag >> 16 );
+        if ( t != ' ' && ft_isalnum( t ) )
+          *p++ = t;
+        t = (char)( axis->tag >> 8 );
+        if ( t != ' ' && ft_isalnum( t ) )
+          *p++ = t;
+        t = (char)axis->tag;
+        if ( t != ' ' && ft_isalnum( t ) )
+          *p++ = t;
       }
     }
 
-  Exit:
+  check_length:
+    if ( p - result > MAX_PS_NAME_LEN )
+    {
+      /* the PS name is too long; replace the part after the prefix with */
+      /* a checksum; we use MurmurHash 3 with a hash length of 128 bit   */
+
+      FT_UInt32  seed = 123456789;
+
+      FT_UInt32   hash[4];
+      FT_UInt32*  h;
+
+
+      murmur_hash_3_128( result, p - result, seed, hash );
+
+      p = result + face->var_postscript_prefix_len;
+      *p++ = '-';
+
+      /* we convert the hash value to hex digits from back to front */
+      p += 32 + 3;
+      h  = hash + 3;
+
+      *p-- = '\0';
+      *p-- = '.';
+      *p-- = '.';
+      *p-- = '.';
+
+      for ( i = 0; i < 4; i++, h-- )
+      {
+        FT_UInt32  v = *h;
+
+
+        for ( j = 0; j < 8; j++ )
+        {
+          *p--   = hexdigits[v & 0xF];
+          v    >>= 4;
+        }
+      }
+    }
+
+    return result;
+  }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+  static const char*
+  sfnt_get_ps_name( TT_Face  face )
+  {
+    FT_Int       found, win, apple;
+    const char*  result = NULL;
+
+
+    if ( face->postscript_name )
+      return face->postscript_name;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    if ( face->blend                                 &&
+         ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      ) )
+    {
+      face->postscript_name = sfnt_get_var_ps_name( face );
+      return face->postscript_name;
+    }
+#endif
+
+    /* scan the name table to see whether we have a Postscript name here, */
+    /* either in Macintosh or Windows platform encodings                  */
+    found = sfnt_get_name_id( face, TT_NAME_ID_PS_NAME, &win, &apple );
+    if ( !found )
+      return NULL;
+
+    /* prefer Windows entries over Apple */
+    if ( win != -1 )
+      result = get_win_string( face->root.memory,
+                               face->name_table.stream,
+                               face->name_table.names + win,
+                               sfnt_is_postscript,
+                               1 );
+    else
+      result = get_apple_string( face->root.memory,
+                                 face->name_table.stream,
+                                 face->name_table.names + apple,
+                                 sfnt_is_postscript,
+                                 1 );
+
     face->postscript_name = result;
+
     return result;
   }
 
 
   FT_DEFINE_SERVICE_PSFONTNAMEREC(
     sfnt_service_ps_name,
-    (FT_PsName_GetFunc)sfnt_get_ps_name )
+
+    (FT_PsName_GetFunc)sfnt_get_ps_name       /* get_ps_font_name */
+  )
 
 
   /*
@@ -338,7 +1077,9 @@
    */
   FT_DEFINE_SERVICE_TTCMAPSREC(
     tt_service_get_cmap_info,
-    (TT_CMap_Info_GetFunc)tt_get_cmap_info )
+
+    (TT_CMap_Info_GetFunc)tt_get_cmap_info    /* get_cmap_info */
+  )
 
 
 #ifdef TT_CONFIG_OPTION_BDF
@@ -381,8 +1122,10 @@
 
   FT_DEFINE_SERVICE_BDFRec(
     sfnt_service_bdf,
-    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,
-    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop )
+
+    (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id,     /* get_charset_id */
+    (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop    /* get_property   */
+  )
 
 
 #endif /* TT_CONFIG_OPTION_BDF */
@@ -395,6 +1138,7 @@
 #if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
   FT_DEFINE_SERVICEDESCREC5(
     sfnt_services,
+
     FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
@@ -403,6 +1147,7 @@
 #elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
   FT_DEFINE_SERVICEDESCREC4(
     sfnt_services,
+
     FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_GLYPH_DICT,           &SFNT_SERVICE_GLYPH_DICT_GET,
@@ -410,6 +1155,7 @@
 #elif defined TT_CONFIG_OPTION_BDF
   FT_DEFINE_SERVICEDESCREC4(
     sfnt_services,
+
     FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
@@ -417,6 +1163,7 @@
 #else
   FT_DEFINE_SERVICEDESCREC3(
     sfnt_services,
+
     FT_SERVICE_ID_SFNT_TABLE,           &SFNT_SERVICE_SFNT_TABLE_GET,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
@@ -459,53 +1206,64 @@
 
   FT_DEFINE_SFNT_INTERFACE(
     sfnt_interface,
-    tt_face_goto_table,
 
-    sfnt_init_face,
-    sfnt_load_face,
-    sfnt_done_face,
-    sfnt_get_interface,
+    tt_face_goto_table,     /* TT_Loader_GotoTableFunc goto_table      */
 
-    tt_face_load_any,
+    sfnt_init_face,         /* TT_Init_Face_Func       init_face       */
+    sfnt_load_face,         /* TT_Load_Face_Func       load_face       */
+    sfnt_done_face,         /* TT_Done_Face_Func       done_face       */
+    sfnt_get_interface,     /* FT_Module_Requester     get_interface   */
 
-    tt_face_load_head,
-    tt_face_load_hhea,
-    tt_face_load_cmap,
-    tt_face_load_maxp,
-    tt_face_load_os2,
-    tt_face_load_post,
+    tt_face_load_any,       /* TT_Load_Any_Func        load_any        */
 
-    tt_face_load_name,
-    tt_face_free_name,
+    tt_face_load_head,      /* TT_Load_Table_Func      load_head       */
+    tt_face_load_hhea,      /* TT_Load_Metrics_Func    load_hhea       */
+    tt_face_load_cmap,      /* TT_Load_Table_Func      load_cmap       */
+    tt_face_load_maxp,      /* TT_Load_Table_Func      load_maxp       */
+    tt_face_load_os2,       /* TT_Load_Table_Func      load_os2        */
+    tt_face_load_post,      /* TT_Load_Table_Func      load_post       */
 
-    tt_face_load_kern,
-    tt_face_load_gasp,
-    tt_face_load_pclt,
+    tt_face_load_name,      /* TT_Load_Table_Func      load_name       */
+    tt_face_free_name,      /* TT_Free_Table_Func      free_name       */
+
+    tt_face_load_kern,      /* TT_Load_Table_Func      load_kern       */
+    tt_face_load_gasp,      /* TT_Load_Table_Func      load_gasp       */
+    tt_face_load_pclt,      /* TT_Load_Table_Func      load_init       */
 
     /* see `ttload.h' */
     PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ),
-
+                            /* TT_Load_Table_Func      load_bhed       */
     PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ),
+                            /* TT_Load_SBit_Image_Func load_sbit_image */
 
     /* see `ttpost.h' */
     PUT_PS_NAMES( tt_face_get_ps_name   ),
+                            /* TT_Get_PS_Name_Func     get_psname      */
     PUT_PS_NAMES( tt_face_free_ps_names ),
+                            /* TT_Free_Table_Func      free_psnames    */
 
     /* since version 2.1.8 */
-    tt_face_get_kerning,
+    tt_face_get_kerning,    /* TT_Face_GetKerningFunc  get_kerning     */
 
     /* since version 2.2 */
-    tt_face_load_font_dir,
-    tt_face_load_hmtx,
+    tt_face_load_font_dir,  /* TT_Load_Table_Func      load_font_dir   */
+    tt_face_load_hmtx,      /* TT_Load_Metrics_Func    load_hmtx       */
 
     /* see `ttsbit.h' and `sfnt.h' */
     PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ),
+                            /* TT_Load_Table_Func      load_eblc       */
     PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ),
+                            /* TT_Free_Table_Func      free_eblc       */
 
     PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike     ),
+                            /* TT_Set_SBit_Strike_Func set_sbit_strike */
     PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ),
+                    /* TT_Load_Strike_Metrics_Func load_strike_metrics */
 
-    tt_face_get_metrics
+    tt_face_get_metrics,    /* TT_Get_Metrics_Func     get_metrics     */
+
+    tt_face_get_name,       /* TT_Get_Name_Func        get_name        */
+    sfnt_get_name_id        /* TT_Get_Name_ID_Func     get_name_id     */
   )
 
 
@@ -521,9 +1279,10 @@
 
     (const void*)&SFNT_INTERFACE_GET,  /* module specific interface */
 
-    (FT_Module_Constructor)0,
-    (FT_Module_Destructor) 0,
-    (FT_Module_Requester)  sfnt_get_interface )
+    (FT_Module_Constructor)NULL,               /* module_init   */
+    (FT_Module_Destructor) NULL,               /* module_done   */
+    (FT_Module_Requester)  sfnt_get_interface  /* get_interface */
+  )
 
 
 /* END */
diff --git a/src/sfnt/sfdriver.h b/src/sfnt/sfdriver.h
index 944119c..81c22d2 100644
--- a/src/sfnt/sfdriver.h
+++ b/src/sfnt/sfdriver.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level SFNT driver interface (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SFDRIVER_H__
-#define __SFDRIVER_H__
+#ifndef SFDRIVER_H_
+#define SFDRIVER_H_
 
 
 #include <ft2build.h>
@@ -32,7 +32,7 @@
 
 FT_END_HEADER
 
-#endif /* __SFDRIVER_H__ */
+#endif /* SFDRIVER_H_ */
 
 
 /* END */
diff --git a/src/sfnt/sferrors.h b/src/sfnt/sferrors.h
index e3bef3f..74003d4 100644
--- a/src/sfnt/sferrors.h
+++ b/src/sfnt/sferrors.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT error codes (specification only).                               */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __SFERRORS_H__
-#define __SFERRORS_H__
+#ifndef SFERRORS_H_
+#define SFERRORS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  SFNT_Err_
@@ -35,6 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __SFERRORS_H__ */
+#endif /* SFERRORS_H_ */
+
 
 /* END */
diff --git a/src/sfnt/sfnt.c b/src/sfnt/sfnt.c
index 0b8b5f4..8b9a6b3 100644
--- a/src/sfnt/sfnt.c
+++ b/src/sfnt/sfnt.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Single object library component.                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,27 +17,19 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
+
+#include "pngshim.c"
+#include "sfdriver.c"
 #include "sfntpic.c"
-#include "ttload.c"
-#include "ttmtx.c"
+#include "sfobjs.c"
+#include "ttbdf.c"
 #include "ttcmap.c"
 #include "ttkern.c"
-#include "sfobjs.c"
-#include "sfdriver.c"
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-#include "pngshim.c"
-#include "ttsbit.c"
-#endif
-
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttload.c"
+#include "ttmtx.c"
 #include "ttpost.c"
-#endif
+#include "ttsbit.c"
 
-#ifdef TT_CONFIG_OPTION_BDF
-#include "ttbdf.c"
-#endif
 
 /* END */
diff --git a/src/sfnt/sfntpic.c b/src/sfnt/sfntpic.c
index 2aaf4bc..db2d816 100644
--- a/src/sfnt/sfntpic.c
+++ b/src/sfnt/sfntpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for sfnt module.     */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/sfnt/sfntpic.h b/src/sfnt/sfntpic.h
index 563d634..8f43122 100644
--- a/src/sfnt/sfntpic.h
+++ b/src/sfnt/sfntpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for sfnt module.     */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,12 +16,10 @@
 /***************************************************************************/
 
 
-#ifndef __SFNTPIC_H__
-#define __SFNTPIC_H__
+#ifndef SFNTPIC_H_
+#define SFNTPIC_H_
 
 
-FT_BEGIN_HEADER
-
 #include FT_INTERNAL_PIC_H
 
 
@@ -31,7 +29,6 @@
 #define SFNT_SERVICE_GLYPH_DICT_GET  sfnt_service_glyph_dict
 #define SFNT_SERVICE_PS_NAME_GET     sfnt_service_ps_name
 #define TT_SERVICE_CMAP_INFO_GET     tt_service_get_cmap_info
-#define SFNT_SERVICES_GET            sfnt_services
 #define TT_CMAP_CLASSES_GET          tt_cmap_classes
 #define SFNT_SERVICE_SFNT_TABLE_GET  sfnt_service_sfnt_table
 #define SFNT_SERVICE_BDF_GET         sfnt_service_bdf
@@ -56,6 +53,8 @@
 #include "ttcmap.h"
 
 
+FT_BEGIN_HEADER
+
   typedef struct  sfntModulePIC_
   {
     FT_ServiceDescRec*        sfnt_services;
@@ -83,8 +82,6 @@
           ( GET_PIC( library )->sfnt_service_ps_name )
 #define TT_SERVICE_CMAP_INFO_GET                           \
           ( GET_PIC( library )->tt_service_get_cmap_info )
-#define SFNT_SERVICES_GET                       \
-          ( GET_PIC( library )->sfnt_services )
 #define TT_CMAP_CLASSES_GET                       \
           ( GET_PIC( library )->tt_cmap_classes )
 #define SFNT_SERVICE_SFNT_TABLE_GET                       \
@@ -102,13 +99,14 @@
   FT_Error
   sfnt_module_class_pic_init( FT_Library  library );
 
+
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
   /* */
 
-FT_END_HEADER
-
-#endif /* __SFNTPIC_H__ */
+#endif /* SFNTPIC_H_ */
 
 
 /* END */
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
index 40c27fa..6ba8509 100644
--- a/src/sfnt/sfobjs.c
+++ b/src/sfnt/sfobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT object management (base).                                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -28,6 +28,12 @@
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_SFNT_NAMES_H
 #include FT_GZIP_H
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
+#endif
+
 #include "sferrors.h"
 
 #ifdef TT_CONFIG_OPTION_BDF
@@ -48,8 +54,8 @@
 
   /* convert a UTF-16 name entry to ASCII */
   static FT_String*
-  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,
-                                  FT_Memory     memory )
+  tt_name_ascii_from_utf16( TT_Name    entry,
+                            FT_Memory  memory )
   {
     FT_String*  string = NULL;
     FT_UInt     len, code, n;
@@ -83,8 +89,8 @@
 
   /* convert an Apple Roman or symbol name entry to ASCII */
   static FT_String*
-  tt_name_entry_ascii_from_other( TT_NameEntry  entry,
-                                  FT_Memory     memory )
+  tt_name_ascii_from_other( TT_Name    entry,
+                            FT_Memory  memory )
   {
     FT_String*  string = NULL;
     FT_UInt     len, code, n;
@@ -116,49 +122,32 @@
   }
 
 
-  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,
-                                                   FT_Memory     memory );
+  typedef FT_String*  (*TT_Name_ConvertFunc)( TT_Name    entry,
+                                              FT_Memory  memory );
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_get_name                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Returns a given ENGLISH name record in ASCII.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the source face object.                      */
-  /*                                                                       */
-  /*    nameid :: The name id of the name record to return.                */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    name   :: The address of a string pointer.  NULL if no name is     */
-  /*              present.                                                 */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
+  /* documentation is in sfnt.h */
+
+  FT_LOCAL_DEF( FT_Error )
   tt_face_get_name( TT_Face      face,
                     FT_UShort    nameid,
                     FT_String**  name )
   {
-    FT_Memory         memory = face->root.memory;
-    FT_Error          error  = FT_Err_Ok;
-    FT_String*        result = NULL;
-    FT_UShort         n;
-    TT_NameEntryRec*  rec;
-    FT_Int            found_apple         = -1;
-    FT_Int            found_apple_roman   = -1;
-    FT_Int            found_apple_english = -1;
-    FT_Int            found_win           = -1;
-    FT_Int            found_unicode       = -1;
+    FT_Memory   memory = face->root.memory;
+    FT_Error    error  = FT_Err_Ok;
+    FT_String*  result = NULL;
+    FT_UShort   n;
+    TT_Name     rec;
 
-    FT_Bool           is_english = 0;
+    FT_Int  found_apple         = -1;
+    FT_Int  found_apple_roman   = -1;
+    FT_Int  found_apple_english = -1;
+    FT_Int  found_win           = -1;
+    FT_Int  found_unicode       = -1;
 
-    TT_NameEntry_ConvertFunc  convert;
+    FT_Bool  is_english = 0;
+
+    TT_Name_ConvertFunc  convert;
 
 
     FT_ASSERT( name );
@@ -243,7 +232,7 @@
         /* all Unicode strings are encoded using UTF-16BE */
       case TT_MS_ID_UNICODE_CS:
       case TT_MS_ID_SYMBOL_CS:
-        convert = tt_name_entry_ascii_from_utf16;
+        convert = tt_name_ascii_from_utf16;
         break;
 
       case TT_MS_ID_UCS_4:
@@ -252,7 +241,7 @@
         /* MsGothic font shipped with Windows Vista shows that this really */
         /* means UTF-16 encoded names (UCS-4 values are only used within   */
         /* charmaps).                                                      */
-        convert = tt_name_entry_ascii_from_utf16;
+        convert = tt_name_ascii_from_utf16;
         break;
 
       default:
@@ -262,17 +251,17 @@
     else if ( found_apple >= 0 )
     {
       rec     = face->name_table.names + found_apple;
-      convert = tt_name_entry_ascii_from_other;
+      convert = tt_name_ascii_from_other;
     }
     else if ( found_unicode >= 0 )
     {
       rec     = face->name_table.names + found_unicode;
-      convert = tt_name_entry_ascii_from_utf16;
+      convert = tt_name_ascii_from_utf16;
     }
 
     if ( rec && convert )
     {
-      if ( rec->string == NULL )
+      if ( !rec->string )
       {
         FT_Stream  stream = face->name_table.stream;
 
@@ -322,7 +311,7 @@
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_PRC,        FT_ENCODING_PRC },
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },
       { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }
@@ -469,10 +458,14 @@
                                      woff.metaOrigLength != 0 ) ) ||
          ( woff.metaLength != 0 && woff.metaOrigLength == 0 )     ||
          ( woff.privOffset == 0 && woff.privLength != 0 )         )
+    {
+      FT_ERROR(( "woff_font_open: invalid WOFF header\n" ));
       return FT_THROW( Invalid_Table );
+    }
 
-    if ( FT_ALLOC( sfnt, woff.totalSfntSize ) ||
-         FT_NEW( sfnt_stream )                )
+    /* Don't trust `totalSfntSize' before thorough checks. */
+    if ( FT_ALLOC( sfnt, 12 + woff.num_tables * 16UL ) ||
+         FT_NEW( sfnt_stream )                         )
       goto Exit;
 
     sfnt_header = sfnt;
@@ -539,6 +532,8 @@
       if ( table->Tag <= old_tag )
       {
         FT_FRAME_EXIT();
+
+        FT_ERROR(( "woff_font_open: table tags are not sorted\n" ));
         error = FT_THROW( Invalid_Table );
         goto Exit;
       }
@@ -573,6 +568,7 @@
            sfnt_offset > woff.totalSfntSize - table->OrigLength ||
            table->CompLength > table->OrigLength                )
       {
+        FT_ERROR(( "woff_font_open: invalid table offsets\n" ));
         error = FT_THROW( Invalid_Table );
         goto Exit;
       }
@@ -598,6 +594,8 @@
       if ( woff.metaOffset != woff_offset                  ||
            woff.metaOffset + woff.metaLength > woff.length )
       {
+        FT_ERROR(( "woff_font_open:"
+                   " invalid `metadata' offset or length\n" ));
         error = FT_THROW( Invalid_Table );
         goto Exit;
       }
@@ -614,6 +612,7 @@
       if ( woff.privOffset != woff_offset                  ||
            woff.privOffset + woff.privLength > woff.length )
       {
+        FT_ERROR(( "woff_font_open: invalid `private' offset or length\n" ));
         error = FT_THROW( Invalid_Table );
         goto Exit;
       }
@@ -625,10 +624,19 @@
     if ( sfnt_offset != woff.totalSfntSize ||
          woff_offset != woff.length        )
     {
+      FT_ERROR(( "woff_font_open: invalid `sfnt' table structure\n" ));
       error = FT_THROW( Invalid_Table );
       goto Exit;
     }
 
+    /* Now use `totalSfntSize'. */
+    if ( FT_REALLOC( sfnt,
+                     12 + woff.num_tables * 16UL,
+                     woff.totalSfntSize ) )
+      goto Exit;
+
+    sfnt_header = sfnt + 12;
+
     /* Write the tables. */
 
     for ( nn = 0; nn < woff.num_tables; nn++ )
@@ -669,6 +677,7 @@
           goto Exit;
         if ( output_len != table->OrigLength )
         {
+          FT_ERROR(( "woff_font_open: compressed table length mismatch\n" ));
           error = FT_THROW( Invalid_Table );
           goto Exit;
         }
@@ -778,6 +787,8 @@
          tag != TTAG_OTTO    &&
          tag != TTAG_true    &&
          tag != TTAG_typ1    &&
+         tag != TTAG_0xA5kbd &&
+         tag != TTAG_0xA5lst &&
          tag != 0x00020000UL )
     {
       FT_TRACE2(( "  not a font using the SFNT container format\n" ));
@@ -796,6 +807,9 @@
       if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
         return error;
 
+      FT_TRACE3(( "                with %ld subfonts\n",
+                  face->ttc_header.count ));
+
       if ( face->ttc_header.count == 0 )
         return FT_THROW( Invalid_Table );
 
@@ -839,13 +853,14 @@
   FT_LOCAL_DEF( FT_Error )
   sfnt_init_face( FT_Stream      stream,
                   TT_Face        face,
-                  FT_Int         face_index,
+                  FT_Int         face_instance_index,
                   FT_Int         num_params,
                   FT_Parameter*  params )
   {
-    FT_Error        error;
-    FT_Library      library = face->root.driver->root.library;
-    SFNT_Service    sfnt;
+    FT_Error      error;
+    FT_Library    library = face->root.driver->root.library;
+    SFNT_Service  sfnt;
+    FT_Int        face_index;
 
 
     /* for now, parameters are unused */
@@ -869,6 +884,31 @@
 
     FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    if ( !face->mm )
+    {
+      /* we want the MM interface from the `truetype' module only */
+      FT_Module  tt_module = FT_Get_Module( library, "truetype" );
+
+
+      face->mm = ft_module_get_service( tt_module,
+                                        FT_SERVICE_ID_MULTI_MASTERS,
+                                        0 );
+    }
+
+    if ( !face->var )
+    {
+      /* we want the metrics variations interface */
+      /* from the `truetype' module only          */
+      FT_Module  tt_module = FT_Get_Module( library, "truetype" );
+
+
+      face->var = ft_module_get_service( tt_module,
+                                         FT_SERVICE_ID_METRICS_VARIATIONS,
+                                         0 );
+    }
+#endif
+
     FT_TRACE2(( "SFNT driver\n" ));
 
     error = sfnt_open_font( stream, face );
@@ -878,24 +918,171 @@
     /* Stream may have changed in sfnt_open_font. */
     stream = face->root.stream;
 
-    FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
+    FT_TRACE2(( "sfnt_init_face: %08p, %d\n", face, face_instance_index ));
 
-    if ( face_index < 0 )
-      face_index = 0;
+    face_index = FT_ABS( face_instance_index ) & 0xFFFF;
+
+    /* value -(N+1) requests information on index N */
+    if ( face_instance_index < 0 )
+      face_index--;
 
     if ( face_index >= face->ttc_header.count )
-      return FT_THROW( Invalid_Argument );
+    {
+      if ( face_instance_index >= 0 )
+        return FT_THROW( Invalid_Argument );
+      else
+        face_index = 0;
+    }
 
     if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
       return error;
 
-    /* check that we have a valid TrueType file */
+    /* check whether we have a valid TrueType file */
     error = sfnt->load_font_dir( face, stream );
     if ( error )
       return error;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    {
+      FT_Memory  memory = face->root.memory;
+
+      FT_ULong  fvar_len;
+
+      FT_ULong  version;
+      FT_ULong  offset;
+
+      FT_UShort  num_axes;
+      FT_UShort  axis_size;
+      FT_UShort  num_instances;
+      FT_UShort  instance_size;
+
+      FT_Int  instance_index;
+
+      FT_Byte*  default_values  = NULL;
+      FT_Byte*  instance_values = NULL;
+
+
+      instance_index = FT_ABS( face_instance_index ) >> 16;
+
+      /* test whether current face is a GX font with named instances */
+      if ( face->goto_table( face, TTAG_fvar, stream, &fvar_len ) ||
+           fvar_len < 20                                          ||
+           FT_READ_ULONG( version )                               ||
+           FT_READ_USHORT( offset )                               ||
+           FT_STREAM_SKIP( 2 ) /* reserved */                     ||
+           FT_READ_USHORT( num_axes )                             ||
+           FT_READ_USHORT( axis_size )                            ||
+           FT_READ_USHORT( num_instances )                        ||
+           FT_READ_USHORT( instance_size )                        )
+      {
+        version       = 0;
+        offset        = 0;
+        num_axes      = 0;
+        axis_size     = 0;
+        num_instances = 0;
+        instance_size = 0;
+      }
+
+      /* check that the data is bound by the table length */
+      if ( version != 0x00010000UL                    ||
+           axis_size != 20                            ||
+           num_axes == 0                              ||
+           /* `num_axes' limit implied by 16-bit `instance_size' */
+           num_axes > 0x3FFE                          ||
+           !( instance_size == 4 + 4 * num_axes ||
+              instance_size == 6 + 4 * num_axes )     ||
+           /* `num_instances' limit implied by limited range of name IDs */
+           num_instances > 0x7EFF                     ||
+           offset                          +
+             axis_size * num_axes          +
+             instance_size * num_instances > fvar_len )
+        num_instances = 0;
+      else
+        face->variation_support |= TT_FACE_FLAG_VAR_FVAR;
+
+      /*
+       *  As documented in the OpenType specification, an entry for the
+       *  default instance may be omitted in the named instance table.  In
+       *  particular this means that even if there is no named instance
+       *  table in the font we actually do have a named instance, namely the
+       *  default instance.
+       *
+       *  For consistency, we always want the default instance in our list
+       *  of named instances.  If it is missing, we try to synthesize it
+       *  later on.  Here, we have to adjust `num_instances' accordingly.
+       */
+
+      if ( ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) &&
+           !( FT_ALLOC( default_values, num_axes * 4 )  ||
+              FT_ALLOC( instance_values, num_axes * 4 ) )      )
+      {
+        /* the current stream position is 16 bytes after the table start */
+        FT_ULong  array_start = FT_STREAM_POS() - 16 + offset;
+        FT_ULong  default_value_offset, instance_offset;
+
+        FT_Byte*  p;
+        FT_UInt   i;
+
+
+        default_value_offset = array_start + 8;
+        p                    = default_values;
+
+        for ( i = 0; i < num_axes; i++ )
+        {
+          (void)FT_STREAM_READ_AT( default_value_offset, p, 4 );
+
+          default_value_offset += axis_size;
+          p                    += 4;
+        }
+
+        instance_offset = array_start + axis_size * num_axes + 4;
+
+        for ( i = 0; i < num_instances; i++ )
+        {
+          (void)FT_STREAM_READ_AT( instance_offset,
+                                   instance_values,
+                                   num_axes * 4 );
+
+          if ( !ft_memcmp( default_values, instance_values, num_axes * 4 ) )
+            break;
+
+          instance_offset += instance_size;
+        }
+
+        if ( i == num_instances )
+        {
+          /* no default instance in named instance table; */
+          /* we thus have to synthesize it                */
+          num_instances++;
+        }
+      }
+
+      FT_FREE( default_values );
+      FT_FREE( instance_values );
+
+      /* we don't support Multiple Master CFFs yet; */
+      /* note that `glyf' or `CFF2' have precedence */
+      if ( face->goto_table( face, TTAG_glyf, stream, 0 ) &&
+           face->goto_table( face, TTAG_CFF2, stream, 0 ) &&
+           !face->goto_table( face, TTAG_CFF, stream, 0 ) )
+        num_instances = 0;
+
+      /* instance indices in `face_instance_index' start with index 1, */
+      /* thus `>' and not `>='                                         */
+      if ( instance_index > num_instances )
+      {
+        if ( face_instance_index >= 0 )
+          return FT_THROW( Invalid_Argument );
+        else
+          num_instances = 0;
+      }
+
+      face->root.style_flags = (FT_Long)num_instances << 16;
+    }
+#endif
+
     face->root.num_faces  = face->ttc_header.count;
-    face->root.face_index = face_index;
+    face->root.face_index = face_instance_index;
 
     return error;
   }
@@ -946,7 +1133,7 @@
   FT_LOCAL_DEF( FT_Error )
   sfnt_load_face( FT_Stream      stream,
                   TT_Face        face,
-                  FT_Int         face_index,
+                  FT_Int         face_instance_index,
                   FT_Int         num_params,
                   FT_Parameter*  params )
   {
@@ -957,12 +1144,14 @@
     FT_Bool       has_outline;
     FT_Bool       is_apple_sbit;
     FT_Bool       is_apple_sbix;
-    FT_Bool       ignore_preferred_family    = FALSE;
-    FT_Bool       ignore_preferred_subfamily = FALSE;
+    FT_Bool       has_CBLC;
+    FT_Bool       has_CBDT;
+    FT_Bool       ignore_typographic_family    = FALSE;
+    FT_Bool       ignore_typographic_subfamily = FALSE;
 
     SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
 
-    FT_UNUSED( face_index );
+    FT_UNUSED( face_instance_index );
 
 
     /* Check parameters */
@@ -973,10 +1162,10 @@
 
       for ( i = 0; i < num_params; i++ )
       {
-        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
-          ignore_preferred_family = TRUE;
-        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
-          ignore_preferred_subfamily = TRUE;
+        if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY )
+          ignore_typographic_family = TRUE;
+        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY )
+          ignore_typographic_subfamily = TRUE;
       }
     }
 
@@ -1001,12 +1190,14 @@
 
     /* do we have outlines in there? */
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
-                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||
-                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );
+    has_outline = FT_BOOL( face->root.internal->incremental_interface ||
+                           tt_face_lookup_table( face, TTAG_glyf )    ||
+                           tt_face_lookup_table( face, TTAG_CFF )     ||
+                           tt_face_lookup_table( face, TTAG_CFF2 )    );
 #else
-    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
-                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );
+    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) ||
+                           tt_face_lookup_table( face, TTAG_CFF )  ||
+                           tt_face_lookup_table( face, TTAG_CFF2 ) );
 #endif
 
     is_apple_sbit = 0;
@@ -1035,7 +1226,17 @@
         goto Exit;
     }
 
-    if ( face->header.Units_Per_EM == 0 )
+    has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 );
+    has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 );
+
+    /* Ignore outlines for CBLC/CBDT fonts. */
+    if ( has_CBLC || has_CBDT )
+      has_outline = FALSE;
+
+    /* OpenType 1.8.2 introduced limits to this value;    */
+    /* however, they make sense for older SFNT fonts also */
+    if ( face->header.Units_Per_EM <    16 ||
+         face->header.Units_Per_EM > 16384 )
     {
       error = FT_THROW( Invalid_Table );
 
@@ -1138,30 +1339,10 @@
 
     /* embedded bitmap support */
     if ( sfnt->load_eblc )
-    {
       LOAD_( eblc );
-      if ( error )
-      {
-        /* a font which contains neither bitmaps nor outlines is */
-        /* still valid (although rather useless in most cases);  */
-        /* however, you can find such stripped fonts in PDFs     */
-        if ( FT_ERR_EQ( error, Table_Missing ) )
-          error = FT_Err_Ok;
-        else
-          goto Exit;
-      }
-    }
 
+    /* consider the pclt, kerning, and gasp tables as optional */
     LOAD_( pclt );
-    if ( error )
-    {
-      if ( FT_ERR_NEQ( error, Table_Missing ) )
-        goto Exit;
-
-      face->pclt.Version = 0;
-    }
-
-    /* consider the kerning and gasp tables as optional */
     LOAD_( gasp );
     LOAD_( kern );
 
@@ -1177,27 +1358,27 @@
     face->root.style_name  = NULL;
     if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
     {
-      if ( !ignore_preferred_family )
-        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !ignore_typographic_family )
+        GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name );
       if ( !face->root.family_name )
         GET_NAME( FONT_FAMILY, &face->root.family_name );
 
-      if ( !ignore_preferred_subfamily )
-        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !ignore_typographic_subfamily )
+        GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name );
       if ( !face->root.style_name )
         GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
     }
     else
     {
       GET_NAME( WWS_FAMILY, &face->root.family_name );
-      if ( !face->root.family_name && !ignore_preferred_family )
-        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name && !ignore_typographic_family )
+        GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name );
       if ( !face->root.family_name )
         GET_NAME( FONT_FAMILY, &face->root.family_name );
 
       GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
-      if ( !face->root.style_name && !ignore_preferred_subfamily )
-        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name && !ignore_typographic_subfamily )
+        GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name );
       if ( !face->root.style_name )
         GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
     }
@@ -1245,10 +1426,14 @@
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
       /* Don't bother to load the tables unless somebody asks for them. */
       /* No need to do work which will (probably) not be used.          */
-      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
-           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
-           tt_face_lookup_table( face, TTAG_gvar ) != 0 )
-        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+      if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR )
+      {
+        if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
+             tt_face_lookup_table( face, TTAG_gvar ) != 0 )
+          flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+        if ( tt_face_lookup_table( face, TTAG_CFF2 ) != 0 )
+          flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+      }
 #endif
 
       root->face_flags = flags;
@@ -1284,14 +1469,15 @@
           flags |= FT_STYLE_FLAG_ITALIC;
       }
 
-      root->style_flags = flags;
+      root->style_flags |= flags;
 
       /*********************************************************************/
       /*                                                                   */
       /* Polish the charmaps.                                              */
       /*                                                                   */
       /*   Try to set the charmap encoding according to the platform &     */
-      /*   encoding ID of each charmap.                                    */
+      /*   encoding ID of each charmap.  Emulate Unicode charmap if one    */
+      /*   is missing.                                                     */
       /*                                                                   */
 
       tt_face_build_cmaps( face );  /* ignore errors */
@@ -1299,7 +1485,10 @@
 
       /* set the encoding fields */
       {
-        FT_Int  m;
+        FT_Int   m;
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+        FT_Bool  has_unicode = FALSE;
+#endif
 
 
         for ( m = 0; m < root->num_charmaps; m++ )
@@ -1310,14 +1499,34 @@
           charmap->encoding = sfnt_find_encoding( charmap->platform_id,
                                                   charmap->encoding_id );
 
-#if 0
-          if ( root->charmap     == NULL &&
-               charmap->encoding == FT_ENCODING_UNICODE )
-          {
-            /* set 'root->charmap' to the first Unicode encoding we find */
-            root->charmap = charmap;
-          }
-#endif
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+          if ( charmap->encoding == FT_ENCODING_UNICODE   ||
+               charmap->encoding == FT_ENCODING_MS_SYMBOL )  /* PUA */
+            has_unicode = TRUE;
+        }
+
+        /* synthesize Unicode charmap if one is missing */
+        if ( !has_unicode )
+        {
+          FT_CharMapRec cmaprec;
+
+
+          cmaprec.face        = root;
+          cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+          cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+          cmaprec.encoding    = FT_ENCODING_UNICODE;
+
+
+          error = FT_CMap_New( (FT_CMap_Class)&tt_cmap_unicode_class_rec,
+                               NULL, &cmaprec, NULL );
+          if ( error                                      &&
+               FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+            goto Exit;
+          error = FT_Err_Ok;
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
         }
       }
 
@@ -1329,7 +1538,7 @@
        *  depths in the FT_Bitmap_Size record.  This is a design error.
        */
       {
-        FT_UInt  i, count;
+        FT_UInt  count;
 
 
         count = face->sbit_num_strikes;
@@ -1341,6 +1550,9 @@
           FT_Short         avgwidth = face->os2.xAvgCharWidth;
           FT_Size_Metrics  metrics;
 
+          FT_UInt*  sbit_strike_map = NULL;
+          FT_UInt   strike_idx, bsize_idx;
+
 
           if ( em_size == 0 || face->os2.version == 0xFFFFU )
           {
@@ -1348,31 +1560,50 @@
             em_size = 1;
           }
 
-          if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+          /* to avoid invalid strike data in the `available_sizes' field */
+          /* of `FT_Face', we map `available_sizes' indices to strike    */
+          /* indices                                                     */
+          if ( FT_NEW_ARRAY( root->available_sizes, count ) ||
+               FT_NEW_ARRAY( sbit_strike_map, count ) )
             goto Exit;
 
-          for ( i = 0; i < count; i++ )
+          bsize_idx = 0;
+          for ( strike_idx = 0; strike_idx < count; strike_idx++ )
           {
-            FT_Bitmap_Size*  bsize = root->available_sizes + i;
+            FT_Bitmap_Size*  bsize = root->available_sizes + bsize_idx;
 
 
-            error = sfnt->load_strike_metrics( face, i, &metrics );
+            error = sfnt->load_strike_metrics( face, strike_idx, &metrics );
             if ( error )
-              goto Exit;
+              continue;
 
             bsize->height = (FT_Short)( metrics.height >> 6 );
-            bsize->width = (FT_Short)(
-                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
+            bsize->width  = (FT_Short)(
+              ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
 
             bsize->x_ppem = metrics.x_ppem << 6;
             bsize->y_ppem = metrics.y_ppem << 6;
 
             /* assume 72dpi */
             bsize->size   = metrics.y_ppem << 6;
+
+            /* only use strikes with valid PPEM values */
+            if ( bsize->x_ppem && bsize->y_ppem )
+              sbit_strike_map[bsize_idx++] = strike_idx;
           }
 
-          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;
-          root->num_fixed_sizes = (FT_Int)count;
+          /* reduce array size to the actually used elements */
+          (void)FT_RENEW_ARRAY( sbit_strike_map, count, bsize_idx );
+
+          /* from now on, all strike indices are mapped */
+          /* using `sbit_strike_map'                    */
+          if ( bsize_idx )
+          {
+            face->sbit_strike_map = sbit_strike_map;
+
+            root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;
+            root->num_fixed_sizes = (FT_Int)bsize_idx;
+          }
         }
       }
 
@@ -1462,9 +1693,9 @@
           (FT_Short)( face->vertical_info ? face->vertical.advance_Height_Max
                                           : root->height );
 
-        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
-        /* Adjust underline position from top edge to centre of     */
-        /* stroke to convert TrueType meaning to FreeType meaning.  */
+        /* See https://www.microsoft.com/typography/otspec/post.htm -- */
+        /* Adjust underline position from top edge to centre of        */
+        /* stroke to convert TrueType meaning to FreeType meaning.     */
         root->underline_position  = face->postscript.underlinePosition -
                                     face->postscript.underlineThickness / 2;
         root->underline_thickness = face->postscript.underlineThickness;
@@ -1533,18 +1764,10 @@
       face->cmap_size = 0;
     }
 
-    /* freeing the horizontal metrics */
-    {
-      FT_Stream  stream = FT_FACE_STREAM( face );
+    face->horz_metrics_size = 0;
+    face->vert_metrics_size = 0;
 
-
-      FT_FRAME_RELEASE( face->horz_metrics );
-      FT_FRAME_RELEASE( face->vert_metrics );
-      face->horz_metrics_size = 0;
-      face->vert_metrics_size = 0;
-    }
-
-    /* freeing the vertical ones, if any */
+    /* freeing vertical metrics, if any */
     if ( face->vertical_info )
     {
       FT_FREE( face->vertical.long_metrics  );
@@ -1566,9 +1789,13 @@
 
     /* freeing sbit size table */
     FT_FREE( face->root.available_sizes );
+    FT_FREE( face->sbit_strike_map );
     face->root.num_fixed_sizes = 0;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
     FT_FREE( face->postscript_name );
+    FT_FREE( face->var_postscript_prefix );
+#endif
 
     face->sfnt = NULL;
   }
diff --git a/src/sfnt/sfobjs.h b/src/sfnt/sfobjs.h
index 77c7d92..1b8d1be 100644
--- a/src/sfnt/sfobjs.h
+++ b/src/sfnt/sfobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT object management (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __SFOBJS_H__
-#define __SFOBJS_H__
+#ifndef SFOBJS_H_
+#define SFOBJS_H_
 
 
 #include <ft2build.h>
@@ -31,24 +31,29 @@
   FT_LOCAL( FT_Error )
   sfnt_init_face( FT_Stream      stream,
                   TT_Face        face,
-                  FT_Int         face_index,
+                  FT_Int         face_instance_index,
                   FT_Int         num_params,
                   FT_Parameter*  params );
 
   FT_LOCAL( FT_Error )
   sfnt_load_face( FT_Stream      stream,
                   TT_Face        face,
-                  FT_Int         face_index,
+                  FT_Int         face_instance_index,
                   FT_Int         num_params,
                   FT_Parameter*  params );
 
   FT_LOCAL( void )
   sfnt_done_face( TT_Face  face );
 
+  FT_LOCAL( FT_Error )
+  tt_face_get_name( TT_Face      face,
+                    FT_UShort    nameid,
+                    FT_String**  name );
+
 
 FT_END_HEADER
 
-#endif /* __SFDRIVER_H__ */
+#endif /* SFDRIVER_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttbdf.c b/src/sfnt/ttbdf.c
index 098b781..534201f 100644
--- a/src/sfnt/ttbdf.c
+++ b/src/sfnt/ttbdf.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded BDF properties (body).                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -48,7 +48,7 @@
       FT_Stream  stream = FT_FACE(face)->stream;
 
 
-      if ( bdf->table != NULL )
+      if ( bdf->table )
         FT_FRAME_RELEASE( bdf->table );
 
       bdf->table_end    = NULL;
@@ -165,7 +165,7 @@
 
     error = FT_ERR( Invalid_Argument );
 
-    if ( size == NULL || property_name == NULL )
+    if ( !size || !property_name )
       goto Exit;
 
     property_len = ft_strlen( property_name );
@@ -177,6 +177,7 @@
       FT_UInt  _ppem  = FT_NEXT_USHORT( p );
       FT_UInt  _count = FT_NEXT_USHORT( p );
 
+
       if ( _ppem == size->metrics.y_ppem )
       {
         count = _count;
@@ -193,6 +194,7 @@
     {
       FT_UInt  type = FT_PEEK_USHORT( p + 4 );
 
+
       if ( ( type & 0x10 ) != 0 )
       {
         FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
@@ -244,7 +246,12 @@
     return error;
   }
 
-#endif /* TT_CONFIG_OPTION_BDF */
+#else /* !TT_CONFIG_OPTION_BDF */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_bdf_dummy;
+
+#endif /* !TT_CONFIG_OPTION_BDF */
 
 
 /* END */
diff --git a/src/sfnt/ttbdf.h b/src/sfnt/ttbdf.h
index fe4ba48..809a663 100644
--- a/src/sfnt/ttbdf.h
+++ b/src/sfnt/ttbdf.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded BDF properties (specification).       */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTBDF_H__
-#define __TTBDF_H__
+#ifndef TTBDF_H_
+#define TTBDF_H_
 
 
 #include <ft2build.h>
@@ -28,6 +28,8 @@
 FT_BEGIN_HEADER
 
 
+#ifdef TT_CONFIG_OPTION_BDF
+
   FT_LOCAL( void )
   tt_face_free_bdf_props( TT_Face  face );
 
@@ -37,10 +39,12 @@
                          const char*       property_name,
                          BDF_PropertyRec  *aprop );
 
+#endif /* TT_CONFIG_OPTION_BDF */
+
 
 FT_END_HEADER
 
-#endif /* __TTBDF_H__ */
+#endif /* TTBDF_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c
index 815ee7c..996e664 100644
--- a/src/sfnt/ttcmap.c
+++ b/src/sfnt/ttcmap.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType character mapping table (cmap) support (body).              */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,8 +23,10 @@
 
 #include FT_INTERNAL_VALIDATE_H
 #include FT_INTERNAL_STREAM_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include "ttload.h"
 #include "ttcmap.h"
+#include "ttpost.h"
 #include "sfntpic.h"
 
 
@@ -51,6 +53,13 @@
 #define TT_NEXT_ULONG   FT_NEXT_ULONG
 
 
+  /* Too large glyph index return values are caught in `FT_Get_Char_Index' */
+  /* and `FT_Get_Next_Char' (the latter calls the internal `next' function */
+  /* again in this case).  To mark character code return values as invalid */
+  /* it is sufficient to set the corresponding glyph index return value to */
+  /* zero.                                                                 */
+
+
   FT_CALLBACK_DEF( FT_Error )
   tt_cmap_init( TT_CMap   cmap,
                 FT_Byte*  table )
@@ -173,22 +182,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap0_class_rec,
-    sizeof ( TT_CMapRec ),
 
-    (FT_CMap_InitFunc)     tt_cmap_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap0_char_next,
+      sizeof ( TT_CMapRec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap_init,         /* init       */
+      (FT_CMap_DoneFunc)     NULL,                 /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap0_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap0_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     0,
-    (TT_CMap_ValidateFunc)tt_cmap0_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap0_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap0_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap0_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_0 */
 
@@ -199,7 +210,7 @@
   /*****                          FORMAT 2                             *****/
   /*****                                                               *****/
   /***** This is used for certain CJK encodings that encode text in a  *****/
-  /***** mixed 8/16 bits encoding along the following lines:           *****/
+  /***** mixed 8/16 bits encoding along the following lines.           *****/
   /*****                                                               *****/
   /***** * Certain byte values correspond to an 8-bit character code   *****/
   /*****   (typically in the range 0..127 for ASCII compatibility).    *****/
@@ -209,19 +220,19 @@
   /*****   second byte of a 2-byte character).                         *****/
   /*****                                                               *****/
   /***** The following charmap lookup and iteration functions all      *****/
-  /***** assume that the value "charcode" correspond to following:     *****/
+  /***** assume that the value `charcode' fulfills the following.      *****/
   /*****                                                               *****/
-  /*****   - For one byte characters, "charcode" is simply the         *****/
+  /*****   - For one-byte characters, `charcode' is simply the         *****/
   /*****     character code.                                           *****/
   /*****                                                               *****/
-  /*****   - For two byte characters, "charcode" is the 2-byte         *****/
-  /*****     character code in big endian format.  More exactly:       *****/
+  /*****   - For two-byte characters, `charcode' is the 2-byte         *****/
+  /*****     character code in big endian format.  More precisely:     *****/
   /*****                                                               *****/
   /*****       (charcode >> 8)    is the first byte value              *****/
   /*****       (charcode & 0xFF)  is the second byte value             *****/
   /*****                                                               *****/
-  /***** Note that not all values of "charcode" are valid according    *****/
-  /***** to these rules, and the function moderately check the         *****/
+  /***** Note that not all values of `charcode' are valid according    *****/
+  /***** to these rules, and the function moderately checks the        *****/
   /***** arguments.                                                    *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -241,15 +252,15 @@
   /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */
   /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */
   /*                                                                       */
-  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */
+  /* The `keys' table is used to map charcode high bytes to sub-headers.   */
   /* The value of `NSUBS' is the number of sub-headers defined in the      */
   /* table and is computed by finding the maximum of the `keys' table.     */
   /*                                                                       */
-  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */
+  /* Note that for any `n', `keys[n]' is a byte offset within the `subs'   */
   /* table, i.e., it is the corresponding sub-header index multiplied      */
   /* by 8.                                                                 */
   /*                                                                       */
-  /* Each sub-header has the following format:                             */
+  /* Each sub-header has the following format.                             */
   /*                                                                       */
   /*   NAME        OFFSET      TYPE            DESCRIPTION                 */
   /*                                                                       */
@@ -258,17 +269,17 @@
   /*   delta       4           SHORT           see below                   */
   /*   offset      6           USHORT          see below                   */
   /*                                                                       */
-  /* A sub-header defines, for each high-byte, the range of valid          */
-  /* low-bytes within the charmap.  Note that the range defined by `first' */
+  /* A sub-header defines, for each high byte, the range of valid          */
+  /* low bytes within the charmap.  Note that the range defined by `first' */
   /* and `count' must be completely included in the interval [0..255]      */
   /* according to the specification.                                       */
   /*                                                                       */
   /* If a character code is contained within a given sub-header, then      */
-  /* mapping it to a glyph index is done as follows:                       */
+  /* mapping it to a glyph index is done as follows.                       */
   /*                                                                       */
   /* * The value of `offset' is read.  This is a _byte_ distance from the  */
   /*   location of the `offset' field itself into a slice of the           */
-  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */
+  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[], too).  */
   /*                                                                       */
   /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */
   /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */
@@ -326,7 +337,7 @@
     FT_ASSERT( p == table + 518 );
 
     subs      = p;
-    glyph_ids = subs + (max_subs + 1) * 8;
+    glyph_ids = subs + ( max_subs + 1 ) * 8;
     if ( glyph_ids > valid->limit )
       FT_INVALID_TOO_SHORT;
 
@@ -349,7 +360,7 @@
       /* check range within 0..255 */
       if ( valid->level >= FT_VALIDATE_PARANOID )
       {
-        if ( first_code >= 256 || first_code + code_count > 256 )
+        if ( first_code >= 256 || code_count > 256 - first_code )
           FT_INVALID_DATA;
       }
 
@@ -401,7 +412,7 @@
     {
       FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );
       FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );
-      FT_Byte*  p       = table + 6;    /* keys table */
+      FT_Byte*  p       = table + 6;    /* keys table       */
       FT_Byte*  subs    = table + 518;  /* subheaders table */
       FT_Byte*  sub;
 
@@ -414,8 +425,8 @@
         sub = subs;  /* jump to first sub-header */
 
         /* check that the sub-header for this byte is 0, which */
-        /* indicates that it is really a valid one-byte value  */
-        /* Otherwise, return 0                                 */
+        /* indicates that it is really a valid one-byte value; */
+        /* otherwise, return 0                                 */
         /*                                                     */
         p += char_lo * 2;
         if ( TT_PEEK_USHORT( p ) != 0 )
@@ -434,8 +445,10 @@
         if ( sub == subs )
           goto Exit;
       }
+
       result = sub;
     }
+
   Exit:
     return result;
   }
@@ -475,6 +488,7 @@
           result = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU;
       }
     }
+
     return result;
   }
 
@@ -504,8 +518,19 @@
         FT_UInt   pos, idx;
 
 
+        if ( char_lo >= start + count && charcode <= 0xFF )
+        {
+          /* this happens only for a malformed cmap */
+          charcode = 0x100;
+          continue;
+        }
+
         if ( offset == 0 )
+        {
+          if ( charcode == 0x100 )
+            goto Exit; /* this happens only for a malformed cmap */
           goto Next_SubHeader;
+        }
 
         if ( char_lo < start )
         {
@@ -532,11 +557,20 @@
             }
           }
         }
+
+        /* if unsuccessful, avoid `charcode' leaving */
+        /* the current 256-character block           */
+        if ( count )
+          charcode--;
       }
 
-      /* jump to next sub-header, i.e. higher byte value */
+      /* If `charcode' is <= 0xFF, retry with `charcode + 1'.      */
+      /* Otherwise jump to the next 256-character block and retry. */
     Next_SubHeader:
-      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+      if ( charcode <= 0xFF )
+        charcode++;
+      else
+        charcode = FT_PAD_FLOOR( charcode, 0x100 ) + 0x100;
     }
 
   Exit:
@@ -562,22 +596,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap2_class_rec,
-    sizeof ( TT_CMapRec ),
 
-    (FT_CMap_InitFunc)     tt_cmap_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap2_char_next,
+      sizeof ( TT_CMapRec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap_init,         /* init       */
+      (FT_CMap_DoneFunc)     NULL,                 /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap2_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap2_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     2,
-    (TT_CMap_ValidateFunc)tt_cmap2_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap2_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap2_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap2_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_2 */
 
@@ -754,6 +790,9 @@
   static void
   tt_cmap4_next( TT_CMap4  cmap )
   {
+    TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
+    FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
     FT_UInt  charcode;
 
 
@@ -765,7 +804,7 @@
     if ( charcode < cmap->cur_start )
       charcode = cmap->cur_start;
 
-    for ( ;; )
+    for (;;)
     {
       FT_Byte*  values = cmap->cur_values;
       FT_UInt   end    = cmap->cur_end;
@@ -779,15 +818,19 @@
           FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );
 
 
+          /* if p > limit, the whole segment is invalid */
+          if ( p > limit )
+            goto Next_Segment;
+
           do
           {
             FT_UInt  gindex = FT_NEXT_USHORT( p );
 
 
-            if ( gindex != 0 )
+            if ( gindex )
             {
               gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU;
-              if ( gindex != 0 )
+              if ( gindex )
               {
                 cmap->cur_charcode = charcode;
                 cmap->cur_gindex   = gindex;
@@ -803,7 +846,26 @@
             FT_UInt  gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU;
 
 
-            if ( gindex != 0 )
+            if ( gindex >= (FT_UInt)face->root.num_glyphs )
+            {
+              /* we have an invalid glyph index; if there is an overflow, */
+              /* we can adjust `charcode', otherwise the whole segment is */
+              /* invalid                                                  */
+              gindex = 0;
+
+              if ( (FT_Int)charcode + delta < 0 &&
+                   (FT_Int)end + delta >= 0     )
+                charcode = (FT_UInt)( -delta );
+
+              else if ( (FT_Int)charcode + delta < 0x10000L &&
+                        (FT_Int)end + delta >= 0x10000L     )
+                charcode = (FT_UInt)( 0x10000L - delta );
+
+              else
+                goto Next_Segment;
+            }
+
+            if ( gindex )
             {
               cmap->cur_charcode = charcode;
               cmap->cur_gindex   = gindex;
@@ -813,6 +875,7 @@
         }
       }
 
+    Next_Segment:
       /* we need to find another range */
       if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
         break;
@@ -973,7 +1036,7 @@
           /* segment if it contains only a single character.     */
           /*                                                     */
           /* We thus omit the test here, delaying it to the      */
-          /* routines which actually access the cmap.            */
+          /* routines that actually access the cmap.             */
           else if ( n != num_segs - 1                       ||
                     !( start == 0xFFFFU && end == 0xFFFFU ) )
           {
@@ -1026,12 +1089,17 @@
                             FT_UInt32*  pcharcode,
                             FT_Bool     next )
   {
+    TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+    FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
     FT_UInt    num_segs2, start, end, offset;
     FT_Int     delta;
     FT_UInt    i, num_segs;
     FT_UInt32  charcode = *pcharcode;
     FT_UInt    gindex   = 0;
     FT_Byte*   p;
+    FT_Byte*   q;
 
 
     p = cmap->data + 6;
@@ -1045,65 +1113,106 @@
     if ( next )
       charcode++;
 
+    if ( charcode > 0xFFFFU )
+      return 0;
+
     /* linear search */
-    for ( ; charcode <= 0xFFFFU; charcode++ )
+    p = cmap->data + 14;               /* ends table   */
+    q = cmap->data + 16 + num_segs2;   /* starts table */
+
+    for ( i = 0; i < num_segs; i++ )
     {
-      FT_Byte*  q;
+      end   = TT_NEXT_USHORT( p );
+      start = TT_NEXT_USHORT( q );
 
-
-      p = cmap->data + 14;               /* ends table   */
-      q = cmap->data + 16 + num_segs2;   /* starts table */
-
-      for ( i = 0; i < num_segs; i++ )
+      if ( charcode < start )
       {
-        end   = TT_NEXT_USHORT( p );
-        start = TT_NEXT_USHORT( q );
-
-        if ( charcode >= start && charcode <= end )
-        {
-          p       = q - 2 + num_segs2;
-          delta   = TT_PEEK_SHORT( p );
-          p      += num_segs2;
-          offset  = TT_PEEK_USHORT( p );
-
-          /* some fonts have an incorrect last segment; */
-          /* we have to catch it                        */
-          if ( i >= num_segs - 1                  &&
-               start == 0xFFFFU && end == 0xFFFFU )
-          {
-            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
-            FT_Byte*  limit = face->cmap_table + face->cmap_size;
-
-
-            if ( offset && p + offset + 2 > limit )
-            {
-              delta  = 1;
-              offset = 0;
-            }
-          }
-
-          if ( offset == 0xFFFFU )
-            continue;
-
-          if ( offset )
-          {
-            p += offset + ( charcode - start ) * 2;
-            gindex = TT_PEEK_USHORT( p );
-            if ( gindex != 0 )
-              gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU;
-          }
-          else
-            gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU;
-
+        if ( next )
+          charcode = start;
+        else
           break;
-        }
       }
 
-      if ( !next || gindex )
+    Again:
+      if ( charcode <= end )
+      {
+        FT_Byte*  r;
+
+
+        r       = q - 2 + num_segs2;
+        delta   = TT_PEEK_SHORT( r );
+        r      += num_segs2;
+        offset  = TT_PEEK_USHORT( r );
+
+        /* some fonts have an incorrect last segment; */
+        /* we have to catch it                        */
+        if ( i >= num_segs - 1                  &&
+             start == 0xFFFFU && end == 0xFFFFU )
+        {
+          if ( offset && r + offset + 2 > limit )
+          {
+            delta  = 1;
+            offset = 0;
+          }
+        }
+
+        if ( offset == 0xFFFFU )
+          continue;
+
+        if ( offset )
+        {
+          r += offset + ( charcode - start ) * 2;
+
+          /* if r > limit, the whole segment is invalid */
+          if ( next && r > limit )
+            continue;
+
+          gindex = TT_PEEK_USHORT( r );
+          if ( gindex )
+          {
+            gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU;
+            if ( gindex >= (FT_UInt)face->root.num_glyphs )
+              gindex = 0;
+          }
+        }
+        else
+        {
+          gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU;
+
+          if ( next && gindex >= (FT_UInt)face->root.num_glyphs )
+          {
+            /* we have an invalid glyph index; if there is an overflow, */
+            /* we can adjust `charcode', otherwise the whole segment is */
+            /* invalid                                                  */
+            gindex = 0;
+
+            if ( (FT_Int)charcode + delta < 0 &&
+                 (FT_Int)end + delta >= 0     )
+              charcode = (FT_UInt)( -delta );
+
+            else if ( (FT_Int)charcode + delta < 0x10000L &&
+                      (FT_Int)end + delta >= 0x10000L     )
+              charcode = (FT_UInt)( 0x10000L - delta );
+
+            else
+              continue;
+          }
+        }
+
+        if ( next && !gindex )
+        {
+          if ( charcode >= 0xFFFFU )
+            break;
+
+          charcode++;
+          goto Again;
+        }
+
         break;
+      }
     }
 
-    if ( next && gindex )
+    if ( next )
       *pcharcode = charcode;
 
     return gindex;
@@ -1115,6 +1224,9 @@
                             FT_UInt32*  pcharcode,
                             FT_Bool     next )
   {
+    TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+    FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
     FT_UInt   num_segs2, start, end, offset;
     FT_Int    delta;
     FT_UInt   max, min, mid, num_segs;
@@ -1166,10 +1278,6 @@
         if ( mid >= num_segs - 1                &&
              start == 0xFFFFU && end == 0xFFFFU )
         {
-          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
-          FT_Byte*  limit = face->cmap_table + face->cmap_size;
-
-
           if ( offset && p + offset + 2 > limit )
           {
             delta  = 1;
@@ -1190,7 +1298,7 @@
             mid = max + 1;
 
           /* search in segments before the current segment */
-          for ( i = max ; i > 0; i-- )
+          for ( i = max; i > 0; i-- )
           {
             FT_UInt   prev_end;
             FT_Byte*  old_p;
@@ -1292,13 +1400,40 @@
         if ( offset )
         {
           p += offset + ( charcode - start ) * 2;
+
+          /* if p > limit, the whole segment is invalid */
+          if ( next && p > limit )
+            break;
+
           gindex = TT_PEEK_USHORT( p );
-          if ( gindex != 0 )
+          if ( gindex )
+          {
             gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU;
+            if ( gindex >= (FT_UInt)face->root.num_glyphs )
+              gindex = 0;
+          }
         }
         else
+        {
           gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU;
 
+          if ( next && gindex >= (FT_UInt)face->root.num_glyphs )
+          {
+            /* we have an invalid glyph index; if there is an overflow, */
+            /* we can adjust `charcode', otherwise the whole segment is */
+            /* invalid                                                  */
+            gindex = 0;
+
+            if ( (FT_Int)charcode + delta < 0 &&
+                 (FT_Int)end + delta >= 0     )
+              charcode = (FT_UInt)( -delta );
+
+            else if ( (FT_Int)charcode + delta < 0x10000L &&
+                      (FT_Int)end + delta >= 0x10000L     )
+              charcode = (FT_UInt)( 0x10000L - delta );
+          }
+        }
+
         break;
       }
     }
@@ -1310,7 +1445,6 @@
 
       /* if `charcode' is not in any segment, then `mid' is */
       /* the segment nearest to `charcode'                  */
-      /*                                                    */
 
       if ( charcode > end )
       {
@@ -1409,21 +1543,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap4_class_rec,
-    sizeof ( TT_CMap4Rec ),
-    (FT_CMap_InitFunc)     tt_cmap4_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap4_char_next,
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      sizeof ( TT_CMap4Rec ),
+
+      (FT_CMap_InitFunc)     tt_cmap4_init,        /* init       */
+      (FT_CMap_DoneFunc)     NULL,                 /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap4_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap4_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     4,
-    (TT_CMap_ValidateFunc)tt_cmap4_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap4_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap4_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap4_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_4 */
 
@@ -1443,7 +1580,7 @@
   /*                                                                       */
   /*   NAME        OFFSET          TYPE             DESCRIPTION            */
   /*                                                                       */
-  /*   format       0              USHORT           must be 4              */
+  /*   format       0              USHORT           must be 6              */
   /*   length       2              USHORT           table length in bytes  */
   /*   language     4              USHORT           Mac language code      */
   /*                                                                       */
@@ -1511,6 +1648,7 @@
       p += 2 * idx;
       result = TT_PEEK_USHORT( p );
     }
+
     return result;
   }
 
@@ -1531,7 +1669,7 @@
 
 
     if ( char_code >= 0x10000UL )
-      goto Exit;
+      return 0;
 
     if ( char_code < start )
       char_code = start;
@@ -1547,10 +1685,13 @@
         result = char_code;
         break;
       }
+
+      if ( char_code >= 0xFFFFU )
+        return 0;
+
       char_code++;
     }
 
-  Exit:
     *pchar_code = result;
     return gindex;
   }
@@ -1572,22 +1713,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap6_class_rec,
-    sizeof ( TT_CMapRec ),
 
-    (FT_CMap_InitFunc)     tt_cmap_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap6_char_next,
+      sizeof ( TT_CMapRec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap_init,         /* init       */
+      (FT_CMap_DoneFunc)     NULL,                 /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap6_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap6_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     6,
-    (TT_CMap_ValidateFunc)tt_cmap6_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap6_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap6_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap6_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_6 */
 
@@ -1602,7 +1745,7 @@
   /*****                                                               *****/
   /***** The purpose of this format is to easily map UTF-16 text to    *****/
   /***** glyph indices.  Basically, the `char_code' must be in one of  *****/
-  /***** the following formats:                                        *****/
+  /***** the following formats.                                        *****/
   /*****                                                               *****/
   /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/
   /*****     Area (i.e. U+D800-U+DFFF).                                *****/
@@ -1615,7 +1758,7 @@
   /***** The `is32' table embedded in the charmap indicates whether a  *****/
   /***** given 16-bit value is in the surrogates area or not.          *****/
   /*****                                                               *****/
-  /***** So, for any given `char_code', we can assert the following:   *****/
+  /***** So, for any given `char_code', we can assert the following.   *****/
   /*****                                                               *****/
   /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/
   /*****                                                               *****/
@@ -1770,7 +1913,10 @@
 
       if ( char_code <= end )
       {
-        result = (FT_UInt)( start_id + char_code - start );
+        if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) )
+          return 0;
+
+        result = (FT_UInt)( start_id + ( char_code - start ) );
         break;
       }
     }
@@ -1782,8 +1928,9 @@
   tt_cmap8_char_next( TT_CMap     cmap,
                       FT_UInt32  *pchar_code )
   {
+    FT_Face    face       = cmap->cmap.charmap.face;
     FT_UInt32  result     = 0;
-    FT_UInt32  char_code  = *pchar_code + 1;
+    FT_UInt32  char_code;
     FT_UInt    gindex     = 0;
     FT_Byte*   table      = cmap->data;
     FT_Byte*   p          = table + 8204;
@@ -1791,6 +1938,11 @@
     FT_UInt32  start, end, start_id;
 
 
+    if ( *pchar_code >= 0xFFFFFFFFUL )
+      return 0;
+
+    char_code = *pchar_code + 1;
+
     p = table + 8208;
 
     for ( ; num_groups > 0; num_groups-- )
@@ -1802,18 +1954,38 @@
       if ( char_code < start )
         char_code = start;
 
+    Again:
       if ( char_code <= end )
       {
-        gindex = (FT_UInt)( char_code - start + start_id );
-        if ( gindex != 0 )
+        /* ignore invalid group */
+        if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) )
+          continue;
+
+        gindex = (FT_UInt)( start_id + ( char_code - start ) );
+
+        /* does first element of group point to `.notdef' glyph? */
+        if ( gindex == 0 )
         {
-          result = char_code;
-          goto Exit;
+          if ( char_code >= 0xFFFFFFFFUL )
+            break;
+
+          char_code++;
+          goto Again;
         }
+
+        /* if `gindex' is invalid, the remaining values */
+        /* in this group are invalid, too               */
+        if ( gindex >= (FT_UInt)face->num_glyphs )
+        {
+          gindex = 0;
+          continue;
+        }
+
+        result = char_code;
+        break;
       }
     }
 
-  Exit:
     *pchar_code = result;
     return gindex;
   }
@@ -1835,22 +2007,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap8_class_rec,
-    sizeof ( TT_CMapRec ),
 
-    (FT_CMap_InitFunc)     tt_cmap_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap8_char_next,
+      sizeof ( TT_CMapRec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap_init,         /* init       */
+      (FT_CMap_DoneFunc)     NULL,                 /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap8_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap8_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     8,
-    (TT_CMap_ValidateFunc)tt_cmap8_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap8_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap8_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap8_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_8 */
 
@@ -1930,14 +2104,20 @@
     FT_Byte*   p      = table + 12;
     FT_UInt32  start  = TT_NEXT_ULONG( p );
     FT_UInt32  count  = TT_NEXT_ULONG( p );
-    FT_UInt32  idx    = (FT_ULong)( char_code - start );
+    FT_UInt32  idx;
 
 
+    if ( char_code < start )
+      return 0;
+
+    idx = char_code - start;
+
     if ( idx < count )
     {
       p     += 2 * idx;
       result = TT_PEEK_USHORT( p );
     }
+
     return result;
   }
 
@@ -1947,7 +2127,7 @@
                        FT_UInt32  *pchar_code )
   {
     FT_Byte*   table     = cmap->data;
-    FT_UInt32  char_code = *pchar_code + 1;
+    FT_UInt32  char_code;
     FT_UInt    gindex    = 0;
     FT_Byte*   p         = table + 12;
     FT_UInt32  start     = TT_NEXT_ULONG( p );
@@ -1955,10 +2135,15 @@
     FT_UInt32  idx;
 
 
+    if ( *pchar_code >= 0xFFFFFFFFUL )
+      return 0;
+
+    char_code = *pchar_code + 1;
+
     if ( char_code < start )
       char_code = start;
 
-    idx = (FT_UInt32)( char_code - start );
+    idx = char_code - start;
     p  += 2 * idx;
 
     for ( ; idx < count; idx++ )
@@ -1966,6 +2151,10 @@
       gindex = TT_NEXT_USHORT( p );
       if ( gindex != 0 )
         break;
+
+      if ( char_code >= 0xFFFFFFFFUL )
+        return 0;
+
       char_code++;
     }
 
@@ -1990,22 +2179,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap10_class_rec,
-    sizeof ( TT_CMapRec ),
 
-    (FT_CMap_InitFunc)     tt_cmap_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap10_char_next,
+      sizeof ( TT_CMapRec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap_init,          /* init       */
+      (FT_CMap_DoneFunc)     NULL,                  /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap10_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap10_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     10,
-    (TT_CMap_ValidateFunc)tt_cmap10_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap10_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap10_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap10_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_10 */
 
@@ -2134,6 +2325,7 @@
   static void
   tt_cmap12_next( TT_CMap12  cmap )
   {
+    FT_Face   face = cmap->cmap.cmap.charmap.face;
     FT_Byte*  p;
     FT_ULong  start, end, start_id, char_code;
     FT_ULong  n;
@@ -2155,18 +2347,38 @@
       if ( char_code < start )
         char_code = start;
 
-      for ( ; char_code <= end; char_code++ )
+    Again:
+      if ( char_code <= end )
       {
-        gindex = (FT_UInt)( start_id + char_code - start );
+        /* ignore invalid group */
+        if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) )
+          continue;
 
-        if ( gindex )
+        gindex = (FT_UInt)( start_id + ( char_code - start ) );
+
+        /* does first element of group point to `.notdef' glyph? */
+        if ( gindex == 0 )
         {
-          cmap->cur_charcode = char_code;;
-          cmap->cur_gindex   = gindex;
-          cmap->cur_group    = n;
+          if ( char_code >= 0xFFFFFFFFUL )
+            goto Fail;
 
-          return;
+          char_code++;
+          goto Again;
         }
+
+        /* if `gindex' is invalid, the remaining values */
+        /* in this group are invalid, too               */
+        if ( gindex >= (FT_UInt)face->num_glyphs )
+        {
+          gindex = 0;
+          continue;
+        }
+
+        cmap->cur_charcode = char_code;
+        cmap->cur_gindex   = gindex;
+        cmap->cur_group    = n;
+
+        return;
       }
     }
 
@@ -2196,7 +2408,12 @@
     end = 0xFFFFFFFFUL;
 
     if ( next )
+    {
+      if ( char_code >= 0xFFFFFFFFUL )
+        return 0;
+
       char_code++;
+    }
 
     min = 0;
     max = num_groups;
@@ -2217,20 +2434,24 @@
       else
       {
         start_id = TT_PEEK_ULONG( p );
-        gindex = (FT_UInt)( start_id + char_code - start );
 
+        /* reject invalid glyph index */
+        if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) )
+          gindex = 0;
+        else
+          gindex = (FT_UInt)( start_id + ( char_code - start ) );
         break;
       }
     }
 
     if ( next )
     {
+      FT_Face    face   = cmap->cmap.charmap.face;
       TT_CMap12  cmap12 = (TT_CMap12)cmap;
 
 
       /* if `char_code' is not in any group, then `mid' is */
       /* the group nearest to `char_code'                  */
-      /*                                                   */
 
       if ( char_code > end )
       {
@@ -2243,6 +2464,9 @@
       cmap12->cur_charcode = char_code;
       cmap12->cur_group    = mid;
 
+      if ( gindex >= (FT_UInt)face->num_glyphs )
+        gindex = 0;
+
       if ( !gindex )
       {
         tt_cmap12_next( cmap12 );
@@ -2253,8 +2477,7 @@
       else
         cmap12->cur_gindex = gindex;
 
-      if ( gindex )
-        *pchar_code = cmap12->cur_charcode;
+      *pchar_code = cmap12->cur_charcode;
     }
 
     return gindex;
@@ -2274,23 +2497,17 @@
                        FT_UInt32  *pchar_code )
   {
     TT_CMap12  cmap12 = (TT_CMap12)cmap;
-    FT_ULong   gindex;
+    FT_UInt    gindex;
 
 
-    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
-      return 0;
-
     /* no need to search */
     if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
     {
       tt_cmap12_next( cmap12 );
       if ( cmap12->valid )
       {
-        gindex = cmap12->cur_gindex;
-
-        /* XXX: check cur_charcode overflow is expected */
-        if ( gindex )
-          *pchar_code = (FT_UInt32)cmap12->cur_charcode;
+        gindex      = cmap12->cur_gindex;
+        *pchar_code = (FT_UInt32)cmap12->cur_charcode;
       }
       else
         gindex = 0;
@@ -2298,8 +2515,7 @@
     else
       gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
 
-    /* XXX: check gindex overflow is expected */
-    return (FT_UInt32)gindex;
+    return gindex;
   }
 
 
@@ -2319,22 +2535,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap12_class_rec,
-    sizeof ( TT_CMap12Rec ),
 
-    (FT_CMap_InitFunc)     tt_cmap12_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap12_char_next,
+      sizeof ( TT_CMap12Rec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap12_init,        /* init       */
+      (FT_CMap_DoneFunc)     NULL,                  /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap12_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap12_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     12,
-    (TT_CMap_ValidateFunc)tt_cmap12_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap12_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap12_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap12_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_12 */
 
@@ -2458,6 +2676,7 @@
   static void
   tt_cmap13_next( TT_CMap13  cmap )
   {
+    FT_Face   face = cmap->cmap.cmap.charmap.face;
     FT_Byte*  p;
     FT_ULong  start, end, glyph_id, char_code;
     FT_ULong  n;
@@ -2483,9 +2702,9 @@
       {
         gindex = (FT_UInt)glyph_id;
 
-        if ( gindex )
+        if ( gindex && gindex < (FT_UInt)face->num_glyphs )
         {
-          cmap->cur_charcode = char_code;;
+          cmap->cur_charcode = char_code;
           cmap->cur_gindex   = gindex;
           cmap->cur_group    = n;
 
@@ -2520,7 +2739,12 @@
     end = 0xFFFFFFFFUL;
 
     if ( next )
+    {
+      if ( char_code >= 0xFFFFFFFFUL )
+        return 0;
+
       char_code++;
+    }
 
     min = 0;
     max = num_groups;
@@ -2548,6 +2772,7 @@
 
     if ( next )
     {
+      FT_Face    face   = cmap->cmap.charmap.face;
       TT_CMap13  cmap13 = (TT_CMap13)cmap;
 
 
@@ -2565,6 +2790,9 @@
       cmap13->cur_charcode = char_code;
       cmap13->cur_group    = mid;
 
+      if ( gindex >= (FT_UInt)face->num_glyphs )
+        gindex = 0;
+
       if ( !gindex )
       {
         tt_cmap13_next( cmap13 );
@@ -2575,8 +2803,7 @@
       else
         cmap13->cur_gindex = gindex;
 
-      if ( gindex )
-        *pchar_code = cmap13->cur_charcode;
+      *pchar_code = cmap13->cur_charcode;
     }
 
     return gindex;
@@ -2599,18 +2826,14 @@
     FT_UInt    gindex;
 
 
-    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
-      return 0;
-
     /* no need to search */
     if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
     {
       tt_cmap13_next( cmap13 );
       if ( cmap13->valid )
       {
-        gindex = cmap13->cur_gindex;
-        if ( gindex )
-          *pchar_code = cmap13->cur_charcode;
+        gindex      = cmap13->cur_gindex;
+        *pchar_code = cmap13->cur_charcode;
       }
       else
         gindex = 0;
@@ -2638,22 +2861,24 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap13_class_rec,
-    sizeof ( TT_CMap13Rec ),
 
-    (FT_CMap_InitFunc)     tt_cmap13_init,
-    (FT_CMap_DoneFunc)     NULL,
-    (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap13_char_next,
+      sizeof ( TT_CMap13Rec ),
 
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+      (FT_CMap_InitFunc)     tt_cmap13_init,        /* init       */
+      (FT_CMap_DoneFunc)     NULL,                  /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap13_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap13_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
 
     13,
-    (TT_CMap_ValidateFunc)tt_cmap13_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap13_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap13_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap13_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_13 */
 
@@ -2744,7 +2969,7 @@
 
 
     cmap->max_results = 0;
-    if ( memory != NULL && cmap->results != NULL )
+    if ( memory && cmap->results )
       FT_FREE( cmap->results );
   }
 
@@ -2836,17 +3061,22 @@
         /* through the normal Unicode cmap, no GIDs, just check order) */
         if ( defOff != 0 )
         {
-          FT_Byte*  defp      = table + defOff;
-          FT_ULong  numRanges = TT_NEXT_ULONG( defp );
+          FT_Byte*  defp     = table + defOff;
+          FT_ULong  numRanges;
           FT_ULong  i;
-          FT_ULong  lastBase  = 0;
+          FT_ULong  lastBase = 0;
 
 
+          if ( defp + 4 > valid->limit )
+            FT_INVALID_TOO_SHORT;
+
+          numRanges = TT_NEXT_ULONG( defp );
+
           /* defp + numRanges * 4 > valid->limit ? */
           if ( numRanges > (FT_ULong)( valid->limit - defp ) / 4 )
             FT_INVALID_TOO_SHORT;
 
-          for ( i = 0; i < numRanges; ++i )
+          for ( i = 0; i < numRanges; i++ )
           {
             FT_ULong  base = TT_NEXT_UINT24( defp );
             FT_ULong  cnt  = FT_NEXT_BYTE( defp );
@@ -2865,16 +3095,21 @@
         /* and the non-default table (these glyphs are specified here) */
         if ( nondefOff != 0 )
         {
-          FT_Byte*  ndp         = table + nondefOff;
-          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );
-          FT_ULong  i, lastUni  = 0;
+          FT_Byte*  ndp        = table + nondefOff;
+          FT_ULong  numMappings;
+          FT_ULong  i, lastUni = 0;
 
 
-          /* numMappings * 4 > (FT_ULong)( valid->limit - ndp ) ? */
-          if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 4 )
+          if ( ndp + 4 > valid->limit )
             FT_INVALID_TOO_SHORT;
 
-          for ( i = 0; i < numMappings; ++i )
+          numMappings = TT_NEXT_ULONG( ndp );
+
+          /* numMappings * 5 > (FT_ULong)( valid->limit - ndp ) ? */
+          if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 5 )
+            FT_INVALID_TOO_SHORT;
+
+          for ( i = 0; i < numMappings; i++ )
           {
             FT_ULong  uni = TT_NEXT_UINT24( ndp );
             FT_ULong  gid = TT_NEXT_USHORT( ndp );
@@ -2962,7 +3197,7 @@
 
       if ( char_code < start )
         max = mid;
-      else if ( char_code > start+cnt )
+      else if ( char_code > start + cnt )
         min = mid + 1;
       else
         return TRUE;
@@ -3115,7 +3350,7 @@
       return NULL;
 
     result = cmap14->results;
-    for ( i = 0; i < count; ++i )
+    for ( i = 0; i < count; i++ )
     {
       result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
       p        += 8;
@@ -3140,7 +3375,7 @@
     if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
       return NULL;
 
-    for ( q = cmap14->results; count > 0; --count )
+    for ( q = cmap14->results; count > 0; count-- )
     {
       FT_UInt32  varSel    = TT_NEXT_UINT24( p );
       FT_ULong   defOff    = TT_NEXT_ULONG( p );
@@ -3199,7 +3434,7 @@
     if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
       return NULL;
 
-    for ( q = cmap14->results; numRanges > 0; --numRanges )
+    for ( q = cmap14->results; numRanges > 0; numRanges-- )
     {
       FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
 
@@ -3236,7 +3471,7 @@
       return NULL;
 
     ret = cmap14->results;
-    for ( i = 0; i < numMappings; ++i )
+    for ( i = 0; i < numMappings; i++ )
     {
       ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
       p += 2;
@@ -3316,14 +3551,14 @@
       ni   = 1;
       i    = 0;
 
-      for ( ;; )
+      for (;;)
       {
         if ( nuni > duni + dcnt )
         {
-          for ( k = 0; k <= dcnt; ++k )
+          for ( k = 0; k <= dcnt; k++ )
             ret[i++] = duni + k;
 
-          ++di;
+          di++;
 
           if ( di > numRanges )
             break;
@@ -3337,7 +3572,7 @@
             ret[i++] = nuni;
           /* If it is within the default range then ignore it -- */
           /* that should not have happened                       */
-          ++ni;
+          ni++;
           if ( ni > numMappings )
             break;
 
@@ -3356,7 +3591,7 @@
         {
           ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
           p += 2;
-          ++ni;
+          ni++;
         }
       }
       else if ( di <= numRanges )
@@ -3364,7 +3599,7 @@
         /* If we get here then we have run out of all non-default     */
         /* mappings.  We have read one default range which we haven't */
         /* stored and there may be others that need to be read.       */
-        for ( k = 0; k <= dcnt; ++k )
+        for ( k = 0; k <= dcnt; k++ )
           ret[i++] = duni + k;
 
         while ( di < numRanges )
@@ -3372,9 +3607,9 @@
           duni = (FT_UInt32)TT_NEXT_UINT24( dp );
           dcnt = FT_NEXT_BYTE( dp );
 
-          for ( k = 0; k <= dcnt; ++k )
+          for ( k = 0; k <= dcnt; k++ )
             ret[i++] = duni + k;
-          ++di;
+          di++;
         }
       }
 
@@ -3387,27 +3622,133 @@
 
   FT_DEFINE_TT_CMAP(
     tt_cmap14_class_rec,
-    sizeof ( TT_CMap14Rec ),
 
-    (FT_CMap_InitFunc)     tt_cmap14_init,
-    (FT_CMap_DoneFunc)     tt_cmap14_done,
-    (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
-    (FT_CMap_CharNextFunc) tt_cmap14_char_next,
+      sizeof ( TT_CMap14Rec ),
 
-    /* Format 14 extension functions */
-    (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,
-    (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
-    (FT_CMap_VariantListFunc)     tt_cmap14_variants,
-    (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
-    (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,
+      (FT_CMap_InitFunc)     tt_cmap14_init,        /* init       */
+      (FT_CMap_DoneFunc)     tt_cmap14_done,        /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap14_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap14_char_next,   /* char_next  */
+
+      /* Format 14 extension functions */
+      (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,
+      (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
+      (FT_CMap_VariantListFunc)     tt_cmap14_variants,
+      (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
+      (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars,
 
     14,
-    (TT_CMap_ValidateFunc)tt_cmap14_validate,
-    (TT_CMap_Info_GetFunc)tt_cmap14_get_info )
+    (TT_CMap_ValidateFunc)tt_cmap14_validate,  /* validate      */
+    (TT_CMap_Info_GetFunc)tt_cmap14_get_info   /* get_cmap_info */
+  )
 
 #endif /* TT_CONFIG_CMAP_FORMAT_14 */
 
 
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       SYNTHETIC UNICODE                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*        This charmap is generated using postscript glyph names.        */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+  FT_CALLBACK_DEF( const char * )
+  tt_get_glyph_name( TT_Face  face,
+                     FT_UInt  idx )
+  {
+    FT_String*  PSname;
+
+
+    tt_face_get_ps_name( face, idx, &PSname );
+
+    return PSname;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap_unicode_init( PS_Unicodes  unicodes,
+                        FT_Pointer   pointer )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+    FT_UNUSED( pointer );
+
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   face->root.num_glyphs,
+                                   (PS_GetGlyphNameFunc)&tt_get_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  tt_cmap_unicode_done( PS_Unicodes  unicodes )
+  {
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                              FT_UInt32    char_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_index( unicodes, char_code );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                             FT_UInt32   *pchar_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap_unicode_class_rec,
+
+      sizeof ( PS_UnicodesRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_unicode_init,        /* init       */
+      (FT_CMap_DoneFunc)     tt_cmap_unicode_done,        /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap_unicode_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap_unicode_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
+
+    ~0U,
+    (TT_CMap_ValidateFunc)NULL,  /* validate      */
+    (TT_CMap_Info_GetFunc)NULL   /* get_cmap_info */
+  )
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
 #ifndef FT_CONFIG_OPTION_PIC
 
   static const TT_CMap_Class  tt_cmap_classes[] =
@@ -3542,7 +3883,7 @@
               error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
             }
 
-            if ( valid.validator.error == 0 )
+            if ( !valid.validator.error )
             {
               FT_CMap  ttcmap;
 
@@ -3568,7 +3909,7 @@
           }
         }
 
-        if ( *pclazz == NULL )
+        if ( !*pclazz )
         {
           FT_TRACE0(( "tt_face_build_cmaps:"
                       " unsupported cmap sub-table ignored\n" ));
@@ -3587,8 +3928,10 @@
     FT_CMap        cmap  = (FT_CMap)charmap;
     TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
 
-
-    return clazz->get_cmap_info( charmap, cmap_info );
+    if ( clazz->get_cmap_info )
+      return clazz->get_cmap_info( charmap, cmap_info );
+    else
+      return FT_THROW( Invalid_CharMap_Format );
   }
 
 
diff --git a/src/sfnt/ttcmap.h b/src/sfnt/ttcmap.h
index b7ea8ee..d264d99 100644
--- a/src/sfnt/ttcmap.h
+++ b/src/sfnt/ttcmap.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType character mapping table (cmap) support (specification).     */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTCMAP_H__
-#define __TTCMAP_H__
+#ifndef TTCMAP_H_
+#define TTCMAP_H_
 
 
 #include <ft2build.h>
@@ -141,6 +141,8 @@
 #define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs
 
 
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap_unicode_class_rec;
+
   FT_LOCAL( FT_Error )
   tt_face_build_cmaps( TT_Face  face );
 
@@ -152,7 +154,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTCMAP_H__ */
+#endif /* TTCMAP_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttcmapc.h b/src/sfnt/ttcmapc.h
index 4a48940..4980e9d 100644
--- a/src/sfnt/ttcmapc.h
+++ b/src/sfnt/ttcmapc.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TT CMAP classes definitions (specification only).                    */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/sfnt/ttkern.c b/src/sfnt/ttkern.c
index 4fccc53..68f15a2 100644
--- a/src/sfnt/ttkern.c
+++ b/src/sfnt/ttkern.c
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType kerning table.  This doesn't handle          */
 /*    kerning data within the GPOS table at the moment.                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -85,7 +85,7 @@
 
     for ( nn = 0; nn < num_tables; nn++ )
     {
-      FT_UInt    num_pairs, length, coverage;
+      FT_UInt    num_pairs, length, coverage, format;
       FT_Byte*   p_next;
       FT_UInt32  mask = (FT_UInt32)1UL << nn;
 
@@ -107,9 +107,15 @@
       if ( p_next > p_limit )  /* handle broken table */
         p_next = p_limit;
 
+      format = coverage >> 8;
+
+      /* we currently only support format 0 kerning tables */
+      if ( format != 0 )
+        goto NextTable;
+
       /* only use horizontal kerning tables */
-      if ( ( coverage & ~8U ) != 0x0001 ||
-           p + 8 > p_limit              )
+      if ( ( coverage & 3U ) != 0x0001 ||
+           p + 8 > p_next              )
         goto NextTable;
 
       num_pairs = FT_NEXT_USHORT( p );
@@ -214,8 +220,7 @@
       if ( ( face->kern_avail_bits & mask ) == 0 )
         goto NextTable;
 
-      if ( p + 8 > next )
-        goto NextTable;
+      FT_ASSERT( p + 8 <= next ); /* tested in tt_face_load_kern */
 
       num_pairs = FT_NEXT_USHORT( p );
       p        += 6;
diff --git a/src/sfnt/ttkern.h b/src/sfnt/ttkern.h
index 89cb24f..4e45d09 100644
--- a/src/sfnt/ttkern.h
+++ b/src/sfnt/ttkern.h
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType kerning table.  This doesn't handle          */
 /*    kerning data within the GPOS table at the moment.                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTKERN_H__
-#define __TTKERN_H__
+#ifndef TTKERN_H_
+#define TTKERN_H_
 
 
 #include <ft2build.h>
@@ -46,7 +46,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTKERN_H__ */
+#endif /* TTKERN_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c
index ad2975d..a86a546 100644
--- a/src/sfnt/ttload.c
+++ b/src/sfnt/ttload.c
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType tables, i.e., tables that can be either in   */
 /*    TTF or OTF fonts (body).                                             */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -151,7 +151,8 @@
 
   /* Here, we                                                         */
   /*                                                                  */
-  /* - check that `num_tables' is valid (and adjust it if necessary)  */
+  /* - check that `num_tables' is valid (and adjust it if necessary); */
+  /*   also return the number of valid table entries                  */
   /*                                                                  */
   /* - look for a `head' table, check its size, and parse it to check */
   /*   whether its `magic' field is correctly set                     */
@@ -167,7 +168,8 @@
   /*                                                                  */
   static FT_Error
   check_table_dir( SFNT_Header  sfnt,
-                   FT_Stream    stream )
+                   FT_Stream    stream,
+                   FT_UShort*   valid )
   {
     FT_Error   error;
     FT_UShort  nn, valid_entries = 0;
@@ -209,7 +211,10 @@
       /* we ignore invalid tables */
 
       if ( table.Offset > stream->size )
+      {
+        FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
         continue;
+      }
       else if ( table.Length > stream->size - table.Offset )
       {
         /* Some tables have such a simple structure that clipping its     */
@@ -273,11 +278,11 @@
         has_meta = 1;
     }
 
-    sfnt->num_tables = valid_entries;
+    *valid = valid_entries;
 
-    if ( sfnt->num_tables == 0 )
+    if ( !valid_entries )
     {
-      FT_TRACE2(( "check_table_dir: no tables found\n" ));
+      FT_TRACE2(( "check_table_dir: no valid tables found\n" ));
       error = FT_THROW( Unknown_File_Format );
       goto Exit;
     }
@@ -333,8 +338,7 @@
     SFNT_HeaderRec  sfnt;
     FT_Error        error;
     FT_Memory       memory = stream->memory;
-    TT_TableRec*    entry;
-    FT_Int          nn;
+    FT_UShort       nn, valid_entries = 0;
 
     static const FT_Frame_Field  offset_table_fields[] =
     {
@@ -375,85 +379,114 @@
     if ( sfnt.format_tag != TTAG_OTTO )
     {
       /* check first */
-      error = check_table_dir( &sfnt, stream );
+      error = check_table_dir( &sfnt, stream, &valid_entries );
       if ( error )
       {
         FT_TRACE2(( "tt_face_load_font_dir:"
                     " invalid table directory for TrueType\n" ));
-
         goto Exit;
       }
     }
+    else
+      valid_entries = sfnt.num_tables;
 
-    face->num_tables = sfnt.num_tables;
+    face->num_tables = valid_entries;
     face->format_tag = sfnt.format_tag;
 
     if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
       goto Exit;
 
-    if ( FT_STREAM_SEEK( sfnt.offset + 12 )       ||
-         FT_FRAME_ENTER( face->num_tables * 16L ) )
+    if ( FT_STREAM_SEEK( sfnt.offset + 12 )      ||
+         FT_FRAME_ENTER( sfnt.num_tables * 16L ) )
       goto Exit;
 
-    entry = face->dir_tables;
-
     FT_TRACE2(( "\n"
                 "  tag    offset    length   checksum\n"
                 "  ----------------------------------\n" ));
 
+    valid_entries = 0;
     for ( nn = 0; nn < sfnt.num_tables; nn++ )
     {
-      entry->Tag      = FT_GET_TAG4();
-      entry->CheckSum = FT_GET_ULONG();
-      entry->Offset   = FT_GET_ULONG();
-      entry->Length   = FT_GET_ULONG();
+      TT_TableRec  entry;
+      FT_UShort    i;
+      FT_Bool      duplicate;
+
+
+      entry.Tag      = FT_GET_TAG4();
+      entry.CheckSum = FT_GET_ULONG();
+      entry.Offset   = FT_GET_ULONG();
+      entry.Length   = FT_GET_ULONG();
 
       /* ignore invalid tables that can't be sanitized */
 
-      if ( entry->Offset > stream->size )
+      if ( entry.Offset > stream->size )
         continue;
-      else if ( entry->Length > stream->size - entry->Offset )
+      else if ( entry.Length > stream->size - entry.Offset )
       {
-        if ( entry->Tag == TTAG_hmtx ||
-             entry->Tag == TTAG_vmtx )
+        if ( entry.Tag == TTAG_hmtx ||
+             entry.Tag == TTAG_vmtx )
         {
 #ifdef FT_DEBUG_LEVEL_TRACE
-          FT_ULong  old_length = entry->Length;
+          FT_ULong  old_length = entry.Length;
 #endif
 
 
           /* make metrics table length a multiple of 4 */
-          entry->Length = ( stream->size - entry->Offset ) & ~3U;
+          entry.Length = ( stream->size - entry.Offset ) & ~3U;
 
           FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx"
-                      " (sanitized; original length %08lx)\n",
-                      (FT_Char)( entry->Tag >> 24 ),
-                      (FT_Char)( entry->Tag >> 16 ),
-                      (FT_Char)( entry->Tag >> 8  ),
-                      (FT_Char)( entry->Tag       ),
-                      entry->Offset,
-                      entry->Length,
-                      entry->CheckSum,
+                      " (sanitized; original length %08lx)",
+                      (FT_Char)( entry.Tag >> 24 ),
+                      (FT_Char)( entry.Tag >> 16 ),
+                      (FT_Char)( entry.Tag >> 8  ),
+                      (FT_Char)( entry.Tag       ),
+                      entry.Offset,
+                      entry.Length,
+                      entry.CheckSum,
                       old_length ));
-          entry++;
         }
         else
           continue;
       }
+#ifdef FT_DEBUG_LEVEL_TRACE
+      else
+        FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx",
+                    (FT_Char)( entry.Tag >> 24 ),
+                    (FT_Char)( entry.Tag >> 16 ),
+                    (FT_Char)( entry.Tag >> 8  ),
+                    (FT_Char)( entry.Tag       ),
+                    entry.Offset,
+                    entry.Length,
+                    entry.CheckSum ));
+#endif
+
+      /* ignore duplicate tables – the first one wins */
+      duplicate = 0;
+      for ( i = 0; i < valid_entries; i++ )
+      {
+        if ( face->dir_tables[i].Tag == entry.Tag )
+        {
+          duplicate = 1;
+          break;
+        }
+      }
+      if ( duplicate )
+      {
+        FT_TRACE2(( "  (duplicate, ignored)\n" ));
+        continue;
+      }
       else
       {
-        FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx\n",
-                    (FT_Char)( entry->Tag >> 24 ),
-                    (FT_Char)( entry->Tag >> 16 ),
-                    (FT_Char)( entry->Tag >> 8  ),
-                    (FT_Char)( entry->Tag       ),
-                    entry->Offset,
-                    entry->Length,
-                    entry->CheckSum ));
-        entry++;
+        FT_TRACE2(( "\n" ));
+
+        /* we finally have a valid entry */
+        face->dir_tables[valid_entries++] = entry;
       }
     }
 
+    /* final adjustment to number of tables */
+    face->num_tables = valid_entries;
+
     FT_FRAME_EXIT();
 
     FT_TRACE2(( "table directory loaded\n\n" ));
@@ -646,7 +679,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    tt_face_load_max_profile                                           */
+  /*    tt_face_load_maxp                                                  */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Loads the maximum profile into a face object.                      */
@@ -742,15 +775,6 @@
 
         maxProfile->maxTwilightPoints = 0xFFFFU - 4;
       }
-
-      /* we arbitrarily limit recursion to avoid stack exhaustion */
-      if ( maxProfile->maxComponentDepth > 100 )
-      {
-        FT_TRACE0(( "tt_face_load_maxp:"
-                    " abnormally large component depth (%d) set to 100\n",
-                    maxProfile->maxComponentDepth ));
-        maxProfile->maxComponentDepth = 100;
-      }
     }
 
     FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
@@ -784,7 +808,6 @@
     FT_Memory     memory = stream->memory;
     FT_ULong      table_pos, table_len;
     FT_ULong      storage_start, storage_limit;
-    FT_UInt       count;
     TT_NameTable  table;
 
     static const FT_Frame_Field  name_table_fields[] =
@@ -802,7 +825,7 @@
     static const FT_Frame_Field  name_record_fields[] =
     {
 #undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_NameEntryRec
+#define FT_STRUCTURE  TT_NameRec
 
       /* no FT_FRAME_START */
         FT_FRAME_USHORT( platformID ),
@@ -814,6 +837,17 @@
       FT_FRAME_END
     };
 
+    static const FT_Frame_Field  langTag_record_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_LangTagRec
+
+      /* no FT_FRAME_START */
+        FT_FRAME_USHORT( stringLength ),
+        FT_FRAME_USHORT( stringOffset ),
+      FT_FRAME_END
+    };
+
 
     table         = &face->name_table;
     table->stream = stream;
@@ -824,18 +858,17 @@
 
     table_pos = FT_STREAM_POS();
 
-
     if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
       goto Exit;
 
-    /* Some popular Asian fonts have an invalid `storageOffset' value   */
-    /* (it should be at least "6 + 12*num_names").  However, the string */
-    /* offsets, computed as "storageOffset + entry->stringOffset", are  */
-    /* valid pointers within the name table...                          */
-    /*                                                                  */
-    /* We thus can't check `storageOffset' right now.                   */
-    /*                                                                  */
-    storage_start = table_pos + 6 + 12*table->numNameRecords;
+    /* Some popular Asian fonts have an invalid `storageOffset' value (it */
+    /* should be at least `6 + 12*numNameRecords').  However, the string  */
+    /* offsets, computed as `storageOffset + entry->stringOffset', are    */
+    /* valid pointers within the name table...                            */
+    /*                                                                    */
+    /* We thus can't check `storageOffset' right now.                     */
+    /*                                                                    */
+    storage_start = table_pos + 6 + 12 * table->numNameRecords;
     storage_limit = table_pos + table_len;
 
     if ( storage_start > storage_limit )
@@ -845,18 +878,56 @@
       goto Exit;
     }
 
-    /* Allocate the array of name records. */
-    count                 = table->numNameRecords;
-    table->numNameRecords = 0;
+    /* `name' format 1 contains additional language tag records, */
+    /* which we load first                                       */
+    if ( table->format == 1 )
+    {
+      if ( FT_STREAM_SEEK( storage_start )            ||
+           FT_READ_USHORT( table->numLangTagRecords ) )
+        goto Exit;
 
-    if ( FT_NEW_ARRAY( table->names, count ) ||
-         FT_FRAME_ENTER( count * 12 )        )
+      storage_start += 2 + 4 * table->numLangTagRecords;
+
+      /* allocate language tag records array */
+      if ( FT_NEW_ARRAY( table->langTags, table->numLangTagRecords ) ||
+           FT_FRAME_ENTER( table->numLangTagRecords * 4 )            )
+        goto Exit;
+
+      /* load language tags */
+      {
+        TT_LangTag  entry = table->langTags;
+        TT_LangTag  limit = entry + table->numLangTagRecords;
+
+
+        for ( ; entry < limit; entry++ )
+        {
+          (void)FT_STREAM_READ_FIELDS( langTag_record_fields, entry );
+
+          /* check that the langTag string is within the table */
+          entry->stringOffset += table_pos + table->storageOffset;
+          if ( entry->stringOffset                       < storage_start ||
+               entry->stringOffset + entry->stringLength > storage_limit )
+          {
+            /* invalid entry; ignore it */
+            entry->stringLength = 0;
+          }
+        }
+      }
+
+      FT_FRAME_EXIT();
+
+      (void)FT_STREAM_SEEK( table_pos + 6 );
+    }
+
+    /* allocate name records array */
+    if ( FT_NEW_ARRAY( table->names, table->numNameRecords ) ||
+         FT_FRAME_ENTER( table->numNameRecords * 12 )        )
       goto Exit;
 
-    /* Load the name records and determine how much storage is needed */
-    /* to hold the strings themselves.                                */
+    /* load name records */
     {
-      TT_NameEntryRec*  entry = table->names;
+      TT_Name  entry = table->names;
+      FT_UInt  count = table->numNameRecords;
 
 
       for ( ; count > 0; count-- )
@@ -873,22 +944,37 @@
         if ( entry->stringOffset                       < storage_start ||
              entry->stringOffset + entry->stringLength > storage_limit )
         {
-          /* invalid entry - ignore it */
-          entry->stringOffset = 0;
-          entry->stringLength = 0;
+          /* invalid entry; ignore it */
           continue;
         }
 
+        /* assure that we have a valid language tag ID, and   */
+        /* that the corresponding langTag entry is valid, too */
+        if ( table->format == 1 && entry->languageID >= 0x8000U )
+        {
+          if ( entry->languageID - 0x8000U >= table->numLangTagRecords    ||
+               !table->langTags[entry->languageID - 0x8000U].stringLength )
+          {
+            /* invalid entry; ignore it */
+            continue;
+          }
+        }
+
         entry++;
       }
 
-      table->numNameRecords = (FT_UInt)( entry - table->names );
+      /* reduce array size to the actually used elements */
+      count = (FT_UInt)( entry - table->names );
+      (void)FT_RENEW_ARRAY( table->names,
+                            table->numNameRecords,
+                            count );
+      table->numNameRecords = count;
     }
 
     FT_FRAME_EXIT();
 
     /* everything went well, update face->num_names */
-    face->num_names = (FT_UShort) table->numNameRecords;
+    face->num_names = (FT_UShort)table->numNameRecords;
 
   Exit:
     return error;
@@ -898,7 +984,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
-  /*    tt_face_free_names                                                 */
+  /*    tt_face_free_name                                                  */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Frees the name records.                                            */
@@ -911,25 +997,36 @@
   {
     FT_Memory     memory = face->root.driver->root.memory;
     TT_NameTable  table  = &face->name_table;
-    TT_NameEntry  entry  = table->names;
-    FT_UInt       count  = table->numNameRecords;
 
 
     if ( table->names )
     {
-      for ( ; count > 0; count--, entry++ )
-      {
-        FT_FREE( entry->string );
-        entry->stringLength = 0;
-      }
+      TT_Name  entry = table->names;
+      TT_Name  limit = entry + table->numNameRecords;
 
-      /* free strings table */
+
+      for ( ; entry < limit; entry++ )
+        FT_FREE( entry->string );
+
       FT_FREE( table->names );
     }
 
-    table->numNameRecords = 0;
-    table->format         = 0;
-    table->storageOffset  = 0;
+    if ( table->langTags )
+    {
+      TT_LangTag  entry = table->langTags;
+      TT_LangTag  limit = entry + table->numLangTagRecords;
+
+
+      for ( ; entry < limit; entry++ )
+        FT_FREE( entry->string );
+
+      FT_FREE( table->langTags );
+    }
+
+    table->numNameRecords    = 0;
+    table->numLangTagRecords = 0;
+    table->format            = 0;
+    table->storageOffset     = 0;
   }
 
 
@@ -1160,8 +1257,8 @@
 #define FT_STRUCTURE  TT_Postscript
 
       FT_FRAME_START( 32 ),
-        FT_FRAME_ULONG( FormatType ),
-        FT_FRAME_ULONG( italicAngle ),
+        FT_FRAME_LONG ( FormatType ),
+        FT_FRAME_LONG ( italicAngle ),
         FT_FRAME_SHORT( underlinePosition ),
         FT_FRAME_SHORT( underlineThickness ),
         FT_FRAME_ULONG( isFixedPitch ),
diff --git a/src/sfnt/ttload.h b/src/sfnt/ttload.h
index a6d91c5..f94be8b 100644
--- a/src/sfnt/ttload.h
+++ b/src/sfnt/ttload.h
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType tables, i.e., tables that can be either in   */
 /*    TTF or OTF fonts (specification).                                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTLOAD_H__
-#define __TTLOAD_H__
+#ifndef TTLOAD_H_
+#define TTLOAD_H_
 
 
 #include <ft2build.h>
@@ -106,7 +106,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTLOAD_H__ */
+#endif /* TTLOAD_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttmtx.c b/src/sfnt/ttmtx.c
index 58309aa..6ddda95 100644
--- a/src/sfnt/ttmtx.c
+++ b/src/sfnt/ttmtx.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Load the metrics tables common to TTF and OTF fonts (body).          */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,11 +20,24 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_SERVICE_METRICS_VARIATIONS_H
+#endif
+
 #include "ttmtx.h"
 
 #include "sferrors.h"
 
 
+  /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*            be identical except for the names of their fields,      */
+  /*            which are different.                                    */
+  /*                                                                    */
+  /*            This ensures that `tt_face_load_hmtx' is able to read   */
+  /*            both the horizontal and vertical headers.               */
+
+
   /*************************************************************************/
   /*                                                                       */
   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
@@ -214,6 +227,11 @@
     FT_ULong        table_pos, table_size, table_end;
     FT_UShort       k;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Service_MetricsVariations  var =
+      (FT_Service_MetricsVariations)face->var;
+#endif
+
 
     if ( vertical )
     {
@@ -274,6 +292,34 @@
       *abearing = 0;
       *aadvance = 0;
     }
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    if ( var )
+    {
+      FT_Face  f = FT_FACE( face );
+      FT_Int   a = (FT_Int)*aadvance;
+      FT_Int   b = (FT_Int)*abearing;
+
+
+      if ( vertical )
+      {
+        if ( var->vadvance_adjust )
+          var->vadvance_adjust( f, gindex, &a );
+        if ( var->tsb_adjust )
+          var->tsb_adjust( f, gindex, &b );
+      }
+      else
+      {
+        if ( var->hadvance_adjust )
+          var->hadvance_adjust( f, gindex, &a );
+        if ( var->lsb_adjust )
+          var->lsb_adjust( f, gindex, &b );
+      }
+
+      *aadvance = (FT_UShort)a;
+      *abearing = (FT_Short)b;
+    }
+#endif
   }
 
 
diff --git a/src/sfnt/ttmtx.h b/src/sfnt/ttmtx.h
index 096ee06..ab00acd 100644
--- a/src/sfnt/ttmtx.h
+++ b/src/sfnt/ttmtx.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Load the metrics tables common to TTF and OTF fonts (specification). */
 /*                                                                         */
-/*  Copyright 2006-2015 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTMTX_H__
-#define __TTMTX_H__
+#ifndef TTMTX_H_
+#define TTMTX_H_
 
 
 #include <ft2build.h>
@@ -49,7 +49,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTMTX_H__ */
+#endif /* TTMTX_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c
index 8d29d1e..6de99ef 100644
--- a/src/sfnt/ttpost.c
+++ b/src/sfnt/ttpost.c
@@ -2,10 +2,10 @@
 /*                                                                         */
 /*  ttpost.c                                                               */
 /*                                                                         */
-/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    PostScript name table processing for TrueType and OpenType fonts     */
 /*    (body).                                                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,6 +29,10 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
+
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
 #include "ttpost.h"
 
 #include "sferrors.h"
@@ -321,12 +325,13 @@
     FT_UNUSED( post_limit );
 
 
-    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */
     if ( FT_READ_USHORT( num_glyphs ) )
       goto Exit;
 
     /* check the number of glyphs */
-    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
+    if ( num_glyphs > face->max_profile.numGlyphs ||
+         num_glyphs > 258                         ||
+         num_glyphs < 1                           )
     {
       error = FT_THROW( Invalid_File_Format );
       goto Exit;
@@ -402,7 +407,7 @@
     /* now read postscript table */
     if ( format == 0x00020000L )
       error = load_format_20( face, stream, post_limit );
-    else if ( format == 0x00028000L )
+    else if ( format == 0x00025000L )
       error = load_format_25( face, stream, post_limit );
     else
       error = FT_THROW( Invalid_File_Format );
@@ -441,7 +446,7 @@
         FT_FREE( table->glyph_names );
         table->num_names = 0;
       }
-      else if ( format == 0x00028000L )
+      else if ( format == 0x00025000L )
       {
         TT_Post_25  table = &names->names.format_25;
 
@@ -468,8 +473,8 @@
   /*    idx    :: The glyph index.                                         */
   /*                                                                       */
   /* <InOut>                                                               */
-  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
-  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*    PSname :: The address of a string pointer.  Undefined in case of   */
+  /*              error, otherwise it is a pointer to the glyph name.      */
   /*                                                                       */
   /*              You must not modify the returned string!                 */
   /*                                                                       */
@@ -537,7 +542,7 @@
           *PSname = (FT_String*)table->glyph_names[name_index - 258];
       }
     }
-    else if ( format == 0x00028000L )
+    else if ( format == 0x00025000L )
     {
       TT_Post_25  table = &names->names.format_25;
 
@@ -559,5 +564,12 @@
     return FT_Err_Ok;
   }
 
+#else /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_post_dummy;
+
+#endif /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
 
 /* END */
diff --git a/src/sfnt/ttpost.h b/src/sfnt/ttpost.h
index e3eca02..3bec07e 100644
--- a/src/sfnt/ttpost.h
+++ b/src/sfnt/ttpost.h
@@ -2,10 +2,10 @@
 /*                                                                         */
 /*  ttpost.h                                                               */
 /*                                                                         */
-/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    PostScript name table processing for TrueType and OpenType fonts     */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTPOST_H__
-#define __TTPOST_H__
+#ifndef TTPOST_H_
+#define TTPOST_H_
 
 
 #include <ft2build.h>
@@ -40,7 +40,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTPOST_H__ */
+#endif /* TTPOST_H_ */
 
 
 /* END */
diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c
index 143f276..33b8640 100644
--- a/src/sfnt/ttsbit.c
+++ b/src/sfnt/ttsbit.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded bitmap support (body).                */
 /*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  Copyright 2013 by Google, Inc.                                         */
@@ -24,6 +24,10 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_BITMAP_H
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
 #include "ttsbit.h"
 
 #include "sferrors.h"
@@ -48,6 +52,7 @@
   {
     FT_Error  error;
     FT_ULong  table_size;
+    FT_ULong  table_start;
 
 
     face->sbit_table       = NULL;
@@ -83,6 +88,8 @@
       goto Exit;
     }
 
+    table_start = FT_STREAM_POS();
+
     switch ( (FT_UInt)face->sbit_table_type )
     {
     case TT_SBIT_TABLE_TYPE_EBLC:
@@ -104,7 +111,12 @@
         version     = FT_NEXT_LONG( p );
         num_strikes = FT_NEXT_ULONG( p );
 
-        if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL )
+        /* there's at least one font (FZShuSong-Z01, version 3)   */
+        /* that uses the wrong byte order for the `version' field */
+        if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL &&
+             ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000200UL &&
+             ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00030000UL &&
+             ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000300UL )
         {
           error = FT_THROW( Unknown_File_Format );
           goto Exit;
@@ -189,12 +201,51 @@
       break;
 
     default:
+      /* we ignore unknown table formats */
       error = FT_THROW( Unknown_File_Format );
       break;
     }
 
     if ( !error )
-      FT_TRACE3(( "sbit_num_strikes: %u\n", face->sbit_num_strikes ));
+      FT_TRACE3(( "tt_face_load_sbit_strikes: found %u strikes\n",
+                  face->sbit_num_strikes ));
+
+    face->ebdt_start = 0;
+    face->ebdt_size  = 0;
+
+    if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX )
+    {
+      /* the `sbix' table is self-contained; */
+      /* it has no associated data table     */
+      face->ebdt_start = table_start;
+      face->ebdt_size  = table_size;
+    }
+    else if ( face->sbit_table_type != TT_SBIT_TABLE_TYPE_NONE )
+    {
+      FT_ULong  ebdt_size;
+
+
+      error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
+      if ( error )
+        error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
+      if ( error )
+        error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
+
+      if ( !error )
+      {
+        face->ebdt_start = FT_STREAM_POS();
+        face->ebdt_size  = ebdt_size;
+      }
+    }
+
+    if ( !face->ebdt_size )
+    {
+      FT_TRACE2(( "tt_face_load_sbit_strikes:"
+                  " no embedded bitmap data table found;\n"
+                  "                          "
+                  " resetting number of strikes to zero\n" ));
+      face->sbit_num_strikes = 0;
+    }
 
     return FT_Err_Ok;
 
@@ -238,8 +289,22 @@
                                FT_ULong          strike_index,
                                FT_Size_Metrics*  metrics )
   {
-    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
-      return FT_THROW( Invalid_Argument );
+    /* we have to test for the existence of `sbit_strike_map'    */
+    /* because the function gets also used at the very beginning */
+    /* to construct `sbit_strike_map' itself                     */
+    if ( face->sbit_strike_map )
+    {
+      if ( strike_index >= (FT_ULong)face->root.num_fixed_sizes )
+        return FT_THROW( Invalid_Argument );
+
+      /* map to real index */
+      strike_index = face->sbit_strike_map[strike_index];
+    }
+    else
+    {
+      if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
+        return FT_THROW( Invalid_Argument );
+    }
 
     switch ( (FT_UInt)face->sbit_table_type )
     {
@@ -247,6 +312,8 @@
     case TT_SBIT_TABLE_TYPE_CBLC:
       {
         FT_Byte*  strike;
+        FT_Char   max_before_bl;
+        FT_Char   min_after_bl;
 
 
         strike = face->sbit_table + 8 + strike_index * 48;
@@ -254,26 +321,93 @@
         metrics->x_ppem = (FT_UShort)strike[44];
         metrics->y_ppem = (FT_UShort)strike[45];
 
-        metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */
-        metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */
-        metrics->height    = metrics->ascender - metrics->descender;
+        metrics->ascender  = (FT_Char)strike[16] * 64;  /* hori.ascender  */
+        metrics->descender = (FT_Char)strike[17] * 64;  /* hori.descender */
+
+        /* Due to fuzzy wording in the EBLC documentation, we find both */
+        /* positive and negative values for `descender'.  Additionally, */
+        /* many fonts have both `ascender' and `descender' set to zero  */
+        /* (which is definitely wrong).  MS Windows simply ignores all  */
+        /* those values...  For these reasons we apply some heuristics  */
+        /* to get a reasonable, non-zero value for the height.          */
+
+        max_before_bl = (FT_Char)strike[24];
+        min_after_bl  = (FT_Char)strike[25];
+
+        if ( metrics->descender > 0 )
+        {
+          /* compare sign of descender with `min_after_bl' */
+          if ( min_after_bl < 0 )
+            metrics->descender = -metrics->descender;
+        }
+
+        else if ( metrics->descender == 0 )
+        {
+          if ( metrics->ascender == 0 )
+          {
+            FT_TRACE2(( "tt_face_load_strike_metrics:"
+                        " sanitizing invalid ascender and descender\n"
+                        "                            "
+                        " values for strike %d (%dppem, %dppem)\n",
+                        strike_index,
+                        metrics->x_ppem, metrics->y_ppem ));
+
+            /* sanitize buggy ascender and descender values */
+            if ( max_before_bl || min_after_bl )
+            {
+              metrics->ascender  = max_before_bl * 64;
+              metrics->descender = min_after_bl * 64;
+            }
+            else
+            {
+              metrics->ascender  = metrics->y_ppem * 64;
+              metrics->descender = 0;
+            }
+          }
+        }
+
+#if 0
+        else
+          ; /* if we have a negative descender, simply use it */
+#endif
+
+        metrics->height = metrics->ascender - metrics->descender;
+        if ( metrics->height == 0 )
+        {
+          FT_TRACE2(( "tt_face_load_strike_metrics:"
+                      " sanitizing invalid height value\n"
+                      "                            "
+                      " for strike (%d, %d)\n",
+                      metrics->x_ppem, metrics->y_ppem ));
+          metrics->height    = metrics->y_ppem * 64;
+          metrics->descender = metrics->ascender - metrics->height;
+        }
 
         /* Is this correct? */
         metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */
                                           strike[18] + /* max_width      */
                                  (FT_Char)strike[23]   /* min_advance_SB */
-                                                     ) << 6;
+                                                     ) * 64;
+
+        /* set the scale values (in 16.16 units) so advances */
+        /* from the hmtx and vmtx table are scaled correctly */
+        metrics->x_scale = FT_MulDiv( metrics->x_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
+        metrics->y_scale = FT_MulDiv( metrics->y_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
+
         return FT_Err_Ok;
       }
 
     case TT_SBIT_TABLE_TYPE_SBIX:
       {
         FT_Stream       stream = face->root.stream;
-        FT_UInt         offset, upem;
-        FT_UShort       ppem, resolution;
+        FT_UInt         offset;
+        FT_UShort       upem, ppem, resolution;
         TT_HoriHeader  *hori;
-        FT_ULong        table_size;
-        FT_Pos          ppem_, upem_; /* to reduce casts */
+        FT_Pos          ppem_; /* to reduce casts */
 
         FT_Error  error;
         FT_Byte*  p;
@@ -282,15 +416,11 @@
         p      = face->sbit_table + 8 + 4 * strike_index;
         offset = FT_NEXT_ULONG( p );
 
-        error = face->goto_table( face, TTAG_sbix, stream, &table_size );
-        if ( error )
-          return error;
-
-        if ( offset + 4  > table_size )
+        if ( offset + 4 > face->ebdt_size )
           return FT_THROW( Invalid_File_Format );
 
-        if ( FT_STREAM_SEEK( FT_STREAM_POS() + offset ) ||
-             FT_FRAME_ENTER( 4 )                        )
+        if ( FT_STREAM_SEEK( face->ebdt_start + offset ) ||
+             FT_FRAME_ENTER( 4 )                         )
           return error;
 
         ppem       = FT_GET_USHORT();
@@ -307,14 +437,25 @@
         metrics->y_ppem = ppem;
 
         ppem_ = (FT_Pos)ppem;
-        upem_ = (FT_Pos)upem;
 
-        metrics->ascender    = ppem_ * hori->Ascender * 64 / upem_;
-        metrics->descender   = ppem_ * hori->Descender * 64 / upem_;
-        metrics->height      = ppem_ * ( hori->Ascender -
-                                         hori->Descender +
-                                         hori->Line_Gap ) * 64 / upem_;
-        metrics->max_advance = ppem_ * hori->advance_Width_Max * 64 / upem_;
+        metrics->ascender =
+          FT_MulDiv( hori->Ascender, ppem_ * 64, upem );
+        metrics->descender =
+          FT_MulDiv( hori->Descender, ppem_ * 64, upem );
+        metrics->height =
+          FT_MulDiv( hori->Ascender - hori->Descender + hori->Line_Gap,
+                     ppem_ * 64, upem );
+        metrics->max_advance =
+          FT_MulDiv( hori->advance_Width_Max, ppem_ * 64, upem );
+
+        /* set the scale values (in 16.16 units) so advances */
+        /* from the hmtx and vmtx table are scaled correctly */
+        metrics->x_scale = FT_MulDiv( metrics->x_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
+        metrics->y_scale = FT_MulDiv( metrics->y_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
 
         return error;
       }
@@ -352,17 +493,15 @@
                         FT_ULong             strike_index,
                         TT_SBit_MetricsRec*  metrics )
   {
-    FT_Error   error;
+    FT_Error   error  = FT_ERR( Table_Missing );
     FT_Stream  stream = face->root.stream;
-    FT_ULong   ebdt_size;
 
 
-    error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
-    if ( error )
-      error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
-    if ( error )
-      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
-    if ( error )
+    strike_index = face->sbit_strike_map[strike_index];
+
+    if ( !face->ebdt_size )
+      goto Exit;
+    if ( FT_STREAM_SEEK( face->ebdt_start ) )
       goto Exit;
 
     decoder->face    = face;
@@ -373,8 +512,8 @@
     decoder->metrics_loaded   = 0;
     decoder->bitmap_allocated = 0;
 
-    decoder->ebdt_start = FT_STREAM_POS();
-    decoder->ebdt_size  = ebdt_size;
+    decoder->ebdt_start = face->ebdt_start;
+    decoder->ebdt_size  = face->ebdt_size;
 
     decoder->eblc_base  = face->sbit_table;
     decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
@@ -419,7 +558,8 @@
 
 
   static FT_Error
-  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder )
+  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder,
+                                FT_Bool         metrics_only )
   {
     FT_Error    error = FT_Err_Ok;
     FT_UInt     width, height;
@@ -482,6 +622,9 @@
     if ( size == 0 )
       goto Exit;     /* exit successfully! */
 
+    if ( metrics_only )
+      goto Exit;     /* only metrics are requested */
+
     error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
     if ( error )
       goto Exit;
@@ -547,13 +690,17 @@
   tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
                               FT_UInt         glyph_index,
                               FT_Int          x_pos,
-                              FT_Int          y_pos );
+                              FT_Int          y_pos,
+                              FT_UInt         recurse_count,
+                              FT_Bool         metrics_only );
 
-  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,
-                                                FT_Byte*        p,
-                                                FT_Byte*        plimit,
-                                                FT_Int          x_pos,
-                                                FT_Int          y_pos );
+  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)(
+                      TT_SBitDecoder  decoder,
+                      FT_Byte*        p,
+                      FT_Byte*        plimit,
+                      FT_Int          x_pos,
+                      FT_Int          y_pos,
+                      FT_UInt         recurse_count );
 
 
   static FT_Error
@@ -561,7 +708,8 @@
                                      FT_Byte*        p,
                                      FT_Byte*        limit,
                                      FT_Int          x_pos,
-                                     FT_Int          y_pos )
+                                     FT_Int          y_pos,
+                                     FT_UInt         recurse_count )
   {
     FT_Error    error = FT_Err_Ok;
     FT_Byte*    line;
@@ -569,6 +717,8 @@
     FT_UInt     bit_height, bit_width;
     FT_Bitmap*  bitmap;
 
+    FT_UNUSED( recurse_count );
+
 
     /* check that we can write the glyph into the bitmap */
     bitmap     = decoder->bitmap;
@@ -700,7 +850,8 @@
                                     FT_Byte*        p,
                                     FT_Byte*        limit,
                                     FT_Int          x_pos,
-                                    FT_Int          y_pos )
+                                    FT_Int          y_pos,
+                                    FT_UInt         recurse_count )
   {
     FT_Error    error = FT_Err_Ok;
     FT_Byte*    line;
@@ -709,6 +860,8 @@
     FT_Bitmap*  bitmap;
     FT_UShort   rval;
 
+    FT_UNUSED( recurse_count );
+
 
     /* check that we can write the glyph into the bitmap */
     bitmap     = decoder->bitmap;
@@ -738,6 +891,12 @@
       goto Exit;
     }
 
+    if ( !line_bits || !height )
+    {
+      /* nothing to do */
+      goto Exit;
+    }
+
     /* now do the blit */
 
     /* adjust `line' to point to the first byte of the bitmap */
@@ -777,7 +936,7 @@
         }
 
         *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &
-                     ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
+                     ( ~( 0xFFU << w ) << ( 8 - w - x_pos ) );
         rval     <<= 8;
 
         w = line_bits - w;
@@ -824,7 +983,8 @@
                                  FT_Byte*        p,
                                  FT_Byte*        limit,
                                  FT_Int          x_pos,
-                                 FT_Int          y_pos )
+                                 FT_Int          y_pos,
+                                 FT_UInt         recurse_count )
   {
     FT_Error  error = FT_Err_Ok;
     FT_UInt   num_components, nn;
@@ -847,8 +1007,9 @@
       goto Fail;
     }
 
-    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
-                num_components ));
+    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n",
+                num_components,
+                num_components == 1 ? "" : "s" ));
 
     for ( nn = 0; nn < num_components; nn++ )
     {
@@ -858,8 +1019,13 @@
 
 
       /* NB: a recursive call */
-      error = tt_sbit_decoder_load_image( decoder, gindex,
-                                          x_pos + dx, y_pos + dy );
+      error = tt_sbit_decoder_load_image( decoder,
+                                          gindex,
+                                          x_pos + dx,
+                                          y_pos + dy,
+                                          recurse_count + 1,
+                                          /* request full bitmap image */
+                                          FALSE );
       if ( error )
         break;
     }
@@ -891,11 +1057,14 @@
                             FT_Byte*        p,
                             FT_Byte*        limit,
                             FT_Int          x_pos,
-                            FT_Int          y_pos )
+                            FT_Int          y_pos,
+                            FT_UInt         recurse_count )
   {
     FT_Error  error = FT_Err_Ok;
     FT_ULong  png_len;
 
+    FT_UNUSED( recurse_count );
+
 
     if ( limit - p < 4 )
     {
@@ -920,6 +1089,7 @@
                            decoder->stream->memory,
                            p,
                            png_len,
+                           FALSE,
                            FALSE );
 
   Exit:
@@ -937,7 +1107,9 @@
                                FT_ULong        glyph_start,
                                FT_ULong        glyph_size,
                                FT_Int          x_pos,
-                               FT_Int          y_pos )
+                               FT_Int          y_pos,
+                               FT_UInt         recurse_count,
+                               FT_Bool         metrics_only )
   {
     FT_Error   error;
     FT_Stream  stream = decoder->stream;
@@ -947,7 +1119,8 @@
 
 
     /* seek into the EBDT table now */
-    if ( glyph_start + glyph_size > decoder->ebdt_size )
+    if ( !glyph_size                                   ||
+         glyph_start + glyph_size > decoder->ebdt_size )
     {
       error = FT_THROW( Invalid_Argument );
       goto Exit;
@@ -1058,12 +1231,16 @@
 
       if ( !decoder->bitmap_allocated )
       {
-        error = tt_sbit_decoder_alloc_bitmap( decoder );
+        error = tt_sbit_decoder_alloc_bitmap( decoder, metrics_only );
+
         if ( error )
           goto Fail;
       }
 
-      error = loader( decoder, p, p_limit, x_pos, y_pos );
+      if ( metrics_only )
+        goto Fail; /* this is not an error */
+
+      error = loader( decoder, p, p_limit, x_pos, y_pos, recurse_count );
     }
 
   Fail:
@@ -1078,13 +1255,10 @@
   tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
                               FT_UInt         glyph_index,
                               FT_Int          x_pos,
-                              FT_Int          y_pos )
+                              FT_Int          y_pos,
+                              FT_UInt         recurse_count,
+                              FT_Bool         metrics_only )
   {
-    /*
-     *  First, we find the correct strike range that applies to this
-     *  glyph index.
-     */
-
     FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;
     FT_Byte*  p_limit    = decoder->eblc_limit;
     FT_ULong  num_ranges = decoder->strike_index_count;
@@ -1092,6 +1266,17 @@
     FT_ULong  image_start = 0, image_end = 0, image_offset;
 
 
+    /* arbitrary recursion limit */
+    if ( recurse_count > 100 )
+    {
+      FT_TRACE4(( "tt_sbit_decoder_load_image:"
+                  " recursion depth exceeded\n" ));
+      goto Failure;
+    }
+
+
+    /* First, we find the correct strike range that applies to this */
+    /* glyph index.                                                 */
     for ( ; num_ranges > 0; num_ranges-- )
     {
       start = FT_NEXT_USHORT( p );
@@ -1256,16 +1441,25 @@
                                         image_start,
                                         image_end,
                                         x_pos,
-                                        y_pos );
+                                        y_pos,
+                                        recurse_count,
+                                        metrics_only );
 
   Failure:
     return FT_THROW( Invalid_Table );
 
   NoBitmap:
+    if ( recurse_count )
+    {
+      FT_TRACE4(( "tt_sbit_decoder_load_image:"
+                  " missing subglyph sbit with glyph index %d\n",
+                  glyph_index ));
+      return FT_THROW( Invalid_Composite );
+    }
+
     FT_TRACE4(( "tt_sbit_decoder_load_image:"
                 " no sbit found for glyph index %d\n", glyph_index ));
-
-    return FT_THROW( Invalid_Argument );
+    return FT_THROW( Missing_Bitmap );
   }
 
 
@@ -1275,10 +1469,10 @@
                            FT_UInt              glyph_index,
                            FT_Stream            stream,
                            FT_Bitmap           *map,
-                           TT_SBit_MetricsRec  *metrics )
+                           TT_SBit_MetricsRec  *metrics,
+                           FT_Bool              metrics_only )
   {
-    FT_UInt   sbix_pos, strike_offset, glyph_start, glyph_end;
-    FT_ULong  table_size;
+    FT_UInt   strike_offset, glyph_start, glyph_end;
     FT_Int    originOffsetX, originOffsetY;
     FT_Tag    graphicType;
     FT_Int    recurse_depth = 0;
@@ -1287,29 +1481,31 @@
     FT_Byte*  p;
 
     FT_UNUSED( map );
+#ifndef FT_CONFIG_OPTION_USE_PNG
+    FT_UNUSED( metrics_only );
+#endif
 
 
+    strike_index = face->sbit_strike_map[strike_index];
+
     metrics->width  = 0;
     metrics->height = 0;
 
     p = face->sbit_table + 8 + 4 * strike_index;
     strike_offset = FT_NEXT_ULONG( p );
 
-    error = face->goto_table( face, TTAG_sbix, stream, &table_size );
-    if ( error )
-      return error;
-    sbix_pos = FT_STREAM_POS();
-
   retry:
     if ( glyph_index > (FT_UInt)face->root.num_glyphs )
       return FT_THROW( Invalid_Argument );
 
-    if ( strike_offset >= table_size                          ||
-         table_size - strike_offset < 4 + glyph_index * 4 + 8 )
+    if ( strike_offset >= face->ebdt_size                          ||
+         face->ebdt_size - strike_offset < 4 + glyph_index * 4 + 8 )
       return FT_THROW( Invalid_File_Format );
 
-    if ( FT_STREAM_SEEK( sbix_pos + strike_offset + 4 + glyph_index * 4 ) ||
-         FT_FRAME_ENTER( 8 )                                              )
+    if ( FT_STREAM_SEEK( face->ebdt_start  +
+                         strike_offset + 4 +
+                         glyph_index * 4   ) ||
+         FT_FRAME_ENTER( 8 )                 )
       return error;
 
     glyph_start = FT_GET_ULONG();
@@ -1318,14 +1514,14 @@
     FT_FRAME_EXIT();
 
     if ( glyph_start == glyph_end )
-      return FT_THROW( Invalid_Argument );
-    if ( glyph_start > glyph_end                ||
-         glyph_end - glyph_start < 8            ||
-         table_size - strike_offset < glyph_end )
+      return FT_THROW( Missing_Bitmap );
+    if ( glyph_start > glyph_end                     ||
+         glyph_end - glyph_start < 8                 ||
+         face->ebdt_size - strike_offset < glyph_end )
       return FT_THROW( Invalid_File_Format );
 
-    if ( FT_STREAM_SEEK( sbix_pos + strike_offset + glyph_start ) ||
-         FT_FRAME_ENTER( glyph_end - glyph_start )                )
+    if ( FT_STREAM_SEEK( face->ebdt_start + strike_offset + glyph_start ) ||
+         FT_FRAME_ENTER( glyph_end - glyph_start )                        )
       return error;
 
     originOffsetX = FT_GET_SHORT();
@@ -1356,7 +1552,8 @@
                              stream->memory,
                              stream->cursor,
                              glyph_end - glyph_start - 8,
-                             TRUE );
+                             TRUE,
+                             metrics_only );
 #else
       error = FT_THROW( Unimplemented_Feature );
 #endif
@@ -1416,22 +1613,27 @@
         error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
         if ( !error )
         {
-          error = tt_sbit_decoder_load_image( decoder,
-                                              glyph_index,
-                                              0,
-                                              0 );
+          error = tt_sbit_decoder_load_image(
+                    decoder,
+                    glyph_index,
+                    0,
+                    0,
+                    0,
+                    ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 );
           tt_sbit_decoder_done( decoder );
         }
       }
       break;
 
     case TT_SBIT_TABLE_TYPE_SBIX:
-      error = tt_face_load_sbix_image( face,
-                                       strike_index,
-                                       glyph_index,
-                                       stream,
-                                       map,
-                                       metrics );
+      error = tt_face_load_sbix_image(
+                face,
+                strike_index,
+                glyph_index,
+                stream,
+                map,
+                metrics,
+                ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 );
       break;
 
     default:
@@ -1440,9 +1642,10 @@
     }
 
     /* Flatten color bitmaps if color was not requested. */
-    if ( !error                                &&
-         !( load_flags & FT_LOAD_COLOR )       &&
-         map->pixel_mode == FT_PIXEL_MODE_BGRA )
+    if ( !error                                        &&
+         !( load_flags & FT_LOAD_COLOR )               &&
+         !( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) &&
+         map->pixel_mode == FT_PIXEL_MODE_BGRA         )
     {
       FT_Bitmap   new_map;
       FT_Library  library = face->root.glyph->library;
@@ -1468,5 +1671,12 @@
     return error;
   }
 
+#else /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
 
-/* EOF */
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_sbit_dummy;
+
+#endif /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+/* END */
diff --git a/src/sfnt/ttsbit.h b/src/sfnt/ttsbit.h
index d4e13ae..ce2af3c 100644
--- a/src/sfnt/ttsbit.h
+++ b/src/sfnt/ttsbit.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded bitmap support (specification).       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTSBIT_H__
-#define __TTSBIT_H__
+#ifndef TTSBIT_H_
+#define TTSBIT_H_
 
 
 #include <ft2build.h>
@@ -57,7 +57,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTSBIT_H__ */
+#endif /* TTSBIT_H_ */
 
 
 /* END */
diff --git a/src/smooth/Jamfile b/src/smooth/Jamfile
index 73b29d6..9957d5e 100644
--- a/src/smooth/Jamfile
+++ b/src/smooth/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/smooth Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,10 @@
 
   if $(FT2_MULTI)
   {
-    _sources = ftgrays ftsmooth ftspic ;
+    _sources = ftgrays
+               ftsmooth
+               ftspic
+               ;
   }
   else
   {
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
index 77b58f2..803a19e 100644
--- a/src/smooth/ftgrays.c
+++ b/src/smooth/ftgrays.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    A new `perfect' anti-aliasing renderer (body).                       */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,18 +18,18 @@
   /*************************************************************************/
   /*                                                                       */
   /* This file can be compiled without the rest of the FreeType engine, by */
-  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* defining the STANDALONE_ macro when compiling it.  You also need to   */
   /* put the files `ftgrays.h' and `ftimage.h' into the current            */
   /* compilation directory.  Typically, you could do something like        */
   /*                                                                       */
   /* - copy `src/smooth/ftgrays.c' (this file) to your current directory   */
   /*                                                                       */
-  /* - copy `include/ftimage.h' and `src/smooth/ftgrays.h' to the same     */
-  /*   directory                                                           */
+  /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
+  /*   same directory                                                      */
   /*                                                                       */
-  /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in        */
+  /* - compile `ftgrays' with the STANDALONE_ macro defined, as in         */
   /*                                                                       */
-  /*     cc -c -D_STANDALONE_ ftgrays.c                                    */
+  /*     cc -c -DSTANDALONE_ ftgrays.c                                     */
   /*                                                                       */
   /* The renderer can be initialized with a call to                        */
   /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated  */
@@ -91,7 +91,7 @@
 #define FT_COMPONENT  trace_smooth
 
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
 
   /* The size in bytes of the render pool used by the scan-line converter  */
@@ -106,6 +106,7 @@
 #define FT_BEGIN_STMNT  do {
 #define FT_END_STMNT    } while ( 0 )
 
+#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )
 #define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
 #define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
 
@@ -135,8 +136,20 @@
 #include <string.h>
 #include <setjmp.h>
 #include <limits.h>
-#define FT_UINT_MAX  UINT_MAX
-#define FT_INT_MAX   INT_MAX
+#define FT_CHAR_BIT   CHAR_BIT
+#define FT_UINT_MAX   UINT_MAX
+#define FT_INT_MAX    INT_MAX
+#define FT_ULONG_MAX  ULONG_MAX
+
+#define ADD_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) + (unsigned long)(b) )
+#define SUB_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) - (unsigned long)(b) )
+#define MUL_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) * (unsigned long)(b) )
+#define NEG_LONG( a )                                       \
+          (long)( -(unsigned long)(a) )
+
 
 #define ft_memset   memset
 
@@ -254,13 +267,14 @@
          };
 
 
-#else /* !_STANDALONE_ */
+#else /* !STANDALONE_ */
 
 
 #include <ft2build.h>
 #include "ftgrays.h"
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
 #include FT_OUTLINE_H
 
 #include "ftsmerrs.h"
@@ -272,7 +286,7 @@
 #define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory
 
 
-#endif /* !_STANDALONE_ */
+#endif /* !STANDALONE_ */
 
 
 #ifndef FT_MEM_SET
@@ -283,6 +297,10 @@
 #define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
 #endif
 
+#ifndef FT_ZERO
+#define FT_ZERO( p )  FT_MEM_ZERO( p, sizeof ( *(p) ) )
+#endif
+
   /* as usual, for the speed hungry :-) */
 
 #undef RAS_ARG
@@ -300,7 +318,7 @@
 
 #else /* FT_STATIC_RASTER */
 
-#define RAS_ARG   /* empty */
+#define RAS_ARG   void
 #define RAS_ARG_  /* empty */
 #define RAS_VAR   /* empty */
 #define RAS_VAR_  /* empty */
@@ -316,26 +334,26 @@
 #undef TRUNC
 #undef SCALED
 
-#define ONE_PIXEL       ( 1L << PIXEL_BITS )
-#define PIXEL_MASK      ( -1L << PIXEL_BITS )
+#define ONE_PIXEL       ( 1 << PIXEL_BITS )
 #define TRUNC( x )      ( (TCoord)( (x) >> PIXEL_BITS ) )
-#define SUBPIXELS( x )  ( (TPos)(x) << PIXEL_BITS )
+#define SUBPIXELS( x )  ( (TPos)(x) * ONE_PIXEL )
 #define FLOOR( x )      ( (x) & -ONE_PIXEL )
 #define CEILING( x )    ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
 #define ROUND( x )      ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
 
 #if PIXEL_BITS >= 6
-#define UPSCALE( x )    ( (x) << ( PIXEL_BITS - 6 ) )
+#define UPSCALE( x )    ( (x) * ( ONE_PIXEL >> 6 ) )
 #define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )
 #else
 #define UPSCALE( x )    ( (x) >> ( 6 - PIXEL_BITS ) )
-#define DOWNSCALE( x )  ( (x) << ( 6 - PIXEL_BITS ) )
+#define DOWNSCALE( x )  ( (x) * ( 64 >> PIXEL_BITS ) )
 #endif
 
 
   /* Compute `dividend / divisor' and return both its quotient and     */
   /* remainder, cast to a specific type.  This macro also ensures that */
-  /* the remainder is always positive.                                 */
+  /* the remainder is always positive.  We use the remainder to keep   */
+  /* track of accumulating errors and compensate for them.             */
 #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
   FT_BEGIN_STMNT                                                   \
     (quotient)  = (type)( (dividend) / (divisor) );                \
@@ -352,7 +370,7 @@
   /* optimize a division and modulo operation on the same parameters   */
   /* into a single call to `__aeabi_idivmod'.  See                     */
   /*                                                                   */
-  /*  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721                */
+  /*  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721               */
 #undef FT_DIV_MOD
 #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
   FT_BEGIN_STMNT                                                   \
@@ -367,6 +385,16 @@
 #endif /* __arm__ */
 
 
+  /* These macros speed up repetitive divisions by replacing them */
+  /* with multiplications and right shifts.                       */
+#define FT_UDIVPREP( c, b )                                        \
+  long  b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \
+                    : 0
+#define FT_UDIV( a, b )                                        \
+  ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >>   \
+    ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) )
+
+
   /*************************************************************************/
   /*                                                                       */
   /*   TYPE DEFINITIONS                                                    */
@@ -376,44 +404,36 @@
   /* need to define them to "float" or "double" when experimenting with   */
   /* new algorithms                                                       */
 
-  typedef long  TCoord;   /* integer scanline/pixel coordinate */
-  typedef long  TPos;     /* sub-pixel coordinate              */
-
-  /* determine the type used to store cell areas.  This normally takes at */
-  /* least PIXEL_BITS*2 + 1 bits.  On 16-bit systems, we need to use      */
-  /* `long' instead of `int', otherwise bad things happen                 */
-
-#if PIXEL_BITS <= 7
-
-  typedef int  TArea;
-
-#else /* PIXEL_BITS >= 8 */
-
-  /* approximately determine the size of integers using an ANSI-C header */
-#if FT_UINT_MAX == 0xFFFFU
-  typedef long  TArea;
-#else
-  typedef int   TArea;
-#endif
-
-#endif /* PIXEL_BITS >= 8 */
-
-
-  /* maximum number of gray spans in a call to the span callback */
-#define FT_MAX_GRAY_SPANS  32
+  typedef long  TPos;     /* subpixel coordinate               */
+  typedef int   TCoord;   /* integer scanline/pixel coordinate */
+  typedef int   TArea;    /* cell areas, coordinate products   */
 
 
   typedef struct TCell_*  PCell;
 
   typedef struct  TCell_
   {
-    TPos    x;     /* same with gray_TWorker.ex    */
+    TCoord  x;     /* same with gray_TWorker.ex    */
     TCoord  cover; /* same with gray_TWorker.cover */
     TArea   area;
     PCell   next;
 
   } TCell;
 
+  typedef struct TPixmap_
+  {
+    unsigned char*  origin;  /* pixmap origin at the bottom-left */
+    int             pitch;   /* pitch to go down one row */
+
+  } TPixmap;
+
+  /* maximum number of gray cells in the buffer */
+#if FT_RENDER_POOL_SIZE > 2048
+#define FT_MAX_GRAY_POOL  ( FT_RENDER_POOL_SIZE / sizeof ( TCell ) )
+#else
+#define FT_MAX_GRAY_POOL  ( 2048 / sizeof ( TCell ) )
+#endif
+
 
 #if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
   /* We disable the warning `structure was padded due to   */
@@ -428,45 +448,25 @@
     ft_jmp_buf  jump_buffer;
 
     TCoord  ex, ey;
-    TPos    min_ex, max_ex;
-    TPos    min_ey, max_ey;
-    TPos    count_ex, count_ey;
+    TCoord  min_ex, max_ex;
+    TCoord  min_ey, max_ey;
 
     TArea   area;
     TCoord  cover;
     int     invalid;
 
+    PCell*      ycells;
     PCell       cells;
     FT_PtrDist  max_cells;
     FT_PtrDist  num_cells;
 
-    TCoord  cx, cy;
     TPos    x,  y;
 
-    TPos    last_ey;
-
-    FT_Vector   bez_stack[32 * 3 + 1];
-    int         lev_stack[32];
-
     FT_Outline  outline;
-    FT_Bitmap   target;
-    FT_BBox     clip_box;
-
-    FT_Span     gray_spans[FT_MAX_GRAY_SPANS];
-    int         num_gray_spans;
+    TPixmap     target;
 
     FT_Raster_Span_Func  render_span;
     void*                render_span_data;
-    int                  span_y;
-
-    int  band_size;
-    int  band_shoot;
-
-    void*       buffer;
-    long        buffer_size;
-
-    PCell*     ycells;
-    TPos       ycount;
 
   } gray_TWorker, *gray_PWorker;
 
@@ -489,95 +489,53 @@
   } gray_TRaster, *gray_PRaster;
 
 
+#ifdef FT_DEBUG_LEVEL_TRACE
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* Initialize the cells table.                                           */
-  /*                                                                       */
+  /* to be called while in the debugger --                                */
+  /* this function causes a compiler warning since it is unused otherwise */
   static void
-  gray_init_cells( RAS_ARG_ void*  buffer,
-                            long   byte_size )
+  gray_dump_cells( RAS_ARG )
   {
-    ras.buffer      = buffer;
-    ras.buffer_size = byte_size;
+    int  y;
 
-    ras.ycells      = (PCell*) buffer;
-    ras.cells       = NULL;
-    ras.max_cells   = 0;
-    ras.num_cells   = 0;
-    ras.area        = 0;
-    ras.cover       = 0;
-    ras.invalid     = 1;
+
+    for ( y = ras.min_ey; y < ras.max_ey; y++ )
+    {
+      PCell  cell = ras.ycells[y - ras.min_ey];
+
+
+      printf( "%3d:", y );
+
+      for ( ; cell != NULL; cell = cell->next )
+        printf( " (%3d, c:%4d, a:%6d)",
+                cell->x, cell->cover, cell->area );
+      printf( "\n" );
+    }
   }
 
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Compute the outline bounding box.                                     */
-  /*                                                                       */
-  static void
-  gray_compute_cbox( RAS_ARG )
-  {
-    FT_Outline*  outline = &ras.outline;
-    FT_Vector*   vec     = outline->points;
-    FT_Vector*   limit   = vec + outline->n_points;
-
-
-    if ( outline->n_points <= 0 )
-    {
-      ras.min_ex = ras.max_ex = 0;
-      ras.min_ey = ras.max_ey = 0;
-      return;
-    }
-
-    ras.min_ex = ras.max_ex = vec->x;
-    ras.min_ey = ras.max_ey = vec->y;
-
-    vec++;
-
-    for ( ; vec < limit; vec++ )
-    {
-      TPos  x = vec->x;
-      TPos  y = vec->y;
-
-
-      if ( x < ras.min_ex ) ras.min_ex = x;
-      if ( x > ras.max_ex ) ras.max_ex = x;
-      if ( y < ras.min_ey ) ras.min_ey = y;
-      if ( y > ras.max_ey ) ras.max_ey = y;
-    }
-
-    /* truncate the bounding box to integer pixels */
-    ras.min_ex = ras.min_ex >> 6;
-    ras.min_ey = ras.min_ey >> 6;
-    ras.max_ex = ( ras.max_ex + 63 ) >> 6;
-    ras.max_ey = ( ras.max_ey + 63 ) >> 6;
-  }
+#endif /* FT_DEBUG_LEVEL_TRACE */
 
 
   /*************************************************************************/
   /*                                                                       */
   /* Record the current cell in the table.                                 */
   /*                                                                       */
-  static PCell
-  gray_find_cell( RAS_ARG )
+  static void
+  gray_record_cell( RAS_ARG )
   {
     PCell  *pcell, cell;
-    TPos    x = ras.ex;
+    TCoord  x = ras.ex;
 
 
-    if ( x > ras.count_ex )
-      x = ras.count_ex;
-
-    pcell = &ras.ycells[ras.ey];
+    pcell = &ras.ycells[ras.ey - ras.min_ey];
     for (;;)
     {
       cell = *pcell;
-      if ( cell == NULL || cell->x > x )
+      if ( !cell || cell->x > x )
         break;
 
       if ( cell->x == x )
-        goto Exit;
+        goto Found;
 
       pcell = &cell->next;
     }
@@ -585,30 +543,21 @@
     if ( ras.num_cells >= ras.max_cells )
       ft_longjmp( ras.jump_buffer, 1 );
 
+    /* insert new cell */
     cell        = ras.cells + ras.num_cells++;
     cell->x     = x;
-    cell->area  = 0;
-    cell->cover = 0;
+    cell->area  = ras.area;
+    cell->cover = ras.cover;
 
     cell->next  = *pcell;
     *pcell      = cell;
 
-  Exit:
-    return cell;
-  }
+    return;
 
-
-  static void
-  gray_record_cell( RAS_ARG )
-  {
-    if ( ras.area | ras.cover )
-    {
-      PCell  cell = gray_find_cell( RAS_VAR );
-
-
-      cell->area  += ras.area;
-      cell->cover += ras.cover;
-    }
+  Found:
+    /* update old cell */
+    cell->area  += ras.area;
+    cell->cover += ras.cover;
   }
 
 
@@ -630,60 +579,25 @@
     /* Note that if a cell is to the left of the clipping region, it is    */
     /* actually set to the (min_ex-1) horizontal position.                 */
 
-    /* All cells that are on the left of the clipping region go to the */
-    /* min_ex - 1 horizontal position.                                 */
-    ey -= ras.min_ey;
-
-    if ( ex > ras.max_ex )
-      ex = ras.max_ex;
-
-    ex -= ras.min_ex;
-    if ( ex < 0 )
-      ex = -1;
-
-    /* are we moving to a different cell ? */
-    if ( ex != ras.ex || ey != ras.ey )
-    {
-      /* record the current one if it is valid */
-      if ( !ras.invalid )
-        gray_record_cell( RAS_VAR );
-
-      ras.area  = 0;
-      ras.cover = 0;
-      ras.ex    = ex;
-      ras.ey    = ey;
-    }
-
-    ras.invalid = ( (unsigned int)ey >= (unsigned int)ras.count_ey ||
-                                  ex >= ras.count_ex               );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Start a new contour at a given cell.                                  */
-  /*                                                                       */
-  static void
-  gray_start_cell( RAS_ARG_ TCoord  ex,
-                            TCoord  ey )
-  {
-    if ( ex > ras.max_ex )
-      ex = (TCoord)( ras.max_ex );
-
     if ( ex < ras.min_ex )
-      ex = (TCoord)( ras.min_ex - 1 );
+      ex = ras.min_ex - 1;
 
-    ras.area    = 0;
-    ras.cover   = 0;
-    ras.ex      = ex - ras.min_ex;
-    ras.ey      = ey - ras.min_ey;
-    ras.last_ey = SUBPIXELS( ey );
-    ras.invalid = 0;
+    /* record the current one if it is valid and substantial */
+    if ( !ras.invalid && ( ras.area || ras.cover ) )
+      gray_record_cell( RAS_VAR );
 
-    gray_set_cell( RAS_VAR_ ex, ey );
+    ras.area  = 0;
+    ras.cover = 0;
+    ras.ex    = ex;
+    ras.ey    = ey;
+
+    ras.invalid = ( ey >= ras.max_ey || ey < ras.min_ey ||
+                    ex >= ras.max_ex );
   }
 
 
+#ifndef FT_LONG64
+
   /*************************************************************************/
   /*                                                                       */
   /* Render a scanline as one or more cells.                               */
@@ -695,17 +609,13 @@
                                  TPos    x2,
                                  TCoord  y2 )
   {
-    TCoord  ex1, ex2, fx1, fx2, delta, mod;
-    long    p, first, dx;
+    TCoord  ex1, ex2, fx1, fx2, first, dy, delta, mod;
+    TPos    p, dx;
     int     incr;
 
 
-    dx = x2 - x1;
-
     ex1 = TRUNC( x1 );
     ex2 = TRUNC( x2 );
-    fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
-    fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
 
     /* trivial case.  Happens often */
     if ( y1 == y2 )
@@ -714,26 +624,29 @@
       return;
     }
 
+    fx1   = (TCoord)( x1 - SUBPIXELS( ex1 ) );
+    fx2   = (TCoord)( x2 - SUBPIXELS( ex2 ) );
+
     /* everything is located in a single cell.  That is easy! */
     /*                                                        */
     if ( ex1 == ex2 )
-    {
-      delta      = y2 - y1;
-      ras.area  += (TArea)(( fx1 + fx2 ) * delta);
-      ras.cover += delta;
-      return;
-    }
+      goto End;
 
     /* ok, we'll have to render a run of adjacent cells on the same */
     /* scanline...                                                  */
     /*                                                              */
-    p     = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
-    first = ONE_PIXEL;
-    incr  = 1;
+    dx = x2 - x1;
+    dy = y2 - y1;
 
-    if ( dx < 0 )
+    if ( dx > 0 )
     {
-      p     = fx1 * ( y2 - y1 );
+      p     = ( ONE_PIXEL - fx1 ) * dy;
+      first = ONE_PIXEL;
+      incr  = 1;
+    }
+    else
+    {
+      p     = fx1 * dy;
       first = 0;
       incr  = -1;
       dx    = -dx;
@@ -741,44 +654,45 @@
 
     FT_DIV_MOD( TCoord, p, dx, delta, mod );
 
-    ras.area  += (TArea)(( fx1 + first ) * delta);
+    ras.area  += (TArea)( ( fx1 + first ) * delta );
     ras.cover += delta;
-
-    ex1 += incr;
+    y1        += delta;
+    ex1       += incr;
     gray_set_cell( RAS_VAR_ ex1, ey );
-    y1  += delta;
 
     if ( ex1 != ex2 )
     {
       TCoord  lift, rem;
 
 
-      p = ONE_PIXEL * ( y2 - y1 + delta );
+      p = ONE_PIXEL * dy;
       FT_DIV_MOD( TCoord, p, dx, lift, rem );
 
-      mod -= (int)dx;
-
-      while ( ex1 != ex2 )
+      do
       {
         delta = lift;
         mod  += rem;
-        if ( mod >= 0 )
+        if ( mod >= (TCoord)dx )
         {
           mod -= (TCoord)dx;
           delta++;
         }
 
-        ras.area  += (TArea)(ONE_PIXEL * delta);
+        ras.area  += (TArea)( ONE_PIXEL * delta );
         ras.cover += delta;
         y1        += delta;
         ex1       += incr;
         gray_set_cell( RAS_VAR_ ex1, ey );
-      }
+      } while ( ex1 != ex2 );
     }
 
-    delta      = y2 - y1;
-    ras.area  += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);
-    ras.cover += delta;
+    fx1 = ONE_PIXEL - first;
+
+  End:
+    dy = y2 - y1;
+
+    ras.area  += (TArea)( ( fx1 + fx2 ) * dy );
+    ras.cover += dy;
   }
 
 
@@ -790,35 +704,21 @@
   gray_render_line( RAS_ARG_ TPos  to_x,
                              TPos  to_y )
   {
-    TCoord  ey1, ey2, fy1, fy2, mod;
-    TPos    dx, dy, x, x2;
-    long    p, first;
-    int     delta, rem, lift, incr;
+    TCoord  ey1, ey2, fy1, fy2, first, delta, mod;
+    TPos    p, dx, dy, x, x2;
+    int     incr;
 
 
-    ey1 = TRUNC( ras.last_ey );
+    ey1 = TRUNC( ras.y );
     ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
-    fy1 = (TCoord)( ras.y - ras.last_ey );
-    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
-
-    dx = to_x - ras.x;
-    dy = to_y - ras.y;
 
     /* perform vertical clipping */
-    {
-      TCoord  min, max;
+    if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) ||
+         ( ey1 <  ras.min_ey && ey2 <  ras.min_ey ) )
+      goto End;
 
-
-      min = ey1;
-      max = ey2;
-      if ( ey1 > ey2 )
-      {
-        min = ey2;
-        max = ey1;
-      }
-      if ( min >= ras.max_ey || max < ras.min_ey )
-        goto End;
-    }
+    fy1 = (TCoord)( ras.y - SUBPIXELS( ey1 ) );
+    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
 
     /* everything is on a single scanline */
     if ( ey1 == ey2 )
@@ -827,9 +727,10 @@
       goto End;
     }
 
-    /* vertical line - avoid calling gray_render_scanline */
-    incr = 1;
+    dx = to_x - ras.x;
+    dy = to_y - ras.y;
 
+    /* vertical line - avoid calling gray_render_scanline */
     if ( dx == 0 )
     {
       TCoord  ex     = TRUNC( ras.x );
@@ -837,21 +738,25 @@
       TArea   area;
 
 
-      first = ONE_PIXEL;
-      if ( dy < 0 )
+      if ( dy > 0)
+      {
+        first = ONE_PIXEL;
+        incr  = 1;
+      }
+      else
       {
         first = 0;
         incr  = -1;
       }
 
-      delta      = (int)( first - fy1 );
+      delta      = first - fy1;
       ras.area  += (TArea)two_fx * delta;
       ras.cover += delta;
       ey1       += incr;
 
       gray_set_cell( RAS_VAR_ ex, ey1 );
 
-      delta = (int)( first + first - ONE_PIXEL );
+      delta = first + first - ONE_PIXEL;
       area  = (TArea)two_fx * delta;
       while ( ey1 != ey2 )
       {
@@ -862,7 +767,7 @@
         gray_set_cell( RAS_VAR_ ex, ey1 );
       }
 
-      delta      = (int)( fy2 - ONE_PIXEL + first );
+      delta      = fy2 - ONE_PIXEL + first;
       ras.area  += (TArea)two_fx * delta;
       ras.cover += delta;
 
@@ -870,11 +775,13 @@
     }
 
     /* ok, we have to render several scanlines */
-    p     = ( ONE_PIXEL - fy1 ) * dx;
-    first = ONE_PIXEL;
-    incr  = 1;
-
-    if ( dy < 0 )
+    if ( dy > 0)
+    {
+      p     = ( ONE_PIXEL - fy1 ) * dx;
+      first = ONE_PIXEL;
+      incr  = 1;
+    }
+    else
     {
       p     = fy1 * dx;
       first = 0;
@@ -882,51 +789,190 @@
       dy    = -dy;
     }
 
-    FT_DIV_MOD( int, p, dy, delta, mod );
+    FT_DIV_MOD( TCoord, p, dy, delta, mod );
 
     x = ras.x + delta;
-    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
+    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first );
 
     ey1 += incr;
     gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
 
     if ( ey1 != ey2 )
     {
-      p     = ONE_PIXEL * dx;
-      FT_DIV_MOD( int, p, dy, lift, rem );
-      mod -= (int)dy;
+      TCoord  lift, rem;
 
-      while ( ey1 != ey2 )
+
+      p    = ONE_PIXEL * dx;
+      FT_DIV_MOD( TCoord, p, dy, lift, rem );
+
+      do
       {
         delta = lift;
         mod  += rem;
-        if ( mod >= 0 )
+        if ( mod >= (TCoord)dy )
         {
-          mod -= (int)dy;
+          mod -= (TCoord)dy;
           delta++;
         }
 
         x2 = x + delta;
-        gray_render_scanline( RAS_VAR_ ey1, x,
-                                       (TCoord)( ONE_PIXEL - first ), x2,
-                                       (TCoord)first );
+        gray_render_scanline( RAS_VAR_ ey1,
+                                       x, ONE_PIXEL - first,
+                                       x2, first );
         x = x2;
 
         ey1 += incr;
         gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
-      }
+      } while ( ey1 != ey2 );
     }
 
-    gray_render_scanline( RAS_VAR_ ey1, x,
-                                   (TCoord)( ONE_PIXEL - first ), to_x,
-                                   fy2 );
+    gray_render_scanline( RAS_VAR_ ey1,
+                                   x, ONE_PIXEL - first,
+                                   to_x, fy2 );
 
   End:
     ras.x       = to_x;
     ras.y       = to_y;
-    ras.last_ey = SUBPIXELS( ey2 );
   }
 
+#else
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Render a straight line across multiple cells in any direction.        */
+  /*                                                                       */
+  static void
+  gray_render_line( RAS_ARG_ TPos  to_x,
+                             TPos  to_y )
+  {
+    TPos    dx, dy, fx1, fy1, fx2, fy2;
+    TCoord  ex1, ex2, ey1, ey2;
+
+
+    ey1 = TRUNC( ras.y );
+    ey2 = TRUNC( to_y );
+
+    /* perform vertical clipping */
+    if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) ||
+         ( ey1 <  ras.min_ey && ey2 <  ras.min_ey ) )
+      goto End;
+
+    ex1 = TRUNC( ras.x );
+    ex2 = TRUNC( to_x );
+
+    fx1 = ras.x - SUBPIXELS( ex1 );
+    fy1 = ras.y - SUBPIXELS( ey1 );
+
+    dx = to_x - ras.x;
+    dy = to_y - ras.y;
+
+    if ( ex1 == ex2 && ey1 == ey2 )       /* inside one cell */
+      ;
+    else if ( dy == 0 ) /* ex1 != ex2 */  /* any horizontal line */
+    {
+      ex1 = ex2;
+      gray_set_cell( RAS_VAR_ ex1, ey1 );
+    }
+    else if ( dx == 0 )
+    {
+      if ( dy > 0 )                       /* vertical line up */
+        do
+        {
+          fy2 = ONE_PIXEL;
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * fx1 * 2;
+          fy1 = 0;
+          ey1++;
+          gray_set_cell( RAS_VAR_ ex1, ey1 );
+        } while ( ey1 != ey2 );
+      else                                /* vertical line down */
+        do
+        {
+          fy2 = 0;
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * fx1 * 2;
+          fy1 = ONE_PIXEL;
+          ey1--;
+          gray_set_cell( RAS_VAR_ ex1, ey1 );
+        } while ( ey1 != ey2 );
+    }
+    else                                  /* any other line */
+    {
+      TPos  prod = dx * fy1 - dy * fx1;
+      FT_UDIVPREP( ex1 != ex2, dx );
+      FT_UDIVPREP( ey1 != ey2, dy );
+
+
+      /* The fundamental value `prod' determines which side and the  */
+      /* exact coordinate where the line exits current cell.  It is  */
+      /* also easily updated when moving from one cell to the next.  */
+      do
+      {
+        if      ( prod                                   <= 0 &&
+                  prod - dx * ONE_PIXEL                  >  0 ) /* left */
+        {
+          fx2 = 0;
+          fy2 = (TPos)FT_UDIV( -prod, -dx );
+          prod -= dy * ONE_PIXEL;
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * ( fx1 + fx2 );
+          fx1 = ONE_PIXEL;
+          fy1 = fy2;
+          ex1--;
+        }
+        else if ( prod - dx * ONE_PIXEL                  <= 0 &&
+                  prod - dx * ONE_PIXEL + dy * ONE_PIXEL >  0 ) /* up */
+        {
+          prod -= dx * ONE_PIXEL;
+          fx2 = (TPos)FT_UDIV( -prod, dy );
+          fy2 = ONE_PIXEL;
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * ( fx1 + fx2 );
+          fx1 = fx2;
+          fy1 = 0;
+          ey1++;
+        }
+        else if ( prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 &&
+                  prod                  + dy * ONE_PIXEL >= 0 ) /* right */
+        {
+          prod += dy * ONE_PIXEL;
+          fx2 = ONE_PIXEL;
+          fy2 = (TPos)FT_UDIV( prod, dx );
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * ( fx1 + fx2 );
+          fx1 = 0;
+          fy1 = fy2;
+          ex1++;
+        }
+        else /* ( prod                  + dy * ONE_PIXEL <  0 &&
+                  prod                                   >  0 )    down */
+        {
+          fx2 = (TPos)FT_UDIV( prod, -dy );
+          fy2 = 0;
+          prod += dx * ONE_PIXEL;
+          ras.cover += ( fy2 - fy1 );
+          ras.area  += ( fy2 - fy1 ) * ( fx1 + fx2 );
+          fx1 = fx2;
+          fy1 = ONE_PIXEL;
+          ey1--;
+        }
+
+        gray_set_cell( RAS_VAR_ ex1, ey1 );
+      } while ( ex1 != ex2 || ey1 != ey2 );
+    }
+
+    fx2 = to_x - SUBPIXELS( ex2 );
+    fy2 = to_y - SUBPIXELS( ey2 );
+
+    ras.cover += ( fy2 - fy1 );
+    ras.area  += ( fy2 - fy1 ) * ( fx1 + fx2 );
+
+  End:
+    ras.x       = to_x;
+    ras.y       = to_y;
+  }
+
+#endif
 
   static void
   gray_split_conic( FT_Vector*  base )
@@ -952,73 +998,64 @@
   gray_render_conic( RAS_ARG_ const FT_Vector*  control,
                               const FT_Vector*  to )
   {
+    FT_Vector   bez_stack[16 * 2 + 1];  /* enough to accommodate bisections */
+    FT_Vector*  arc = bez_stack;
     TPos        dx, dy;
-    TPos        min, max, y;
-    int         top, level;
-    int*        levels;
-    FT_Vector*  arc;
+    int         draw, split;
 
 
-    levels = ras.lev_stack;
-
-    arc      = ras.bez_stack;
     arc[0].x = UPSCALE( to->x );
     arc[0].y = UPSCALE( to->y );
     arc[1].x = UPSCALE( control->x );
     arc[1].y = UPSCALE( control->y );
     arc[2].x = ras.x;
     arc[2].y = ras.y;
-    top      = 0;
+
+    /* short-cut the arc that crosses the current band */
+    if ( ( TRUNC( arc[0].y ) >= ras.max_ey &&
+           TRUNC( arc[1].y ) >= ras.max_ey &&
+           TRUNC( arc[2].y ) >= ras.max_ey ) ||
+         ( TRUNC( arc[0].y ) <  ras.min_ey &&
+           TRUNC( arc[1].y ) <  ras.min_ey &&
+           TRUNC( arc[2].y ) <  ras.min_ey ) )
+    {
+      ras.x = arc[0].x;
+      ras.y = arc[0].y;
+      return;
+    }
 
     dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );
     dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );
     if ( dx < dy )
       dx = dy;
 
-    if ( dx < ONE_PIXEL / 4 )
-      goto Draw;
+    /* We can calculate the number of necessary bisections because  */
+    /* each bisection predictably reduces deviation exactly 4-fold. */
+    /* Even 32-bit deviation would vanish after 16 bisections.      */
+    draw = 1;
+    while ( dx > ONE_PIXEL / 4 )
+    {
+      dx   >>= 2;
+      draw <<= 1;
+    }
 
-    /* short-cut the arc that crosses the current band */
-    min = max = arc[0].y;
-
-    y = arc[1].y;
-    if ( y < min ) min = y;
-    if ( y > max ) max = y;
-
-    y = arc[2].y;
-    if ( y < min ) min = y;
-    if ( y > max ) max = y;
-
-    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
-      goto Draw;
-
-    level = 0;
+    /* We use decrement counter to count the total number of segments */
+    /* to draw starting from 2^level. Before each draw we split as    */
+    /* many times as there are trailing zeros in the counter.         */
     do
     {
-      dx >>= 2;
-      level++;
-    } while ( dx > ONE_PIXEL / 4 );
-
-    levels[0] = level;
-
-    do
-    {
-      level = levels[top];
-      if ( level > 0 )
+      split = 1;
+      while ( ( draw & split ) == 0 )
       {
         gray_split_conic( arc );
         arc += 2;
-        top++;
-        levels[top] = levels[top - 1] = level - 1;
-        continue;
+        split <<= 1;
       }
 
-    Draw:
       gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
-      top--;
       arc -= 2;
 
-    } while ( top >= 0 );
+    } while ( --draw );
   }
 
 
@@ -1055,11 +1092,13 @@
                               const FT_Vector*  control2,
                               const FT_Vector*  to )
   {
-    FT_Vector*  arc;
-    TPos        min, max, y;
+    FT_Vector   bez_stack[16 * 3 + 1];  /* enough to accommodate bisections */
+    FT_Vector*  arc = bez_stack;
+    TPos        dx, dy, dx_, dy_;
+    TPos        dx1, dy1, dx2, dy2;
+    TPos        L, s, s_limit;
 
 
-    arc      = ras.bez_stack;
     arc[0].x = UPSCALE( to->x );
     arc[0].y = UPSCALE( to->y );
     arc[1].x = UPSCALE( control2->x );
@@ -1069,29 +1108,20 @@
     arc[3].x = ras.x;
     arc[3].y = ras.y;
 
-    /* Short-cut the arc that crosses the current band. */
-    min = max = arc[0].y;
-
-    y = arc[1].y;
-    if ( y < min )
-      min = y;
-    if ( y > max )
-      max = y;
-
-    y = arc[2].y;
-    if ( y < min )
-      min = y;
-    if ( y > max )
-      max = y;
-
-    y = arc[3].y;
-    if ( y < min )
-      min = y;
-    if ( y > max )
-      max = y;
-
-    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
-      goto Draw;
+    /* short-cut the arc that crosses the current band */
+    if ( ( TRUNC( arc[0].y ) >= ras.max_ey &&
+           TRUNC( arc[1].y ) >= ras.max_ey &&
+           TRUNC( arc[2].y ) >= ras.max_ey &&
+           TRUNC( arc[3].y ) >= ras.max_ey ) ||
+         ( TRUNC( arc[0].y ) <  ras.min_ey &&
+           TRUNC( arc[1].y ) <  ras.min_ey &&
+           TRUNC( arc[2].y ) <  ras.min_ey &&
+           TRUNC( arc[3].y ) <  ras.min_ey ) )
+    {
+      ras.x = arc[0].x;
+      ras.y = arc[0].y;
+      return;
+    }
 
     for (;;)
     {
@@ -1100,64 +1130,53 @@
       /* F. Hain, at                                                      */
       /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
 
-      {
-        TPos  dx, dy, dx_, dy_;
-        TPos  dx1, dy1, dx2, dy2;
-        TPos  L, s, s_limit;
+      /* dx and dy are x and y components of the P0-P3 chord vector. */
+      dx = dx_ = arc[3].x - arc[0].x;
+      dy = dy_ = arc[3].y - arc[0].y;
 
+      L = FT_HYPOT( dx_, dy_ );
 
-        /* dx and dy are x and y components of the P0-P3 chord vector. */
-        dx = dx_ = arc[3].x - arc[0].x;
-        dy = dy_ = arc[3].y - arc[0].y;
+      /* Avoid possible arithmetic overflow below by splitting. */
+      if ( L > 32767 )
+        goto Split;
 
-        L = FT_HYPOT( dx_, dy_ );
+      /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
+      s_limit = L * (TPos)( ONE_PIXEL / 6 );
 
-        /* Avoid possible arithmetic overflow below by splitting. */
-        if ( L > 32767 )
-          goto Split;
+      /* s is L * the perpendicular distance from P1 to the line P0-P3. */
+      dx1 = arc[1].x - arc[0].x;
+      dy1 = arc[1].y - arc[0].y;
+      s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx1 ), MUL_LONG( dx, dy1 ) ) );
 
-        /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
-        s_limit = L * (TPos)( ONE_PIXEL / 6 );
+      if ( s > s_limit )
+        goto Split;
 
-        /* s is L * the perpendicular distance from P1 to the line P0-P3. */
-        dx1 = arc[1].x - arc[0].x;
-        dy1 = arc[1].y - arc[0].y;
-        s = FT_ABS( dy * dx1 - dx * dy1 );
+      /* s is L * the perpendicular distance from P2 to the line P0-P3. */
+      dx2 = arc[2].x - arc[0].x;
+      dy2 = arc[2].y - arc[0].y;
+      s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx2 ), MUL_LONG( dx, dy2 ) ) );
 
-        if ( s > s_limit )
-          goto Split;
+      if ( s > s_limit )
+        goto Split;
 
-        /* s is L * the perpendicular distance from P2 to the line P0-P3. */
-        dx2 = arc[2].x - arc[0].x;
-        dy2 = arc[2].y - arc[0].y;
-        s = FT_ABS( dy * dx2 - dx * dy2 );
+      /* Split super curvy segments where the off points are so far
+         from the chord that the angles P0-P1-P3 or P0-P2-P3 become
+         acute as detected by appropriate dot products. */
+      if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
+           dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
+        goto Split;
 
-        if ( s > s_limit )
-          goto Split;
+      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
 
-        /* Split super curvy segments where the off points are so far
-           from the chord that the angles P0-P1-P3 or P0-P2-P3 become
-           acute as detected by appropriate dot products. */
-        if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 ||
-             dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 )
-          goto Split;
+      if ( arc == bez_stack )
+        return;
 
-        /* No reason to split. */
-        goto Draw;
-      }
+      arc -= 3;
+      continue;
 
     Split:
       gray_split_cubic( arc );
       arc += 3;
-      continue;
-
-    Draw:
-      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
-
-      if ( arc == ras.bez_stack )
-        return;
-
-      arc -= 3;
     }
   }
 
@@ -1169,18 +1188,14 @@
     TPos  x, y;
 
 
-    /* record current cell, if any */
-    if ( !ras.invalid )
-      gray_record_cell( RAS_VAR );
-
     /* start to a new position */
     x = UPSCALE( to->x );
     y = UPSCALE( to->y );
 
-    gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
+    gray_set_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
 
-    worker->x = x;
-    worker->y = y;
+    ras.x = x;
+    ras.y = y;
     return 0;
   }
 
@@ -1216,83 +1231,23 @@
 
 
   static void
-  gray_render_span( int             y,
-                    int             count,
-                    const FT_Span*  spans,
-                    gray_PWorker    worker )
-  {
-    unsigned char*  p;
-    FT_Bitmap*      map = &worker->target;
-
-
-    /* first of all, compute the scanline offset */
-    p = (unsigned char*)map->buffer - y * map->pitch;
-    if ( map->pitch >= 0 )
-      p += ( map->rows - 1 ) * (unsigned int)map->pitch;
-
-    for ( ; count > 0; count--, spans++ )
-    {
-      unsigned char  coverage = spans->coverage;
-
-
-      if ( coverage )
-      {
-        /* For small-spans it is faster to do it by ourselves than
-         * calling `memset'.  This is mainly due to the cost of the
-         * function call.
-         */
-        if ( spans->len >= 8 )
-          FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
-        else
-        {
-          unsigned char*  q = p + spans->x;
-
-
-          switch ( spans->len )
-          {
-          case 7: *q++ = (unsigned char)coverage;
-          case 6: *q++ = (unsigned char)coverage;
-          case 5: *q++ = (unsigned char)coverage;
-          case 4: *q++ = (unsigned char)coverage;
-          case 3: *q++ = (unsigned char)coverage;
-          case 2: *q++ = (unsigned char)coverage;
-          case 1: *q   = (unsigned char)coverage;
-          default:
-            ;
-          }
-        }
-      }
-    }
-  }
-
-
-  static void
   gray_hline( RAS_ARG_ TCoord  x,
                        TCoord  y,
-                       TPos    area,
+                       TArea   coverage,
                        TCoord  acount )
   {
-    int  coverage;
-
-
-    /* compute the coverage line's coverage, depending on the    */
-    /* outline fill rule                                         */
-    /*                                                           */
-    /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
-    /*                                                           */
-    coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
-                                                    /* use range 0..256 */
+    /* scale the coverage from 0..(ONE_PIXEL*ONE_PIXEL*2) to 0..256  */
+    coverage >>= PIXEL_BITS * 2 + 1 - 8;
     if ( coverage < 0 )
-      coverage = -coverage;
+      coverage = -coverage - 1;
 
+    /* compute the line's coverage depending on the outline fill rule */
     if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
     {
       coverage &= 511;
 
-      if ( coverage > 256 )
-        coverage = 512 - coverage;
-      else if ( coverage == 256 )
-        coverage = 255;
+      if ( coverage >= 256 )
+        coverage = 511 - coverage;
     }
     else
     {
@@ -1301,179 +1256,83 @@
         coverage = 255;
     }
 
-    y += (TCoord)ras.min_ey;
-    x += (TCoord)ras.min_ex;
-
-    /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
-    if ( x >= 32767 )
-      x = 32767;
-
-    /* FT_Span.y is an integer, so limit our coordinates appropriately */
-    if ( y >= FT_INT_MAX )
-      y = FT_INT_MAX;
-
-    if ( coverage )
+    if ( ras.render_span )  /* for FT_RASTER_FLAG_DIRECT only */
     {
-      FT_Span*  span;
-      int       count;
+      FT_Span  span;
 
 
-      /* see whether we can add this span to the current list */
-      count = ras.num_gray_spans;
-      span  = ras.gray_spans + count - 1;
-      if ( count > 0                          &&
-           ras.span_y == y                    &&
-           (int)span->x + span->len == (int)x &&
-           span->coverage == coverage         )
+      span.x        = (short)x;
+      span.len      = (unsigned short)acount;
+      span.coverage = (unsigned char)coverage;
+
+      ras.render_span( y, 1, &span, ras.render_span_data );
+    }
+    else
+    {
+      unsigned char*  q = ras.target.origin - ras.target.pitch * y + x;
+      unsigned char   c = (unsigned char)coverage;
+
+
+      /* For small-spans it is faster to do it by ourselves than
+       * calling `memset'.  This is mainly due to the cost of the
+       * function call.
+       */
+      switch ( acount )
       {
-        span->len = (unsigned short)( span->len + acount );
-        return;
+      case 7: *q++ = c;
+      case 6: *q++ = c;
+      case 5: *q++ = c;
+      case 4: *q++ = c;
+      case 3: *q++ = c;
+      case 2: *q++ = c;
+      case 1: *q   = c;
+      case 0: break;
+      default:
+        FT_MEM_SET( q, c, acount );
       }
-
-      if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
-      {
-        if ( ras.render_span && count > 0 )
-          ras.render_span( ras.span_y, count, ras.gray_spans,
-                           ras.render_span_data );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-        if ( count > 0 )
-        {
-          int  n;
-
-
-          FT_TRACE7(( "y = %3d ", ras.span_y ));
-          span = ras.gray_spans;
-          for ( n = 0; n < count; n++, span++ )
-            FT_TRACE7(( "[%d..%d]:%02x ",
-                        span->x, span->x + span->len - 1, span->coverage ));
-          FT_TRACE7(( "\n" ));
-        }
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-        ras.num_gray_spans = 0;
-        ras.span_y         = (int)y;
-
-        span  = ras.gray_spans;
-      }
-      else
-        span++;
-
-      /* add a gray span to the current list */
-      span->x        = (short)x;
-      span->len      = (unsigned short)acount;
-      span->coverage = (unsigned char)coverage;
-
-      ras.num_gray_spans++;
     }
   }
 
 
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-  /* to be called while in the debugger --                                */
-  /* this function causes a compiler warning since it is unused otherwise */
   static void
-  gray_dump_cells( RAS_ARG )
+  gray_sweep( RAS_ARG )
   {
-    int  yindex;
+    int  y;
 
 
-    for ( yindex = 0; yindex < ras.ycount; yindex++ )
+    for ( y = ras.min_ey; y < ras.max_ey; y++ )
     {
-      PCell  cell;
-
-
-      printf( "%3d:", yindex );
-
-      for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
-        printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area );
-      printf( "\n" );
-    }
-  }
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-  static void
-  gray_sweep( RAS_ARG_ const FT_Bitmap*  target )
-  {
-    int  yindex;
-
-    FT_UNUSED( target );
-
-
-    if ( ras.num_cells == 0 )
-      return;
-
-    ras.num_gray_spans = 0;
-
-    FT_TRACE7(( "gray_sweep: start\n" ));
-
-    for ( yindex = 0; yindex < ras.ycount; yindex++ )
-    {
-      PCell   cell  = ras.ycells[yindex];
-      TCoord  cover = 0;
-      TCoord  x     = 0;
+      PCell   cell  = ras.ycells[y - ras.min_ey];
+      TCoord  x     = ras.min_ex;
+      TArea   cover = 0;
+      TArea   area;
 
 
       for ( ; cell != NULL; cell = cell->next )
       {
-        TPos  area;
+        if ( cover != 0 && cell->x > x )
+          gray_hline( RAS_VAR_ x, y, cover, cell->x - x );
 
+        cover += (TArea)cell->cover * ( ONE_PIXEL * 2 );
+        area   = cover - cell->area;
 
-        if ( cell->x > x && cover != 0 )
-          gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
-                      cell->x - x );
-
-        cover += cell->cover;
-        area   = cover * ( ONE_PIXEL * 2 ) - cell->area;
-
-        if ( area != 0 && cell->x >= 0 )
-          gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
+        if ( area != 0 && cell->x >= ras.min_ex )
+          gray_hline( RAS_VAR_ cell->x, y, area, 1 );
 
         x = cell->x + 1;
       }
 
       if ( cover != 0 )
-        gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
-                    ras.count_ex - x );
+        gray_hline( RAS_VAR_ x, y, cover, ras.max_ex - x );
     }
-
-    if ( ras.render_span && ras.num_gray_spans > 0 )
-      ras.render_span( ras.span_y, ras.num_gray_spans,
-                       ras.gray_spans, ras.render_span_data );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-    if ( ras.num_gray_spans > 0 )
-    {
-      FT_Span*  span;
-      int       n;
-
-
-      FT_TRACE7(( "y = %3d ", ras.span_y ));
-      span = ras.gray_spans;
-      for ( n = 0; n < ras.num_gray_spans; n++, span++ )
-        FT_TRACE7(( "[%d..%d]:%02x ",
-                    span->x, span->x + span->len - 1, span->coverage ));
-      FT_TRACE7(( "\n" ));
-    }
-
-    FT_TRACE7(( "gray_sweep: end\n" ));
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
   }
 
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
   /*************************************************************************/
   /*                                                                       */
-  /*  The following function should only compile in stand-alone mode,      */
+  /*  The following functions should only compile in stand-alone mode,     */
   /*  i.e., when building this component without the rest of FreeType.     */
   /*                                                                       */
   /*************************************************************************/
@@ -1744,32 +1603,102 @@
     return 0;
 
   Exit:
-    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+    FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error ));
     return error;
 
   Invalid_Outline:
     return FT_THROW( Invalid_Outline );
   }
 
-#endif /* _STANDALONE_ */
 
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_CBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an outline's `control box'.  The control box encloses all   */
+  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    that contains Bézier outside arcs).                                */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component, which is dedicated to this single task.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox   :: The outline's control box.                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */
+  /*                                                                       */
 
-  typedef struct  gray_TBand_
+  static void
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox )
   {
-    TPos  min, max;
+    TPos  xMin, yMin, xMax, yMax;
 
-  } gray_TBand;
+
+    if ( outline && acbox )
+    {
+      if ( outline->n_points == 0 )
+      {
+        xMin = 0;
+        yMin = 0;
+        xMax = 0;
+        yMax = 0;
+      }
+      else
+      {
+        FT_Vector*  vec   = outline->points;
+        FT_Vector*  limit = vec + outline->n_points;
+
+
+        xMin = xMax = vec->x;
+        yMin = yMax = vec->y;
+        vec++;
+
+        for ( ; vec < limit; vec++ )
+        {
+          TPos  x, y;
+
+
+          x = vec->x;
+          if ( x < xMin ) xMin = x;
+          if ( x > xMax ) xMax = x;
+
+          y = vec->y;
+          if ( y < yMin ) yMin = y;
+          if ( y > yMax ) yMax = y;
+        }
+      }
+      acbox->xMin = xMin;
+      acbox->xMax = xMax;
+      acbox->yMin = yMin;
+      acbox->yMax = yMax;
+    }
+  }
+
+#endif /* STANDALONE_ */
 
 
   FT_DEFINE_OUTLINE_FUNCS(
     func_interface,
 
-    (FT_Outline_MoveTo_Func) gray_move_to,
-    (FT_Outline_LineTo_Func) gray_line_to,
-    (FT_Outline_ConicTo_Func)gray_conic_to,
-    (FT_Outline_CubicTo_Func)gray_cubic_to,
-    0,
-    0 )
+    (FT_Outline_MoveTo_Func) gray_move_to,   /* move_to  */
+    (FT_Outline_LineTo_Func) gray_line_to,   /* line_to  */
+    (FT_Outline_ConicTo_Func)gray_conic_to,  /* conic_to */
+    (FT_Outline_CubicTo_Func)gray_cubic_to,  /* cubic_to */
+
+    0,                                       /* shift    */
+    0                                        /* delta    */
+  )
 
 
   static int
@@ -1788,10 +1717,21 @@
       error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
       if ( !ras.invalid )
         gray_record_cell( RAS_VAR );
+
+      FT_TRACE7(( "band [%d..%d]: %d cell%s\n",
+                  ras.min_ey,
+                  ras.max_ey,
+                  ras.num_cells,
+                  ras.num_cells == 1 ? "" : "s" ));
     }
     else
+    {
       error = FT_THROW( Memory_Overflow );
 
+      FT_TRACE7(( "band [%d..%d]: to be bisected\n",
+                  ras.min_ey, ras.max_ey ));
+    }
+
     return error;
   }
 
@@ -1799,158 +1739,108 @@
   static int
   gray_convert_glyph( RAS_ARG )
   {
-    gray_TBand            bands[40];
-    gray_TBand* volatile  band;
-    int volatile          n, num_bands;
-    TPos volatile         min, max, max_y;
-    FT_BBox*              clip;
+    const TCoord  yMin = ras.min_ey;
+    const TCoord  yMax = ras.max_ey;
+    const TCoord  xMin = ras.min_ex;
+    const TCoord  xMax = ras.max_ex;
 
+    TCell    buffer[FT_MAX_GRAY_POOL];
+    size_t   height = (size_t)( yMax - yMin );
+    size_t   n = FT_MAX_GRAY_POOL / 8;
+    TCoord   y;
+    TCoord   bands[32];  /* enough to accommodate bisections */
+    TCoord*  band;
 
-    /* Set up state in the raster object */
-    gray_compute_cbox( RAS_VAR );
-
-    /* clip to target bitmap, exit if nothing to do */
-    clip = &ras.clip_box;
-
-    if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
-         ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
-      return 0;
-
-    if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
-    if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
-
-    if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
-    if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
-
-    ras.count_ex = ras.max_ex - ras.min_ex;
-    ras.count_ey = ras.max_ey - ras.min_ey;
 
     /* set up vertical bands */
-    num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
-    if ( num_bands == 0 )
-      num_bands = 1;
-    if ( num_bands >= 39 )
-      num_bands = 39;
-
-    ras.band_shoot = 0;
-
-    min   = ras.min_ey;
-    max_y = ras.max_ey;
-
-    for ( n = 0; n < num_bands; n++, min = max )
+    if ( height > n )
     {
-      max = min + ras.band_size;
-      if ( n == num_bands - 1 || max > max_y )
-        max = max_y;
+      /* two divisions rounded up */
+      n       = ( height + n - 1 ) / n;
+      height  = ( height + n - 1 ) / n;
+    }
 
-      bands[0].min = min;
-      bands[0].max = max;
-      band         = bands;
+    /* memory management */
+    n = ( height * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / sizeof ( TCell );
 
-      while ( band >= bands )
+    ras.cells     = buffer + n;
+    ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - n );
+    ras.ycells    = (PCell*)buffer;
+
+    for ( y = yMin; y < yMax; )
+    {
+      ras.min_ey = y;
+      y         += height;
+      ras.max_ey = FT_MIN( y, yMax );
+
+      band    = bands;
+      band[1] = xMin;
+      band[0] = xMax;
+
+      do
       {
-        TPos  bottom, top, middle;
-        int   error;
-
-        {
-          PCell  cells_max;
-          int    yindex;
-          long   cell_start, cell_end, cell_mod;
+        TCoord  width = band[0] - band[1];
+        int     error;
 
 
-          ras.ycells = (PCell*)ras.buffer;
-          ras.ycount = band->max - band->min;
-
-          cell_start = (long)sizeof ( PCell ) * ras.ycount;
-          cell_mod   = cell_start % (long)sizeof ( TCell );
-          if ( cell_mod > 0 )
-            cell_start += (long)sizeof ( TCell ) - cell_mod;
-
-          cell_end  = ras.buffer_size;
-          cell_end -= cell_end % (long)sizeof ( TCell );
-
-          cells_max = (PCell)( (char*)ras.buffer + cell_end );
-          ras.cells = (PCell)( (char*)ras.buffer + cell_start );
-          if ( ras.cells >= cells_max )
-            goto ReduceBands;
-
-          ras.max_cells = cells_max - ras.cells;
-          if ( ras.max_cells < 2 )
-            goto ReduceBands;
-
-          for ( yindex = 0; yindex < ras.ycount; yindex++ )
-            ras.ycells[yindex] = NULL;
-        }
+        FT_MEM_ZERO( ras.ycells, height * sizeof ( PCell ) );
 
         ras.num_cells = 0;
         ras.invalid   = 1;
-        ras.min_ey    = band->min;
-        ras.max_ey    = band->max;
-        ras.count_ey  = band->max - band->min;
+        ras.min_ex    = band[1];
+        ras.max_ex    = band[0];
 
         error = gray_convert_glyph_inner( RAS_VAR );
 
         if ( !error )
         {
-          gray_sweep( RAS_VAR_ &ras.target );
+          gray_sweep( RAS_VAR );
           band--;
           continue;
         }
         else if ( error != ErrRaster_Memory_Overflow )
           return 1;
 
-      ReduceBands:
         /* render pool overflow; we will reduce the render band by half */
-        bottom = band->min;
-        top    = band->max;
-        middle = bottom + ( ( top - bottom ) >> 1 );
+        width >>= 1;
 
-        /* This is too complex for a single scanline; there must */
-        /* be some problems.                                     */
-        if ( middle == bottom )
+        /* this should never happen even with tiny rendering pool */
+        if ( width == 0 )
         {
-#ifdef FT_DEBUG_LEVEL_TRACE
           FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
-#endif
           return 1;
         }
 
-        if ( bottom-top >= ras.band_size )
-          ras.band_shoot++;
-
-        band[1].min = bottom;
-        band[1].max = middle;
-        band[0].min = middle;
-        band[0].max = top;
         band++;
-      }
+        band[1]  = band[0];
+        band[0] += width;
+      } while ( band >= bands );
     }
 
-    if ( ras.band_shoot > 8 && ras.band_size > 16 )
-      ras.band_size = ras.band_size / 2;
-
     return 0;
   }
 
 
   static int
-  gray_raster_render( gray_PRaster             raster,
+  gray_raster_render( FT_Raster                raster,
                       const FT_Raster_Params*  params )
   {
-    const FT_Outline*  outline     = (const FT_Outline*)params->source;
-    const FT_Bitmap*   target_map  = params->target;
+    const FT_Outline*  outline    = (const FT_Outline*)params->source;
+    const FT_Bitmap*   target_map = params->target;
+    FT_BBox            cbox, clip;
 
+#ifndef FT_STATIC_RASTER
     gray_TWorker  worker[1];
-
-    TCell  buffer[FT_MAX( FT_RENDER_POOL_SIZE, 2048 ) / sizeof ( TCell )];
-    long   buffer_size = sizeof ( buffer );
-    int    band_size   = (int)( buffer_size /
-                                (long)( sizeof ( TCell ) * 8 ) );
+#endif
 
 
     if ( !raster )
       return FT_THROW( Invalid_Argument );
 
+    /* this version does not support monochrome rendering */
+    if ( !( params->flags & FT_RASTER_FLAG_AA ) )
+      return FT_THROW( Invalid_Mode );
+
     if ( !outline )
       return FT_THROW( Invalid_Outline );
 
@@ -1965,9 +1855,19 @@
            outline->contours[outline->n_contours - 1] + 1 )
       return FT_THROW( Invalid_Outline );
 
-    /* if direct mode is not set, we must have a target bitmap */
-    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+    ras.outline = *outline;
+
+    if ( params->flags & FT_RASTER_FLAG_DIRECT )
     {
+      if ( !params->gray_spans )
+        return 0;
+
+      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;
+      ras.render_span_data = params->user;
+    }
+    else
+    {
+      /* if direct mode is not set, we must have a target bitmap */
       if ( !target_map )
         return FT_THROW( Invalid_Argument );
 
@@ -1977,51 +1877,59 @@
 
       if ( !target_map->buffer )
         return FT_THROW( Invalid_Argument );
+
+      if ( target_map->pitch < 0 )
+        ras.target.origin = target_map->buffer;
+      else
+        ras.target.origin = target_map->buffer
+              + ( target_map->rows - 1 ) * (unsigned int)target_map->pitch;
+
+      ras.target.pitch = target_map->pitch;
+
+      ras.render_span      = (FT_Raster_Span_Func)NULL;
+      ras.render_span_data = NULL;
     }
 
-    /* this version does not support monochrome rendering */
-    if ( !( params->flags & FT_RASTER_FLAG_AA ) )
-      return FT_THROW( Invalid_Mode );
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    /* reject too large outline coordinates */
+    if ( cbox.xMin < -0x1000000L || cbox.xMax > 0x1000000L ||
+         cbox.yMin < -0x1000000L || cbox.yMax > 0x1000000L )
+      return FT_THROW( Invalid_Outline );
+
+    /* truncate the bounding box to integer pixels */
+    cbox.xMin = cbox.xMin >> 6;
+    cbox.yMin = cbox.yMin >> 6;
+    cbox.xMax = ( cbox.xMax + 63 ) >> 6;
+    cbox.yMax = ( cbox.yMax + 63 ) >> 6;
 
     /* compute clipping box */
     if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
     {
       /* compute clip box from target pixmap */
-      ras.clip_box.xMin = 0;
-      ras.clip_box.yMin = 0;
-      ras.clip_box.xMax = (FT_Pos)target_map->width;
-      ras.clip_box.yMax = (FT_Pos)target_map->rows;
+      clip.xMin = 0;
+      clip.yMin = 0;
+      clip.xMax = (FT_Pos)target_map->width;
+      clip.yMax = (FT_Pos)target_map->rows;
     }
     else if ( params->flags & FT_RASTER_FLAG_CLIP )
-      ras.clip_box = params->clip_box;
+      clip = params->clip_box;
     else
     {
-      ras.clip_box.xMin = -32768L;
-      ras.clip_box.yMin = -32768L;
-      ras.clip_box.xMax =  32767L;
-      ras.clip_box.yMax =  32767L;
+      clip.xMin = -32768L;
+      clip.yMin = -32768L;
+      clip.xMax =  32767L;
+      clip.yMax =  32767L;
     }
 
-    gray_init_cells( RAS_VAR_ buffer, buffer_size );
+    /* clip to target bitmap, exit if nothing to do */
+    ras.min_ex = FT_MAX( cbox.xMin, clip.xMin );
+    ras.min_ey = FT_MAX( cbox.yMin, clip.yMin );
+    ras.max_ex = FT_MIN( cbox.xMax, clip.xMax );
+    ras.max_ey = FT_MIN( cbox.yMax, clip.yMax );
 
-    ras.outline        = *outline;
-    ras.num_cells      = 0;
-    ras.invalid        = 1;
-    ras.band_size      = band_size;
-    ras.num_gray_spans = 0;
-    ras.span_y         = 0;
-
-    if ( params->flags & FT_RASTER_FLAG_DIRECT )
-    {
-      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;
-      ras.render_span_data = params->user;
-    }
-    else
-    {
-      ras.target           = *target_map;
-      ras.render_span      = (FT_Raster_Span_Func)gray_render_span;
-      ras.render_span_data = &ras;
-    }
+    if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey )
+      return 0;
 
     return gray_convert_glyph( RAS_VAR );
   }
@@ -2030,7 +1938,7 @@
   /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
   /****                         a static object.                   *****/
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 
   static int
   gray_raster_new( void*       memory,
@@ -2042,7 +1950,7 @@
 
 
     *araster = (FT_Raster)&the_raster;
-    FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+    FT_ZERO( &the_raster );
 
     return 0;
   }
@@ -2055,7 +1963,7 @@
     FT_UNUSED( raster );
   }
 
-#else /* !_STANDALONE_ */
+#else /* !STANDALONE_ */
 
   static int
   gray_raster_new( FT_Memory   memory,
@@ -2085,13 +1993,13 @@
     FT_FREE( raster );
   }
 
-#endif /* !_STANDALONE_ */
+#endif /* !STANDALONE_ */
 
 
   static void
-  gray_raster_reset( FT_Raster  raster,
-                     char*      pool_base,
-                     long       pool_size )
+  gray_raster_reset( FT_Raster       raster,
+                     unsigned char*  pool_base,
+                     unsigned long   pool_size )
   {
     FT_UNUSED( raster );
     FT_UNUSED( pool_base );
@@ -2118,11 +2026,12 @@
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Raster_New_Func)     gray_raster_new,
-    (FT_Raster_Reset_Func)   gray_raster_reset,
-    (FT_Raster_Set_Mode_Func)gray_raster_set_mode,
-    (FT_Raster_Render_Func)  gray_raster_render,
-    (FT_Raster_Done_Func)    gray_raster_done )
+    (FT_Raster_New_Func)     gray_raster_new,       /* raster_new      */
+    (FT_Raster_Reset_Func)   gray_raster_reset,     /* raster_reset    */
+    (FT_Raster_Set_Mode_Func)gray_raster_set_mode,  /* raster_set_mode */
+    (FT_Raster_Render_Func)  gray_raster_render,    /* raster_render   */
+    (FT_Raster_Done_Func)    gray_raster_done       /* raster_done     */
+  )
 
 
 /* END */
diff --git a/src/smooth/ftgrays.h b/src/smooth/ftgrays.h
index 1b57603..9e11ca6 100644
--- a/src/smooth/ftgrays.h
+++ b/src/smooth/ftgrays.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType smooth renderer declaration                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,15 +16,15 @@
 /***************************************************************************/
 
 
-#ifndef __FTGRAYS_H__
-#define __FTGRAYS_H__
+#ifndef FTGRAYS_H_
+#define FTGRAYS_H_
 
 #ifdef __cplusplus
   extern "C" {
 #endif
 
 
-#ifdef _STANDALONE_
+#ifdef STANDALONE_
 #include "ftimage.h"
 #else
 #include <ft2build.h>
@@ -52,7 +52,7 @@
   }
 #endif
 
-#endif /* __FTGRAYS_H__ */
+#endif /* FTGRAYS_H_ */
 
 
 /* END */
diff --git a/src/smooth/ftsmerrs.h b/src/smooth/ftsmerrs.h
index cc38aa1..226dc1b 100644
--- a/src/smooth/ftsmerrs.h
+++ b/src/smooth/ftsmerrs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    smooth renderer error codes (specification only).                    */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __FTSMERRS_H__
-#define __FTSMERRS_H__
+#ifndef FTSMERRS_H_
+#define FTSMERRS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  Smooth_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __FTSMERRS_H__ */
+#endif /* FTSMERRS_H_ */
 
 
 /* END */
diff --git a/src/smooth/ftsmooth.c b/src/smooth/ftsmooth.c
index 3620550..ef176bd 100644
--- a/src/smooth/ftsmooth.c
+++ b/src/smooth/ftsmooth.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Anti-aliasing renderer interface (body).                             */
 /*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,12 +31,7 @@
   static FT_Error
   ft_smooth_init( FT_Renderer  render )
   {
-    FT_Library  library = FT_MODULE_LIBRARY( render );
-
-
-    render->clazz->raster_class->raster_reset( render->raster,
-                                               library->raster_pool,
-                                               library->raster_pool_size );
+    render->clazz->raster_class->raster_reset( render->raster, NULL, 0 );
 
     return 0;
   }
@@ -87,7 +82,7 @@
                       FT_GlyphSlot  slot,
                       FT_BBox*      cbox )
   {
-    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+    FT_ZERO( cbox );
 
     if ( slot->format == render->glyph_format )
       FT_Outline_Get_CBox( &slot->outline, cbox );
@@ -102,26 +97,17 @@
                             const FT_Vector*  origin,
                             FT_Render_Mode    required_mode )
   {
-    FT_Error     error;
+    FT_Error     error   = FT_Err_Ok;
     FT_Outline*  outline = &slot->outline;
     FT_Bitmap*   bitmap  = &slot->bitmap;
     FT_Memory    memory  = render->root.memory;
-    FT_BBox      cbox;
     FT_Pos       x_shift = 0;
     FT_Pos       y_shift = 0;
-    FT_Pos       x_left, y_top;
-    FT_Pos       width, height, pitch;
-#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    FT_Pos       height_org, width_org;
-#endif
-    FT_Int       hmul    = mode == FT_RENDER_MODE_LCD;
-    FT_Int       vmul    = mode == FT_RENDER_MODE_LCD_V;
+    FT_Int       hmul    = ( mode == FT_RENDER_MODE_LCD );
+    FT_Int       vmul    = ( mode == FT_RENDER_MODE_LCD_V );
 
     FT_Raster_Params  params;
 
-    FT_Bool  have_outline_shifted = FALSE;
-    FT_Bool  have_buffer          = FALSE;
-
 
     /* check glyph image format */
     if ( slot->format != render->glyph_format )
@@ -137,91 +123,6 @@
       goto Exit;
     }
 
-    if ( origin )
-    {
-      x_shift = origin->x;
-      y_shift = origin->y;
-    }
-
-    /* compute the control box, and grid fit it */
-    /* taking into account the origin shift     */
-    FT_Outline_Get_CBox( outline, &cbox );
-
-    cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift );
-    cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift );
-    cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift );
-    cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift );
-
-    x_shift -= cbox.xMin;
-    y_shift -= cbox.yMin;
-
-    x_left  = cbox.xMin >> 6;
-    y_top   = cbox.yMax >> 6;
-
-    width  = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6;
-    height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6;
-
-#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    width_org  = width;
-    height_org = height;
-#endif
-
-    pitch = width;
-    if ( hmul )
-    {
-      width *= 3;
-      pitch  = FT_PAD_CEIL( width, 4 );
-    }
-
-    if ( vmul )
-      height *= 3;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-    if ( slot->library->lcd_filter_func )
-    {
-      FT_Int  extra = slot->library->lcd_extra;
-
-
-      if ( hmul )
-      {
-        x_shift += 64 * ( extra >> 1 );
-        x_left  -= extra >> 1;
-        width   += 3 * extra;
-        pitch    = FT_PAD_CEIL( width, 4 );
-      }
-
-      if ( vmul )
-      {
-        y_shift += 64 * ( extra >> 1 );
-        y_top   += extra >> 1;
-        height  += 3 * extra;
-      }
-    }
-
-#endif
-
-    /*
-     * XXX: on 16bit system, we return an error for huge bitmap
-     * to prevent an overflow.
-     */
-    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX ||
-         x_left < FT_INT_MIN || y_top < FT_INT_MIN )
-    {
-      error = FT_THROW( Invalid_Pixel_Size );
-      goto Exit;
-    }
-
-    /* Required check is (pitch * height < FT_ULONG_MAX),        */
-    /* but we care realistic cases only.  Always pitch <= width. */
-    if ( width > 0x7FFF || height > 0x7FFF )
-    {
-      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
-                 width, height ));
-      error = FT_THROW( Raster_Overflow );
-      goto Exit;
-    }
-
     /* release old bitmap buffer */
     if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
@@ -229,30 +130,30 @@
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
+    ft_glyphslot_preset_bitmap( slot, mode, origin );
+
     /* allocate new one */
-    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) )
+    if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) )
       goto Exit;
-    else
-      have_buffer = TRUE;
 
     slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
 
-    slot->format      = FT_GLYPH_FORMAT_BITMAP;
-    slot->bitmap_left = (FT_Int)x_left;
-    slot->bitmap_top  = (FT_Int)y_top;
+    x_shift = 64 * -slot->bitmap_left;
+    y_shift = 64 * -slot->bitmap_top;
+    if ( bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+      y_shift += 64 * (FT_Int)bitmap->rows / 3;
+    else
+      y_shift += 64 * (FT_Int)bitmap->rows;
 
-    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
-    bitmap->num_grays  = 256;
-    bitmap->width      = (unsigned int)width;
-    bitmap->rows       = (unsigned int)height;
-    bitmap->pitch      = pitch;
+    if ( origin )
+    {
+      x_shift += origin->x;
+      y_shift += origin->y;
+    }
 
     /* translate outline to render it into the bitmap */
     if ( x_shift || y_shift )
-    {
       FT_Outline_Translate( outline, x_shift, y_shift );
-      have_outline_shifted = TRUE;
-    }
 
     /* set up parameters */
     params.target = bitmap;
@@ -299,80 +200,143 @@
     if ( error )
       goto Exit;
 
-    if ( slot->library->lcd_filter_func )
-      slot->library->lcd_filter_func( bitmap, mode, slot->library );
+    /* finally apply filtering */
+    if ( hmul || vmul )
+    {
+      FT_Byte*                 lcd_weights;
+      FT_Bitmap_LcdFilterFunc  lcd_filter_func;
+
+
+      /* Per-face LCD filtering takes priority if set up. */
+      if ( slot->face && slot->face->internal->lcd_filter_func )
+      {
+        lcd_weights     = slot->face->internal->lcd_weights;
+        lcd_filter_func = slot->face->internal->lcd_filter_func;
+      }
+      else
+      {
+        lcd_weights     = slot->library->lcd_weights;
+        lcd_filter_func = slot->library->lcd_filter_func;
+      }
+
+      if ( lcd_filter_func )
+        lcd_filter_func( bitmap, mode, lcd_weights );
+    }
 
 #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
-    /* render outline into bitmap */
-    error = render->raster_render( render->raster, &params );
-    if ( error )
-      goto Exit;
-
-    /* expand it horizontally */
-    if ( hmul )
+    if ( hmul )  /* lcd */
     {
-      FT_Byte*  line = bitmap->buffer;
-      FT_UInt   hh;
+      FT_Byte*  line;
+      FT_Byte*  temp = NULL;
+      FT_UInt   i, j;
+
+      unsigned int  height = bitmap->rows;
+      unsigned int  width  = bitmap->width;
+      int           pitch  = bitmap->pitch;
 
 
-      for ( hh = height_org; hh > 0; hh--, line += pitch )
+      /* Render 3 separate monochrome bitmaps, shifting the outline  */
+      /* by 1/3 pixel.                                               */
+      width /= 3;
+
+      bitmap->buffer += width;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline, -21, 0 );
+      x_shift        -= 21;
+      bitmap->buffer += width;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline,  42, 0 );
+      x_shift        += 42;
+      bitmap->buffer -= 2 * width;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      /* XXX: Rearrange the bytes according to FT_PIXEL_MODE_LCD.    */
+      /* XXX: It is more efficient to render every third byte above. */
+
+      if ( FT_ALLOC( temp, (FT_ULong)pitch ) )
+        goto Exit;
+
+      for ( i = 0; i < height; i++ )
       {
-        FT_UInt   xx;
-        FT_Byte*  end = line + width;
-
-
-        for ( xx = width_org; xx > 0; xx-- )
+        line = bitmap->buffer + i * (FT_ULong)pitch;
+        for ( j = 0; j < width; j++ )
         {
-          FT_UInt  pixel = line[xx-1];
-
-
-          end[-3] = (FT_Byte)pixel;
-          end[-2] = (FT_Byte)pixel;
-          end[-1] = (FT_Byte)pixel;
-          end    -= 3;
+          temp[3 * j    ] = line[j];
+          temp[3 * j + 1] = line[j + width];
+          temp[3 * j + 2] = line[j + width + width];
         }
+        FT_MEM_COPY( line, temp, pitch );
       }
-    }
 
-    /* expand it vertically */
-    if ( vmul )
+      FT_FREE( temp );
+    }
+    else if ( vmul )  /* lcd_v */
     {
-      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
-      FT_Byte*  write = bitmap->buffer;
-      FT_UInt   hh;
+      int  pitch  = bitmap->pitch;
 
 
-      for ( hh = height_org; hh > 0; hh-- )
-      {
-        ft_memcpy( write, read, pitch );
-        write += pitch;
+      /* Render 3 separate monochrome bitmaps, shifting the outline  */
+      /* by 1/3 pixel. Triple the pitch to render on each third row. */
+      bitmap->pitch *= 3;
+      bitmap->rows  /= 3;
 
-        ft_memcpy( write, read, pitch );
-        write += pitch;
+      bitmap->buffer += pitch;
 
-        ft_memcpy( write, read, pitch );
-        write += pitch;
-        read  += pitch;
-      }
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline, 0,  21 );
+      y_shift        += 21;
+      bitmap->buffer += pitch;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline, 0, -42 );
+      y_shift        -= 42;
+      bitmap->buffer -= 2 * pitch;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      bitmap->pitch /= 3;
+      bitmap->rows  *= 3;
     }
+    else  /* grayscale */
+      error = render->raster_render( render->raster, &params );
 
 #endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
-    /* everything is fine; don't deallocate buffer */
-    have_buffer = FALSE;
-
-    error = FT_Err_Ok;
-
   Exit:
-    if ( have_outline_shifted )
-      FT_Outline_Translate( outline, -x_shift, -y_shift );
-    if ( have_buffer )
+    if ( !error )
+    {
+      /* everything is fine; the glyph is now officially a bitmap */
+      slot->format = FT_GLYPH_FORMAT_BITMAP;
+    }
+    else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
       FT_FREE( bitmap->buffer );
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, -x_shift, -y_shift );
+
     return error;
   }
 
@@ -399,14 +363,8 @@
                         FT_Render_Mode    mode,
                         const FT_Vector*  origin )
   {
-    FT_Error  error;
-
-    error = ft_smooth_render_generic( render, slot, mode, origin,
-                                      FT_RENDER_MODE_LCD );
-    if ( !error )
-      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
-
-    return error;
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_LCD );
   }
 
 
@@ -417,18 +375,13 @@
                           FT_Render_Mode    mode,
                           const FT_Vector*  origin )
   {
-    FT_Error  error;
-
-    error = ft_smooth_render_generic( render, slot, mode, origin,
-                                      FT_RENDER_MODE_LCD_V );
-    if ( !error )
-      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
-
-    return error;
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_LCD_V );
   }
 
 
-  FT_DEFINE_RENDERER( ft_smooth_renderer_class,
+  FT_DEFINE_RENDERER(
+    ft_smooth_renderer_class,
 
       FT_MODULE_RENDERER,
       sizeof ( FT_RendererRec ),
@@ -437,25 +390,25 @@
       0x10000L,
       0x20000L,
 
-      0,    /* module specific interface */
+      NULL,    /* module specific interface */
 
-      (FT_Module_Constructor)ft_smooth_init,
-      (FT_Module_Destructor) 0,
-      (FT_Module_Requester)  0
-    ,
+      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
+      (FT_Module_Destructor) NULL,            /* module_done   */
+      (FT_Module_Requester)  NULL,            /* get_interface */
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Renderer_RenderFunc)   ft_smooth_render,
-    (FT_Renderer_TransformFunc)ft_smooth_transform,
-    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
-    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+    (FT_Renderer_RenderFunc)   ft_smooth_render,     /* render_glyph    */
+    (FT_Renderer_TransformFunc)ft_smooth_transform,  /* transform_glyph */
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,   /* get_glyph_cbox  */
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,   /* set_mode        */
 
-    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET           /* raster_class    */
   )
 
 
-  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
+  FT_DEFINE_RENDERER(
+    ft_smooth_lcd_renderer_class,
 
       FT_MODULE_RENDERER,
       sizeof ( FT_RendererRec ),
@@ -464,24 +417,25 @@
       0x10000L,
       0x20000L,
 
-      0,    /* module specific interface */
+      NULL,    /* module specific interface */
 
-      (FT_Module_Constructor)ft_smooth_init,
-      (FT_Module_Destructor) 0,
-      (FT_Module_Requester)  0
-    ,
+      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
+      (FT_Module_Destructor) NULL,            /* module_done   */
+      (FT_Module_Requester)  NULL,            /* get_interface */
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,
-    (FT_Renderer_TransformFunc)ft_smooth_transform,
-    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
-    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,  /* render_glyph    */
+    (FT_Renderer_TransformFunc)ft_smooth_transform,   /* transform_glyph */
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,    /* get_glyph_cbox  */
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,    /* set_mode        */
 
-    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET            /* raster_class    */
   )
 
-  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
+
+  FT_DEFINE_RENDERER(
+    ft_smooth_lcdv_renderer_class,
 
       FT_MODULE_RENDERER,
       sizeof ( FT_RendererRec ),
@@ -490,21 +444,20 @@
       0x10000L,
       0x20000L,
 
-      0,    /* module specific interface */
+      NULL,    /* module specific interface */
 
-      (FT_Module_Constructor)ft_smooth_init,
-      (FT_Module_Destructor) 0,
-      (FT_Module_Requester)  0
-    ,
+      (FT_Module_Constructor)ft_smooth_init,  /* module_init   */
+      (FT_Module_Destructor) NULL,            /* module_done   */
+      (FT_Module_Requester)  NULL,            /* get_interface */
 
     FT_GLYPH_FORMAT_OUTLINE,
 
-    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,
-    (FT_Renderer_TransformFunc)ft_smooth_transform,
-    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
-    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,  /* render_glyph    */
+    (FT_Renderer_TransformFunc)ft_smooth_transform,     /* transform_glyph */
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,      /* get_glyph_cbox  */
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,      /* set_mode        */
 
-    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+    (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET              /* raster_class    */
   )
 
 
diff --git a/src/smooth/ftsmooth.h b/src/smooth/ftsmooth.h
index 765018c..c76ffc5 100644
--- a/src/smooth/ftsmooth.h
+++ b/src/smooth/ftsmooth.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Anti-aliasing renderer interface (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __FTSMOOTH_H__
-#define __FTSMOOTH_H__
+#ifndef FTSMOOTH_H_
+#define FTSMOOTH_H_
 
 
 #include <ft2build.h>
@@ -27,23 +27,16 @@
 FT_BEGIN_HEADER
 
 
-#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
-  FT_DECLARE_RENDERER( ft_std_renderer_class )
-#endif
-
-#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
   FT_DECLARE_RENDERER( ft_smooth_renderer_class )
 
   FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
 
-  FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
-#endif
-
+  FT_DECLARE_RENDERER( ft_smooth_lcdv_renderer_class )
 
 
 FT_END_HEADER
 
-#endif /* __FTSMOOTH_H__ */
+#endif /* FTSMOOTH_H_ */
 
 
 /* END */
diff --git a/src/smooth/ftspic.c b/src/smooth/ftspic.c
index 8e6ed57..10f04cf 100644
--- a/src/smooth/ftspic.c
+++ b/src/smooth/ftspic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for smooth module.   */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/smooth/ftspic.h b/src/smooth/ftspic.h
index 99b9f0e..80fb64c 100644
--- a/src/smooth/ftspic.h
+++ b/src/smooth/ftspic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for smooth module.   */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,14 +16,15 @@
 /***************************************************************************/
 
 
-#ifndef __FTSPIC_H__
-#define __FTSPIC_H__
+#ifndef FTSPIC_H_
+#define FTSPIC_H_
+
+
+#include FT_INTERNAL_PIC_H
 
 
 FT_BEGIN_HEADER
 
-#include FT_INTERNAL_PIC_H
-
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define FT_GRAYS_RASTER_GET  ft_grays_raster
@@ -68,7 +69,7 @@
 
 FT_END_HEADER
 
-#endif /* __FTSPIC_H__ */
+#endif /* FTSPIC_H_ */
 
 
 /* END */
diff --git a/src/smooth/module.mk b/src/smooth/module.mk
index 740936f..5b8bc3b 100644
--- a/src/smooth/module.mk
+++ b/src/smooth/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/smooth/rules.mk b/src/smooth/rules.mk
index f00ebd5..f30824a 100644
--- a/src/smooth/rules.mk
+++ b/src/smooth/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/smooth/smooth.c b/src/smooth/smooth.c
index 4ca4344..5249a89 100644
--- a/src/smooth/smooth.c
+++ b/src/smooth/smooth.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType anti-aliasing rasterer module component (body only).        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,11 +17,11 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "ftspic.c"
+
 #include "ftgrays.c"
 #include "ftsmooth.c"
+#include "ftspic.c"
 
 
 /* END */
diff --git a/src/tools/afblue.pl b/src/tools/afblue.pl
index 56b6452..7c6f1a7 100644
--- a/src/tools/afblue.pl
+++ b/src/tools/afblue.pl
@@ -5,7 +5,7 @@
 #
 # Process a blue zone character data file.
 #
-# Copyright 2013-2015 by
+# Copyright 2013-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used,
@@ -38,7 +38,8 @@
 
 my $curr_enum_element; # Name of the current enumeration element.
 my $curr_offset;       # The offset relative to current aux. variable.
-my $curr_elem_size;    # The size of the current string or block.
+my $curr_elem_size;    # The number of non-space characters in the current string or
+                       # the number of elements in the current block.
 
 my $have_sections = 0; # Boolean; set if start of a section has been seen.
 my $have_strings;      # Boolean; set if current section contains strings.
@@ -159,12 +160,14 @@
   # A series of ASCII characters in the printable range.
   my $s = shift;
 
-  # We ignore spaces.
-  $s =~ s/ //g;
+  # We reduce multiple space characters to a single one.
+  $s =~ s/ +/ /g;
 
-  my $count = $s =~ s/\G(.)/'$1', /g;
-  $curr_offset += $count;
-  $curr_elem_size += $count;
+  # Count all non-space characters.  Note that `()' applies a list context
+  # to the capture that is used to count the elements.
+  $curr_elem_size += () = $s =~ /[^ ]/g;
+
+  $curr_offset += $s =~ s/\G(.)/'$1', /g;
 
   return $s;
 }
diff --git a/src/tools/apinames.c b/src/tools/apinames.c
index 9f81b1a..06c3260 100644
--- a/src/tools/apinames.c
+++ b/src/tools/apinames.c
@@ -22,7 +22,7 @@
 #include <ctype.h>
 
 #define  PROGRAM_NAME     "apinames"
-#define  PROGRAM_VERSION  "0.2"
+#define  PROGRAM_VERSION  "0.3"
 
 #define  LINEBUFF_SIZE  1024
 
@@ -32,7 +32,8 @@
   OUTPUT_WINDOWS_DEF,   /* output a Windows .DEF file for Visual C++ or Mingw */
   OUTPUT_BORLAND_DEF,   /* output a Windows .DEF file for Borland C++         */
   OUTPUT_WATCOM_LBC,    /* output a Watcom Linker Command File                */
-  OUTPUT_NETWARE_IMP    /* output a NetWare ImportFile                        */
+  OUTPUT_NETWARE_IMP,   /* output a NetWare ImportFile                        */
+  OUTPUT_GNU_VERMAP     /* output a version map for GNU or Solaris linker     */
 
 } OutputFormat;
 
@@ -90,14 +91,14 @@
     max_names += (max_names >> 1) + 4;
     the_names  = (NameRec*)realloc( the_names,
                                     sizeof ( the_names[0] ) * max_names );
-    if ( the_names == NULL )
+    if ( !the_names )
       panic( "not enough memory" );
   }
   nm = &the_names[num_names++];
 
   nm->hash = h;
   nm->name = (char*)malloc( len+1 );
-  if ( nm->name == NULL )
+  if ( !nm->name )
     panic( "not enough memory" );
 
   memcpy( nm->name, name, len );
@@ -159,7 +160,7 @@
         char         temp[512];
 
 
-        if ( dll_name == NULL )
+        if ( !dll_name )
         {
           fprintf( stderr,
                    "you must provide a DLL name with the -d option!\n" );
@@ -168,7 +169,7 @@
 
         /* we must omit the .dll suffix from the library name */
         dot = strchr( dll_name, '.' );
-        if ( dot != NULL )
+        if ( dot )
         {
           int  len = dot - dll_name;
 
@@ -190,7 +191,7 @@
 
     case OUTPUT_NETWARE_IMP:
       {
-        if ( dll_name != NULL )
+        if ( dll_name )
           fprintf( out, "  (%s)\n", dll_name );
         for ( nn = 0; nn < num_names - 1; nn++ )
           fprintf( out, "  %s,\n", the_names[nn].name );
@@ -198,6 +199,15 @@
       }
       break;
 
+    case OUTPUT_GNU_VERMAP:
+      {
+        fprintf( out, "{\n\tglobal:\n" );
+        for ( nn = 0; nn < num_names; nn++ )
+          fprintf( out, "\t\t%s;\n", the_names[nn].name );
+        fprintf( out, "\tlocal:\n\t\t*;\n};\n" );
+      }
+      break;
+
     default:  /* LIST */
       for ( nn = 0; nn < num_names; nn++ )
         fprintf( out, "%s\n", the_names[nn].name );
@@ -323,6 +333,7 @@
    "           -wB    : output .DEF file for Borland C++\n"
    "           -wW    : output Watcom Linker Response File\n"
    "           -wN    : output NetWare Import File\n"
+   "           -wL    : output version map for GNU or Solaris linker\n"
    "\n";
 
   fprintf( stderr,
@@ -371,7 +382,7 @@
           arg += 2;
 
         out = fopen( arg, "wt" );
-        if ( out == NULL )
+        if ( !out )
         {
           fprintf( stderr, "could not open '%s' for writing\n", argv[2] );
           exit(3);
@@ -410,6 +421,10 @@
             format = OUTPUT_NETWARE_IMP;
             break;
 
+          case 'L':
+            format = OUTPUT_GNU_VERMAP;
+            break;
+
           case 0:
             break;
 
@@ -440,7 +455,7 @@
     {
       FILE*  file = fopen( argv[0], "rb" );
 
-      if ( file == NULL )
+      if ( !file )
         fprintf( stderr, "unable to open '%s'\n", argv[0] );
       else
       {
diff --git a/src/tools/chktrcmp.py b/src/tools/chktrcmp.py
index ce6500c..4c40bda 100755
--- a/src/tools/chktrcmp.py
+++ b/src/tools/chktrcmp.py
@@ -15,7 +15,7 @@
 KNOWN_COMPONENT = {}
 
 SRC_FILE_DIRS   = [ "src" ]
-TRACE_DEF_FILES = [ "include/internal/fttrace.h" ]
+TRACE_DEF_FILES = [ "include/freetype/internal/fttrace.h" ]
 
 
 # --------------------------------------------------------------
diff --git a/src/tools/docmaker/content.py b/src/tools/docmaker/content.py
index 6887f0b..198780a 100644
--- a/src/tools/docmaker/content.py
+++ b/src/tools/docmaker/content.py
@@ -3,7 +3,7 @@
 #
 #    Parse comment blocks to build content blocks (library file).
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -46,16 +46,34 @@
 
 
 #
-# A regular expression to isolate identifiers from other text.
+# A regular expression to isolate identifiers from other text.  Two syntax
+# forms are supported:
 #
-re_identifier = re.compile( r'((?:\w|-)*)' )
+#   <name>
+#   <name>[<id>]
+#
+# where both `<name>' and `<id>' consist of alphanumeric characters, `_',
+# and `-'.  Use `<id>' if there are multiple, valid `<name>' entries; in the
+# index, `<id>' will be appended in parentheses.
+#
+# For example,
+#
+#   stem_darkening[autofit]
+#
+# becomes `stem_darkening (autofit)' in the index.
+#
+re_identifier = re.compile( r"""
+                              ((?:\w|-)+
+                               (?:\[(?:\w|-)+\])?)
+                            """, re.VERBOSE )
 
 
 #
 # We collect macro names ending in `_H' (group 1), as defined in
-# `config/ftheader.h'.  While outputting the object data, we use this info
-# together with the object's file location (group 2) to emit the appropriate
-# header file macro and its associated file name before the object itself.
+# `freetype/config/ftheader.h'.  While outputting the object data, we use
+# this info together with the object's file location (group 2) to emit the
+# appropriate header file macro and its associated file name before the
+# object itself.
 #
 # Example:
 #
@@ -91,7 +109,7 @@
     def  dump( self, prefix = "", width = 60 ):
         lines = self.dump_lines( 0, width )
         for l in lines:
-            print prefix + l
+            print( prefix + l )
 
     def  dump_lines( self, margin = 0, width = 60 ):
         result = []
@@ -121,7 +139,7 @@
     def  dump( self, prefix = "", width = 60 ):
         lines = self.dump_lines( 0, width )
         for l in lines:
-            print prefix + l
+            print( prefix + l )
 
     def  dump_lines( self, margin = 0, width = 60 ):
         cur    = ""  # current line
@@ -225,13 +243,13 @@
 
     def  dump( self, prefix = "" ):
         if self.field:
-            print prefix + self.field + " ::"
+            print( prefix + self.field + " ::" )
             prefix = prefix + "----"
 
         first = 1
         for p in self.items:
             if not first:
-                print ""
+                print( "" )
             p.dump( prefix )
             first = 0
 
@@ -312,10 +330,10 @@
             return None
 
     def  dump( self, margin ):
-        print " " * margin + "<" + self.tag + ">"
+        print( " " * margin + "<" + self.tag + ">" )
         for f in self.fields:
             f.dump( "  " )
-        print " " * margin + "</" + self.tag + ">"
+        print( " " * margin + "</" + self.tag + ">" )
 
 
 ################################################################
@@ -435,15 +453,32 @@
         markup_lines = []
         first        = 1
 
+        margin  = -1
+        in_code = 0
+
         for line in content:
-            found = None
-            for t in re_markup_tags:
-                m = t.match( line )
+            if in_code:
+                m = re_code_end.match( line )
+                if m and len( m.group( 1 ) ) <= margin:
+                    in_code = 0
+                    margin  = -1
+            else:
+                m = re_code_start.match( line )
                 if m:
-                    found  = string.lower( m.group( 1 ) )
-                    prefix = len( m.group( 0 ) )
-                    line   = " " * prefix + line[prefix:]   # remove markup from line
-                    break
+                    in_code = 1
+                    margin  = len( m.group( 1 ) )
+
+            found = None
+
+            if not in_code:
+                for t in re_markup_tags:
+                    m = t.match( line )
+                    if m:
+                        found  = string.lower( m.group( 1 ) )
+                        prefix = len( m.group( 0 ) )
+                        # remove markup from line
+                        line   = " " * prefix + line[prefix:]
+                        break
 
             # is it the start of a new markup section ?
             if found:
diff --git a/src/tools/docmaker/docbeauty.py b/src/tools/docmaker/docbeauty.py
index 3ddf4a9..0b021fa 100644
--- a/src/tools/docmaker/docbeauty.py
+++ b/src/tools/docmaker/docbeauty.py
@@ -10,9 +10,7 @@
 from content import *
 from utils   import *
 
-import utils
-
-import sys, os, time, string, getopt
+import sys, os, string, getopt
 
 
 content_processor = ContentProcessor()
@@ -40,13 +38,13 @@
 
 
 def  usage():
-    print "\nDocBeauty 0.1 Usage information\n"
-    print "  docbeauty [options] file1 [file2 ...]\n"
-    print "using the following options:\n"
-    print "  -h : print this page"
-    print "  -b : backup original files with the 'orig' extension"
-    print ""
-    print "  --backup : same as -b"
+    print( "\nDocBeauty 0.1 Usage information\n" )
+    print( "  docbeauty [options] file1 [file2 ...]\n" )
+    print( "using the following options:\n" )
+    print( "  -h : print this page" )
+    print( "  -b : backup original files with the 'orig' extension" )
+    print( "" )
+    print( "  --backup : same as -b" )
 
 
 def  main( argv ):
diff --git a/src/tools/docmaker/docmaker.py b/src/tools/docmaker/docmaker.py
index de82d93..eb49afb 100644
--- a/src/tools/docmaker/docmaker.py
+++ b/src/tools/docmaker/docmaker.py
@@ -4,7 +4,7 @@
 #
 #    Convert source code markup to HTML documentation.
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -31,21 +31,21 @@
 
 import utils
 
-import sys, os, time, string, glob, getopt
+import sys, glob, getopt
 
 
 def  usage():
-    print "\nDocMaker Usage information\n"
-    print "  docmaker [options] file1 [file2 ...]\n"
-    print "using the following options:\n"
-    print "  -h : print this page"
-    print "  -t : set project title, as in '-t \"My Project\"'"
-    print "  -o : set output directory, as in '-o mydir'"
-    print "  -p : set documentation prefix, as in '-p ft2'"
-    print ""
-    print "  --title  : same as -t, as in '--title=\"My Project\"'"
-    print "  --output : same as -o, as in '--output=mydir'"
-    print "  --prefix : same as -p, as in '--prefix=ft2'"
+    print( "\nDocMaker Usage information\n" )
+    print( "  docmaker [options] file1 [file2 ...]\n" )
+    print( "using the following options:\n" )
+    print( "  -h : print this page" )
+    print( "  -t : set project title, as in '-t \"My Project\"'" )
+    print( "  -o : set output directory, as in '-o mydir'" )
+    print( "  -p : set documentation prefix, as in '-p ft2'" )
+    print( "" )
+    print( "  --title  : same as -t, as in '--title=\"My Project\"'" )
+    print( "  --output : same as -o, as in '--output=mydir'" )
+    print( "  --prefix : same as -p, as in '--prefix=ft2'" )
 
 
 def  main( argv ):
diff --git a/src/tools/docmaker/formatter.py b/src/tools/docmaker/formatter.py
index f0a8808..2708fd4 100644
--- a/src/tools/docmaker/formatter.py
+++ b/src/tools/docmaker/formatter.py
@@ -3,7 +3,7 @@
 #
 #    Convert parsed content blocks to a structured document (library file).
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -56,6 +56,11 @@
         self.block_index = self.identifiers.keys()
         self.block_index.sort( key = index_key )
 
+        # also add section names to dictionary (without making them appear
+        # in the index)
+        for section in self.sections:
+            self.add_identifier( section.name, section )
+
     def  add_identifier( self, name, block ):
         if name in self.identifiers:
             # duplicate name!
diff --git a/src/tools/docmaker/sources.py b/src/tools/docmaker/sources.py
index 0cf21ce..e3b95e0 100644
--- a/src/tools/docmaker/sources.py
+++ b/src/tools/docmaker/sources.py
@@ -3,7 +3,7 @@
 #
 #    Convert source code comments to multi-line blocks (library file).
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -29,7 +29,7 @@
 #
 
 
-import fileinput, re, sys, os, string
+import fileinput, re, string
 
 
 ################################################################
@@ -138,27 +138,40 @@
 
 #
 # A regular expression to detect a cross reference, after markup tags have
-# been stripped off.  Group 1 is the reference, group 2 the rest of the
-# line.
+# been stripped off.
 #
-# A cross reference consists of letters, digits, or characters `-' and `_'.
+# Two syntax forms are supported:
 #
-re_crossref = re.compile( r'@((?:\w|-)*)(.*)' )    #  @foo
+#   @<name>
+#   @<name>[<id>]
+#
+# where both `<name>' and `<id>' consist of alphanumeric characters, `_',
+# and `-'.  Use `<id>' if there are multiple, valid `<name>' entries.
+#
+# Example: @foo[bar]
+#
+re_crossref = re.compile( r"""
+                            @
+                            (?P<name>(?:\w|-)+
+                                     (?:\[(?:\w|-)+\])?)
+                            (?P<rest>.*)
+                          """, re.VERBOSE )
 
 #
 # Two regular expressions to detect italic and bold markup, respectively.
 # Group 1 is the markup, group 2 the rest of the line.
 #
 # Note that the markup is limited to words consisting of letters, digits,
-# the character `_', or an apostrophe (but not as the first character).
+# the characters `_' and `-', or an apostrophe (but not as the first
+# character).
 #
-re_italic = re.compile( r"_(\w(?:\w|')*)_(.*)" )     #  _italic_
-re_bold   = re.compile( r"\*(\w(?:\w|')*)\*(.*)" )   #  *bold*
+re_italic = re.compile( r"_((?:\w|-)(?:\w|'|-)*)_(.*)" )     #  _italic_
+re_bold   = re.compile( r"\*((?:\w|-)(?:\w|'|-)*)\*(.*)" )   #  *bold*
 
 #
 # This regular expression code to identify an URL has been taken from
 #
-#   http://mail.python.org/pipermail/tutor/2002-September/017228.html
+#   https://mail.python.org/pipermail/tutor/2002-September/017228.html
 #
 # (with slight modifications).
 #
@@ -283,10 +296,10 @@
     # debugging only -- not used in normal operations
     def  dump( self ):
         if self.content:
-            print "{{{content start---"
+            print( "{{{content start---" )
             for l in self.content:
-                print l
-            print "---content end}}}"
+                print( l )
+            print( "---content end}}}" )
             return
 
         fmt = ""
@@ -294,7 +307,7 @@
             fmt = repr( self.format.id ) + " "
 
         for line in self.lines:
-            print line
+            print( line )
 
 
 ################################################################
diff --git a/src/tools/docmaker/tohtml.py b/src/tools/docmaker/tohtml.py
index bc6bcf0..9f318a2 100644
--- a/src/tools/docmaker/tohtml.py
+++ b/src/tools/docmaker/tohtml.py
@@ -3,7 +3,7 @@
 #
 #    A sub-class container of the `Formatter' class to produce HTML.
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -25,7 +25,7 @@
 # The following strings define the HTML header used by all generated pages.
 html_header_1 = """\
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
@@ -164,7 +164,8 @@
 """
 
 # The header and footer used for each section.
-section_title_header = "<h1>"
+section_title_header1 = '<h1 id="'
+section_title_header2 = '">'
 section_title_footer = "</h1>"
 
 # The header and footer used for code segments.
@@ -309,7 +310,14 @@
     def  make_block_url( self, block, name = None ):
         if name == None:
             name = block.name
-        return self.make_section_url( block.section ) + "#" + name
+
+        try:
+            section_url = self.make_section_url( block.section )
+        except:
+            # we already have a section
+            section_url = self.make_section_url( block )
+
+        return section_url + "#" + name
 
     def  make_html_word( self, word ):
         """Analyze a simple word to detect cross-references and markup."""
@@ -317,11 +325,27 @@
         m = re_crossref.match( word )
         if m:
             try:
-                name = m.group( 1 )
-                rest = m.group( 2 )
+                name = m.group( 'name' )
+                rest = m.group( 'rest' )
                 block = self.identifiers[name]
                 url   = self.make_block_url( block )
-                return '<a href="' + url + '">' + name + '</a>' + rest
+                # display `foo[bar]' as `foo'
+                name = re.sub( r'\[.*\]', '', name )
+                # normalize url, following RFC 3986
+                url = string.replace( url, "[", "(" )
+                url = string.replace( url, "]", ")" )
+
+                try:
+                    # for sections, display title
+                    url = ( '&lsquo;<a href="' + url + '">'
+                            + block.title + '</a>&rsquo;'
+                            + rest )
+                except:
+                    url = ( '<a href="' + url + '">'
+                            + name + '</a>'
+                            + rest )
+
+                return url
             except:
                 # we detected a cross-reference to an unknown item
                 sys.stderr.write( "WARNING: undefined cross reference"
@@ -366,7 +390,7 @@
         """Convert a code sequence to HTML."""
         line = code_header + '\n'
         for l in lines:
-            line = line + html_quote( l ) + '\n'
+            line = line + html_quote( l ).rstrip() + '\n'
 
         return line + code_footer
 
@@ -382,7 +406,7 @@
         return string.join( lines, '\n' )
 
     def  print_html_items( self, items ):
-        print self.make_html_items( items )
+        print( self.make_html_items( items ) )
 
     def  print_html_field( self, field ):
         if field.name:
@@ -390,10 +414,10 @@
                    + field.name
                    + "</b></td><td>" )
 
-        print self.make_html_items( field.items )
+        print( self.make_html_items( field.items ) )
 
         if field.name:
-            print "</td></tr></table>"
+            print( "</td></tr></table>" )
 
     def  html_source_quote( self, line, block_name = None ):
         result = ""
@@ -417,16 +441,22 @@
                     id = block.name
 
                     # link to a field ID if possible
-                    for markup in block.markups:
-                        if markup.tag == 'values':
-                            for field in markup.fields:
-                                if field.name:
-                                    id = name
+                    try:
+                      for markup in block.markups:
+                          if markup.tag == 'values':
+                              for field in markup.fields:
+                                  if field.name:
+                                      id = name
 
-                    result = ( result + prefix
-                               + '<a href="'
-                               + self.make_block_url( block, id )
-                               + '">' + name + '</a>' )
+                      result = ( result + prefix
+                                 + '<a href="'
+                                 + self.make_block_url( block, id )
+                                 + '">' + name + '</a>' )
+                    except:
+                      # sections don't have `markups'; however, we don't
+                      # want references to sections here anyway
+                      result = result + html_quote( line[:length] )
+
                 else:
                     result = result + html_quote( line[:length] )
 
@@ -438,14 +468,14 @@
         return result
 
     def  print_html_field_list( self, fields ):
-        print '<table class="fields">'
+        print( '<table class="fields">' )
         for field in fields:
-            print ( '<tr><td class="val" id="' + field.name + '">'
-                    + field.name
-                    + '</td><td class="desc">' )
+            print( '<tr><td class="val" id="' + field.name + '">'
+                   + field.name
+                   + '</td><td class="desc">' )
             self.print_html_items( field.items )
-            print "</td></tr>"
-        print "</table>"
+            print( "</td></tr>" )
+        print( "</table>" )
 
     def  print_html_markup( self, markup ):
         table_fields = []
@@ -469,7 +499,7 @@
     # formatting the index
     #
     def  index_enter( self ):
-        print self.html_index_header
+        print( self.html_index_header )
         self.index_items = {}
 
     def  index_name_enter( self, name ):
@@ -482,7 +512,7 @@
         count = len( self.block_index )
         rows  = ( count + self.columns - 1 ) // self.columns
 
-        print '<table class="index">'
+        print( '<table class="index">' )
         for r in range( rows ):
             line = "<tr>"
             for c in range( self.columns ):
@@ -490,20 +520,26 @@
                 if i < count:
                     bname = self.block_index[r + c * rows]
                     url   = self.index_items[bname]
+                    # display `foo[bar]' as `foo (bar)'
+                    bname = string.replace( bname, "[", " (" )
+                    bname = string.replace( bname, "]", ")"  )
+                    # normalize url, following RFC 3986
+                    url = string.replace( url, "[", "(" )
+                    url = string.replace( url, "]", ")" )
                     line  = ( line + '<td><a href="' + url + '">'
                               + bname + '</a></td>' )
                 else:
                     line = line + '<td></td>'
             line = line + "</tr>"
-            print line
+            print( line )
 
-        print "</table>"
+        print( "</table>" )
 
         print( index_footer_start
                + self.file_prefix + "toc.html"
                + index_footer_end )
 
-        print self.html_footer
+        print( self.html_footer )
 
         self.index_items = {}
 
@@ -517,25 +553,25 @@
     # formatting the table of contents
     #
     def  toc_enter( self ):
-        print self.html_toc_header
-        print "<h1>Table of Contents</h1>"
+        print( self.html_toc_header )
+        print( "<h1>Table of Contents</h1>" )
 
     def  toc_chapter_enter( self, chapter ):
-        print chapter_header + string.join( chapter.title ) + chapter_inter
-        print '<table class="toc">'
+        print( chapter_header + string.join( chapter.title ) + chapter_inter )
+        print( '<table class="toc">' )
 
     def  toc_section_enter( self, section ):
-        print ( '<tr><td class="link">'
-                + '<a href="' + self.make_section_url( section ) + '">'
-                + section.title + '</a></td><td class="desc">' )
-        print self.make_html_para( section.abstract )
+        print( '<tr><td class="link">'
+               + '<a href="' + self.make_section_url( section ) + '">'
+               + section.title + '</a></td><td class="desc">' )
+        print( self.make_html_para( section.abstract ) )
 
     def  toc_section_exit( self, section ):
-        print "</td></tr>"
+        print( "</td></tr>" )
 
     def  toc_chapter_exit( self, chapter ):
-        print "</table>"
-        print chapter_footer
+        print( "</table>" )
+        print( chapter_footer )
 
     def  toc_index( self, index_filename ):
         print( chapter_header
@@ -547,7 +583,7 @@
                + self.file_prefix + "index.html"
                + toc_footer_end )
 
-        print self.html_footer
+        print( self.html_footer )
 
     def  toc_dump( self, toc_filename = None, index_filename = None ):
         if toc_filename == None:
@@ -562,9 +598,11 @@
     # formatting sections
     #
     def  section_enter( self, section ):
-        print self.html_header
+        print( self.html_header )
 
-        print section_title_header + section.title + section_title_footer
+        print( section_title_header1 + section.name + section_title_header2
+               + section.title
+               + section_title_footer )
 
         maxwidth = 0
         for b in section.blocks.values():
@@ -574,8 +612,8 @@
         width = 70  # XXX magic number
         if maxwidth > 0:
             # print section synopsis
-            print section_synopsis_header
-            print '<table class="synopsis">'
+            print( section_synopsis_header )
+            print( '<table class="synopsis">' )
 
             columns = width // maxwidth
             if columns < 1:
@@ -601,26 +639,38 @@
                             # even omit it completely)
                             line = line + "&nbsp;"
                         else:
-                            line = ( line + '<a href="#' + name + '">'
+                            url = name
+                            # display `foo[bar]' as `foo'
+                            name = re.sub( r'\[.*\]', '', name )
+                            # normalize url, following RFC 3986
+                            url = string.replace( url, "[", "(" )
+                            url = string.replace( url, "]", ")" )
+                            line = ( line + '<a href="#' + url + '">'
                                      + name + '</a>' )
 
                     line = line + '</td>'
                 line = line + "</tr>"
-                print line
+                print( line )
 
-            print "</table>"
-            print section_synopsis_footer
+            print( "</table>" )
+            print( section_synopsis_footer )
 
-        print description_header
-        print self.make_html_items( section.description )
-        print description_footer
+        print( description_header )
+        print( self.make_html_items( section.description ) )
+        print( description_footer )
 
     def  block_enter( self, block ):
-        print block_header
+        print( block_header )
 
         # place html anchor if needed
         if block.name:
-            print( '<h3 id="' + block.name + '">' + block.name + '</h3>' )
+            url = block.name
+            # display `foo[bar]' as `foo'
+            name = re.sub( r'\[.*\]', '', block.name )
+            # normalize url, following RFC 3986
+            url = string.replace( url, "[", "(" )
+            url = string.replace( url, "]", ")" )
+            print( '<h3 id="' + url + '">' + name + '</h3>' )
 
         # dump the block C source lines now
         if block.code:
@@ -636,28 +686,28 @@
 #                 + " '" + block.source.filename + "'.\n" )
 
             if header:
-                print ( header_location_header
-                        + 'Defined in ' + header + '.'
-                        + header_location_footer )
+                print( header_location_header
+                       + 'Defined in ' + header + '.'
+                       + header_location_footer )
 
-            print source_header
+            print( source_header )
             for l in block.code:
-                print self.html_source_quote( l, block.name )
-            print source_footer
+                print( self.html_source_quote( l, block.name ) )
+            print( source_footer )
 
     def  markup_enter( self, markup, block ):
         if markup.tag == "description":
-            print description_header
+            print( description_header )
         else:
-            print marker_header + markup.tag + marker_inter
+            print( marker_header + markup.tag + marker_inter )
 
         self.print_html_markup( markup )
 
     def  markup_exit( self, markup, block ):
         if markup.tag == "description":
-            print description_footer
+            print( description_footer )
         else:
-            print marker_footer
+            print( marker_footer )
 
     def  block_exit( self, block ):
         print( block_footer_start + self.file_prefix + "index.html"
@@ -665,7 +715,7 @@
                + block_footer_end )
 
     def  section_exit( self, section ):
-        print html_footer
+        print( html_footer )
 
     def  section_dump_all( self ):
         for section in self.sections:
diff --git a/src/tools/docmaker/utils.py b/src/tools/docmaker/utils.py
index 52af17a..f40f167 100644
--- a/src/tools/docmaker/utils.py
+++ b/src/tools/docmaker/utils.py
@@ -3,7 +3,7 @@
 #
 #    Auxiliary functions for the `docmaker' tool (library file).
 #
-#  Copyright 2002-2015 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -79,7 +79,7 @@
             if not os.path.isdir( output_dir ):
                 sys.stderr.write( "argument"
                                   + " '" + output_dir + "' "
-                                  + "is not a valid directory" )
+                                  + "is not a valid directory\n" )
                 sys.exit( 2 )
         else:
             output_dir = None
diff --git a/src/tools/ftfuzzer/README b/src/tools/ftfuzzer/README
new file mode 100644
index 0000000..09d8e9f
--- /dev/null
+++ b/src/tools/ftfuzzer/README
@@ -0,0 +1,81 @@
+ftfuzzer
+========
+
+
+ftfuzzer.cc
+-----------
+
+This file contains a target function  for FreeType fuzzing.  It can be
+used   with    libFuzzer   (https://llvm.org/docs/LibFuzzer.html)   or
+potentially any other similar fuzzer.
+
+Usage:
+
+  1. Build  `libfreetype.a' and  `ftfuzzer.cc' using  the most  recent
+     clang compiler with these flags:
+
+       # for fuzzer coverage feedback
+       -fsanitize-coverage=edge,8bit-counters
+       # for bug checking
+       -fsanitize=address,signed-integer-overflow,shift
+
+     You  also need  the header  files from  the `libarchive'  library
+     (https://www.libarchive.org/)  for handling  tar files  (see file
+     `ftmutator.cc' below for more).
+
+  2. Link with `libFuzzer' (it contains `main') and `libarchive'.
+
+  3. Run the fuzzer on some test corpus.
+
+The exact flags and commands may vary.
+
+  https://github.com/google/oss-fuzz/tree/master/projects/freetype2
+
+There is a continuous fuzzing bot that runs ftfuzzer.
+
+  https://oss-fuzz.com
+
+(You need an account  to be able to see coverage  reports and the like
+on oss-fuzz.com.)
+
+Check the bot configuration for the most current settings.
+
+
+ftmutator.cc
+------------
+
+FreeType has the  ability to `attach' auxiliary files to  a font file,
+providing additional information.  The main usage is to load AFM files
+for PostScript Type 1 fonts.
+
+However, libFuzzer currently only supports  mutation of a single input
+file.   For  this  reason,  `ftmutator.cc' contains  a  custom  fuzzer
+mutator that uses an uncompressed tar  file archive as the input.  The
+first file in  such a tarball gets  opened by FreeType as  a font, all
+other files are treated as input for `FT_Attach_Stream'.
+
+Compilation is similar to `ftfuzzer.c'.
+
+
+runinput.cc
+-----------
+
+To run the target function on a set of input files, this file contains
+a   convenience  `main'   function.   Link   it  with   `ftfuzzer.cc',
+`libfreetype.a', and `libarchive' and run like
+
+  ./a.out my_tests_inputs/*
+
+----------------------------------------------------------------------
+
+Copyright 2015-2018 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.
+
+
+--- end of README ---
diff --git a/src/tools/ftfuzzer/ftfuzzer.cc b/src/tools/ftfuzzer/ftfuzzer.cc
new file mode 100644
index 0000000..acf2bc9
--- /dev/null
+++ b/src/tools/ftfuzzer/ftfuzzer.cc
@@ -0,0 +1,428 @@
+// ftfuzzer.cc
+//
+//   A fuzzing function to test FreeType with libFuzzer.
+//
+// Copyright 2015-2018 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.
+
+
+// we use `unique_ptr', `decltype', and other gimmicks defined since C++11
+#if __cplusplus < 201103L
+#  error "a C++11 compiler is needed"
+#endif
+
+#include <archive.h>
+#include <archive_entry.h>
+
+#include <assert.h>
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+
+  using namespace std;
+
+
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+#include FT_CACHE_H
+#include FT_CACHE_CHARMAP_H
+#include FT_CACHE_IMAGE_H
+#include FT_CACHE_SMALL_BITMAPS_H
+#include FT_SYNTHESIS_H
+#include FT_ADVANCES_H
+#include FT_OUTLINE_H
+#include FT_BBOX_H
+#include FT_MODULE_H
+#include FT_DRIVER_H
+#include FT_MULTIPLE_MASTERS_H
+
+
+  static FT_Library  library;
+  static int         InitResult;
+
+
+  struct FT_Global
+  {
+    FT_Global()
+    {
+      InitResult = FT_Init_FreeType( &library );
+      if ( InitResult )
+        return;
+
+      // try to activate Adobe's CFF engine; it might not be the default
+      unsigned int  cff_hinting_engine = FT_HINTING_ADOBE;
+      FT_Property_Set( library,
+                       "cff",
+                       "hinting-engine", &cff_hinting_engine );
+    }
+
+    ~FT_Global()
+    {
+      FT_Done_FreeType( library );
+    }
+  };
+
+  FT_Global  global_ft;
+
+
+  // We want to select n values at random (without repetition),
+  // with 0 < n <= N.  The algorithm is taken from TAoCP, Vol. 2
+  // (Algorithm S, selection sampling technique)
+  struct Random
+  {
+    int  n;
+    int  N;
+
+    int  t; // total number of values so far
+    int  m; // number of selected values so far
+
+    uint32_t  r; // the current pseudo-random number
+
+    Random( int n_,
+            int N_ )
+    : n( n_ ),
+      N( N_ )
+    {
+      t = 0;
+      m = 0;
+
+      // Ideally, this should depend on the input file,
+      // for example, taking the sha256 as input;
+      // however, this is overkill for fuzzying tests.
+      r = 12345;
+    }
+
+    int get()
+    {
+      if ( m >= n )
+        return -1;
+
+    Redo:
+      // We can't use `rand': different C libraries might provide
+      // different implementations of this function.  As a replacement,
+      // we use a 32bit version of the `xorshift' algorithm.
+      r ^= r << 13;
+      r ^= r >> 17;
+      r ^= r << 5;
+
+      double  U = double( r ) / UINT32_MAX;
+
+      if ( ( N - t ) * U >= ( n - m ) )
+      {
+        t++;
+        goto Redo;
+      }
+
+      t++;
+      m++;
+
+      return t;
+    }
+  };
+
+
+  static int
+  archive_read_entry_data( struct archive   *ar,
+                           vector<FT_Byte>  *vw )
+  {
+    int             r;
+    const FT_Byte*  buff;
+    size_t          size;
+    int64_t         offset;
+
+    for (;;)
+    {
+      r = archive_read_data_block( ar,
+                                   reinterpret_cast<const void**>( &buff ),
+                                   &size,
+                                   &offset );
+      if ( r == ARCHIVE_EOF )
+        return ARCHIVE_OK;
+      if ( r != ARCHIVE_OK )
+        return r;
+
+      vw->insert( vw->end(), buff, buff + size );
+    }
+  }
+
+
+  static vector<vector<FT_Byte>>
+  parse_data( const uint8_t*  data,
+              size_t          size )
+  {
+    struct archive_entry*    entry;
+    int                      r;
+    vector<vector<FT_Byte>>  files;
+
+    unique_ptr<struct  archive,
+               decltype ( archive_read_free )*>  a( archive_read_new(),
+                                                    archive_read_free );
+
+    // activate reading of uncompressed tar archives
+    archive_read_support_format_tar( a.get() );
+
+    // the need for `const_cast' was removed with libarchive commit be4d4dd
+    if ( !( r = archive_read_open_memory(
+                  a.get(),
+                  const_cast<void*>(static_cast<const void*>( data ) ),
+                  size ) ) )
+    {
+      unique_ptr<struct  archive,
+                 decltype ( archive_read_close )*>  a_open( a.get(),
+                                                            archive_read_close );
+
+      // read files contained in archive
+      for (;;)
+      {
+        r = archive_read_next_header( a_open.get(), &entry );
+        if ( r == ARCHIVE_EOF )
+          break;
+        if ( r != ARCHIVE_OK )
+          break;
+
+        vector<FT_Byte>  entry_data;
+        r = archive_read_entry_data( a.get(), &entry_data );
+        if ( r != ARCHIVE_OK )
+          break;
+
+        files.push_back( move( entry_data ) );
+      }
+    }
+
+    if ( files.size() == 0 )
+      files.emplace_back( data, data + size );
+
+    return files;
+  }
+
+
+  static void
+  setIntermediateAxis( FT_Face  face )
+  {
+    // only handle Multiple Masters and GX variation fonts
+    if ( !FT_HAS_MULTIPLE_MASTERS( face ) )
+      return;
+
+    // get variation data for current instance
+    FT_MM_Var*  variations_ptr = nullptr;
+    if ( FT_Get_MM_Var( face, &variations_ptr ) )
+      return;
+
+    unique_ptr<FT_MM_Var,
+               decltype ( free )*>  variations( variations_ptr, free );
+    vector<FT_Fixed>                coords( variations->num_axis );
+
+    // select an arbitrary instance
+    for ( unsigned int  i = 0; i < variations->num_axis; i++ )
+      coords[i] = ( variations->axis[i].minimum +
+                    variations->axis[i].def     ) / 2;
+
+    if ( FT_Set_Var_Design_Coordinates( face,
+                                        FT_UInt( coords.size() ),
+                                        coords.data() ) )
+      return;
+  }
+
+
+  // the interface function to the libFuzzer library
+  extern "C" int
+  LLVMFuzzerTestOneInput( const uint8_t*  data,
+                          size_t          size_ )
+  {
+    assert( !InitResult );
+
+    if ( size_ < 1 )
+      return 0;
+
+    const vector<vector<FT_Byte>>&  files = parse_data( data, size_ );
+
+    FT_Face         face;
+    FT_Int32        load_flags  = FT_LOAD_DEFAULT;
+#if 0
+    FT_Render_Mode  render_mode = FT_RENDER_MODE_NORMAL;
+#endif
+
+    // We use a conservative approach here, at the cost of calling
+    // `FT_New_Face' quite often.  The idea is that the fuzzer should be
+    // able to try all faces and named instances of a font, expecting that
+    // some faces don't work for various reasons, e.g., a broken subfont, or
+    // an unsupported NFNT bitmap font in a Mac dfont resource that holds
+    // more than a single font.
+
+    // get number of faces
+    if ( FT_New_Memory_Face( library,
+                             files[0].data(),
+                             (FT_Long)files[0].size(),
+                             -1,
+                             &face ) )
+      return 0;
+    long  num_faces = face->num_faces;
+    FT_Done_Face( face );
+
+    // loop over up to 20 arbitrarily selected faces
+    // from index range [0;num-faces-1]
+    long  max_face_cnt = num_faces < 20
+                           ? num_faces
+                           : 20;
+
+    Random  faces_pool( (int)max_face_cnt, (int)num_faces );
+
+    for ( long  face_cnt = 0;
+          face_cnt < max_face_cnt;
+          face_cnt++ )
+    {
+      long  face_index = faces_pool.get() - 1;
+
+      // get number of instances
+      if ( FT_New_Memory_Face( library,
+                               files[0].data(),
+                               (FT_Long)files[0].size(),
+                               -( face_index + 1 ),
+                               &face ) )
+        continue;
+      long  num_instances = face->style_flags >> 16;
+      FT_Done_Face( face );
+
+      // loop over the face without instance (index 0)
+      // and up to 20 arbitrarily selected instances
+      // from index range [1;num_instances]
+      long  max_instance_cnt = num_instances < 20
+                                 ? num_instances
+                                 : 20;
+
+      Random  instances_pool( (int)max_instance_cnt, (int)num_instances );
+
+      for ( long  instance_cnt = 0;
+            instance_cnt <= max_instance_cnt;
+            instance_cnt++ )
+      {
+        long  instance_index = 0;
+
+        if ( !instance_cnt )
+        {
+          if ( FT_New_Memory_Face( library,
+                                   files[0].data(),
+                                   (FT_Long)files[0].size(),
+                                   face_index,
+                                   &face ) )
+            continue;
+        }
+        else
+        {
+          instance_index = instances_pool.get();
+
+          if ( FT_New_Memory_Face( library,
+                                   files[0].data(),
+                                   (FT_Long)files[0].size(),
+                                   ( instance_index << 16 ) + face_index,
+                                   &face ) )
+            continue;
+        }
+
+        // if we have more than a single input file coming from an archive,
+        // attach them (starting with the second file) using the order given
+        // in the archive
+        for ( size_t  files_index = 1;
+              files_index < files.size();
+              files_index++ )
+        {
+          FT_Open_Args  open_args = {};
+          open_args.flags         = FT_OPEN_MEMORY;
+          open_args.memory_base   = files[files_index].data();
+          open_args.memory_size   = (FT_Long)files[files_index].size();
+
+          // the last archive element will be eventually used as the
+          // attachment
+          FT_Attach_Stream( face, &open_args );
+        }
+
+        // loop over an arbitrary size for outlines
+        // and up to ten arbitrarily selected bitmap strike sizes
+        // from the range [0;num_fixed_sizes - 1]
+        int  max_size_cnt = face->num_fixed_sizes < 10
+                              ? face->num_fixed_sizes
+                              : 10;
+
+        Random sizes_pool( max_size_cnt, face->num_fixed_sizes );
+
+        for ( int  size_cnt = 0;
+              size_cnt <= max_size_cnt;
+              size_cnt++ )
+        {
+          FT_Int32  flags = load_flags;
+
+          int  size_index = 0;
+
+          if ( !size_cnt )
+          {
+            // set up 20pt at 72dpi as an arbitrary size
+            if ( FT_Set_Char_Size( face, 20 * 64, 20 * 64, 72, 72 ) )
+              continue;
+            flags |= FT_LOAD_NO_BITMAP;
+          }
+          else
+          {
+            // bitmap strikes are not active for font variations
+            if ( instance_index )
+              continue;
+
+            size_index = sizes_pool.get() - 1;
+
+            if ( FT_Select_Size( face, size_index ) )
+              continue;
+            flags |= FT_LOAD_COLOR;
+          }
+
+          // test MM interface only for a face without a selected instance
+          // and without a selected bitmap strike
+          if ( !instance_index && !size_cnt )
+            setIntermediateAxis( face );
+
+          // loop over all glyphs
+          for ( unsigned int  glyph_index = 0;
+                glyph_index < (unsigned int)face->num_glyphs;
+                glyph_index++ )
+          {
+            if ( FT_Load_Glyph( face, glyph_index, flags ) )
+              continue;
+
+            // Rendering is the most expensive and the least interesting part.
+            //
+            // if ( FT_Render_Glyph( face->glyph, render_mode) )
+            //   continue;
+            // FT_GlyphSlot_Embolden( face->glyph );
+
+#if 0
+            FT_Glyph  glyph;
+            if ( !FT_Get_Glyph( face->glyph, &glyph ) )
+              FT_Done_Glyph( glyph );
+
+            FT_Outline*  outline = &face->glyph->outline;
+            FT_Matrix    rot30   = { 0xDDB4, -0x8000, 0x8000, 0xDDB4 };
+
+            FT_Outline_Transform( outline, &rot30 );
+
+            FT_BBox  bbox;
+            FT_Outline_Get_BBox( outline, &bbox );
+#endif
+          }
+        }
+        FT_Done_Face( face );
+      }
+    }
+
+    return 0;
+  }
+
+
+// END
diff --git a/src/tools/ftfuzzer/ftmutator.cc b/src/tools/ftfuzzer/ftmutator.cc
new file mode 100644
index 0000000..ae4b140
--- /dev/null
+++ b/src/tools/ftfuzzer/ftmutator.cc
@@ -0,0 +1,314 @@
+// ftmutator.cc
+//
+//   A custom fuzzer mutator to test for FreeType with libFuzzer.
+//
+// Copyright 2015-2018 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.
+
+
+// Since `tar' is not a valid format for input to FreeType, treat any input
+// that looks like `tar' as multiple files and mutate them separately.
+//
+// In the future, a variation of this may be used to guide mutation on a
+// logically higher level.
+
+
+// we use `unique_ptr', `decltype', and other gimmicks defined since C++11
+#if __cplusplus < 201103L
+#  error "a C++11 compiler is needed"
+#endif
+
+#include <cstdint>
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+#include <cstddef>
+#include <cstring>
+#include <iostream>
+
+#include <memory>
+#include <vector>
+
+#include <archive.h>
+#include <archive_entry.h>
+
+#include "FuzzerInterface.h"
+
+
+  using namespace std;
+
+
+  // This function should be defined by `ftfuzzer.cc'.
+  extern "C" int
+  LLVMFuzzerTestOneInput( const uint8_t*  Data,
+                          size_t          Size );
+
+
+  static void
+  check_result( struct archive*  a,
+                int              r )
+  {
+    if ( r == ARCHIVE_OK )
+      return;
+
+    const char*  m = archive_error_string( a );
+    write( 1, m, strlen( m ) );
+    exit( 1 );
+  }
+
+
+  static int
+  archive_read_entry_data( struct archive   *ar,
+                           vector<uint8_t>  *vw )
+  {
+    int             r;
+    const uint8_t*  buff;
+    size_t          size;
+    int64_t         offset;
+
+    for (;;)
+    {
+      r = archive_read_data_block( ar,
+                                   reinterpret_cast<const void**>( &buff ),
+                                   &size,
+                                   &offset );
+      if ( r == ARCHIVE_EOF )
+        return ARCHIVE_OK;
+      if ( r != ARCHIVE_OK )
+        return r;
+
+      vw->insert( vw->end(), buff, buff + size );
+    }
+  }
+
+
+  static vector<vector<uint8_t>>
+  parse_data( const uint8_t*  data,
+              size_t          size )
+  {
+    struct archive_entry*    entry;
+    int                      r;
+    vector<vector<uint8_t>>  files;
+
+    unique_ptr<struct  archive,
+               decltype ( archive_read_free )*>  a( archive_read_new(),
+                                                    archive_read_free );
+
+    // activate reading of uncompressed tar archives
+    archive_read_support_format_tar( a.get() );
+
+    // the need for `const_cast' was removed with libarchive commit be4d4dd
+    if ( !( r = archive_read_open_memory(
+                  a.get(),
+                  const_cast<void*>(static_cast<const void*>( data ) ),
+                  size ) ) )
+    {
+      unique_ptr<struct  archive,
+                 decltype ( archive_read_close )*>  a_open( a.get(),
+                                                            archive_read_close );
+
+      // read files contained in archive
+      for (;;)
+      {
+        r = archive_read_next_header( a_open.get(), &entry );
+        if ( r == ARCHIVE_EOF )
+          break;
+        if ( r != ARCHIVE_OK )
+          break;
+
+        vector<uint8_t>  entry_data;
+        r = archive_read_entry_data( a.get(), &entry_data );
+        if ( entry_data.size() == 0 )
+          continue;
+
+        files.push_back( move( entry_data ) );
+        if ( r != ARCHIVE_OK )
+          break;
+      }
+    }
+
+    return files;
+  }
+
+
+  class FTFuzzer
+  : public fuzzer::UserSuppliedFuzzer
+  {
+
+  public:
+    FTFuzzer( fuzzer::FuzzerRandomBase*  Rand )
+    : fuzzer::UserSuppliedFuzzer( Rand ) {}
+
+
+    int
+    TargetFunction( const uint8_t*  Data,
+                    size_t          Size )
+    {
+      return LLVMFuzzerTestOneInput( Data, Size );
+    }
+
+
+    // Custom mutator.
+    virtual size_t
+    Mutate( uint8_t*  Data,
+            size_t    Size,
+            size_t    MaxSize )
+    {
+      vector<vector<uint8_t>>  files = parse_data( Data, Size );
+
+      // If the file was not recognized as a tar file, treat it as non-tar.
+      if ( files.size() == 0 )
+        return fuzzer::UserSuppliedFuzzer::Mutate( Data, Size, MaxSize );
+
+      // This is somewhat `white box' on tar.  The tar format uses 512 byte
+      // blocks.  One block as header for each file, two empty blocks of 0's
+      // at the end.  File data is padded to fill its last block.
+      size_t  used_blocks = files.size() + 2;
+      for ( const auto&  file : files )
+        used_blocks += ( file.size() + 511 ) / 512;
+
+      size_t  max_blocks = MaxSize / 512;
+
+      // If the input is big, it will need to be downsized.  If the original
+      // tar file was too big, it may have been clipped to fit.  In this
+      // case it may not be possible to properly write out the data, as
+      // there may not be enough space for the trailing two blocks.  Start
+      // dropping file data or files from the end.
+      for ( size_t  i = files.size();
+            i-- > 1 && used_blocks > max_blocks; )
+      {
+        size_t  blocks_to_free = used_blocks - max_blocks;
+        size_t  blocks_currently_used_by_file_data =
+                  ( files[i].size() + 511 ) / 512;
+
+        if ( blocks_currently_used_by_file_data >= blocks_to_free )
+        {
+          files[i].resize( ( blocks_currently_used_by_file_data -
+                               blocks_to_free ) * 512 );
+          used_blocks -= blocks_to_free;
+          continue;
+        }
+
+        files.pop_back();
+        used_blocks -= blocks_currently_used_by_file_data + 1;
+      }
+
+      // If we get down to one file, don't use tar.
+      if ( files.size() == 1 )
+      {
+        memcpy( Data, files[0].data(), files[0].size() );
+        return fuzzer::UserSuppliedFuzzer::Mutate( Data,
+                                                   files[0].size(),
+                                                   MaxSize );
+      }
+
+      size_t  free_blocks = max_blocks - used_blocks;
+
+      // Allow each file to use up as much of the currently available space
+      // it can.  If it uses or gives up blocks, add them or remove them
+      // from the pool.
+      for ( auto&&  file : files )
+      {
+        size_t  blocks_currently_used_by_file = ( file.size() + 511 ) / 512;
+        size_t  blocks_available = blocks_currently_used_by_file +
+                                     free_blocks;
+        size_t  max_size = blocks_available * 512;
+        size_t  data_size = file.size();
+
+        file.resize( max_size );
+        file.resize( fuzzer::UserSuppliedFuzzer::Mutate( file.data(),
+                                                         data_size,
+                                                         max_size ) );
+
+        size_t  blocks_now_used_by_file = ( file.size() + 511 ) / 512;
+        free_blocks = free_blocks +
+                        blocks_currently_used_by_file -
+                        blocks_now_used_by_file;
+      }
+
+      unique_ptr<struct  archive,
+                 decltype ( archive_write_free )*>  a( archive_write_new(),
+                                                       archive_write_free );
+
+      check_result( a.get(), archive_write_add_filter_none( a.get() ) );
+      check_result( a.get(), archive_write_set_format_ustar( a.get() ) );
+
+      // `used' may not be correct until after the archive is closed.
+      size_t  used = 0xbadbeef;
+      check_result( a.get(), archive_write_open_memory( a.get(),
+                                                        Data,
+                                                        MaxSize,
+                                                        &used ) );
+
+      {
+        unique_ptr<struct  archive,
+                   decltype ( archive_write_close )*>  a_open( a.get(),
+                                                               archive_write_close );
+
+        int  file_index = 0;
+        for ( const auto&  file : files )
+        {
+          unique_ptr<struct  archive_entry,
+                     decltype ( archive_entry_free )*>
+            e( archive_entry_new2( a_open.get() ),
+                                   archive_entry_free );
+
+          char  name_buffer[100];
+          snprintf( name_buffer, 100, "file%d", file_index++ );
+
+          archive_entry_set_pathname( e.get(), name_buffer );
+          archive_entry_set_size( e.get(), file.size() );
+          archive_entry_set_filetype( e.get(), AE_IFREG );
+          archive_entry_set_perm( e.get(), 0644 );
+
+          check_result( a_open.get(),
+                        archive_write_header( a_open.get(), e.get() ) );
+          archive_write_data( a_open.get(), file.data(), file.size() );
+          check_result( a_open.get(),
+                        archive_write_finish_entry( a_open.get() ) );
+        }
+      }
+
+      return used;
+    }
+
+
+    // Cross `Data1' and `Data2', write up to `MaxOutSize' bytes into `Out',
+    // return the number of bytes written, which should be positive.
+    virtual size_t
+    CrossOver( const uint8_t*  Data1,
+               size_t          Size1,
+               const uint8_t*  Data2,
+               size_t          Size2,
+               uint8_t*        Out,
+               size_t          MaxOutSize )
+    {
+      return fuzzer::UserSuppliedFuzzer::CrossOver( Data1,
+                                                    Size1,
+                                                    Data2,
+                                                    Size2,
+                                                    Out,
+                                                    MaxOutSize );
+    }
+
+  }; // end of FTFuzzer class
+
+
+  int
+  main( int     argc,
+        char*  *argv )
+  {
+    fuzzer::FuzzerRandomLibc  Rand( 0 );
+    FTFuzzer                  F( &Rand );
+
+    fuzzer::FuzzerDriver( argc, argv, F );
+  }
+
+
+// END
diff --git a/src/tools/ftfuzzer/rasterfuzzer.cc b/src/tools/ftfuzzer/rasterfuzzer.cc
new file mode 100644
index 0000000..c69b95e
--- /dev/null
+++ b/src/tools/ftfuzzer/rasterfuzzer.cc
@@ -0,0 +1,129 @@
+// rasterfuzzer.cc
+//
+//   A fuzzing function to test FreeType's rasterizers with libFuzzer.
+//
+// Copyright 2016-2018 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 <stdint.h>
+
+#include <vector>
+
+
+  using namespace std;
+
+
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_IMAGE_H
+#include FT_OUTLINE_H
+
+
+  static FT_Library  library;
+  static int         InitResult;
+
+
+  struct FT_Global {
+    FT_Global() {
+      InitResult = FT_Init_FreeType( &library );
+    }
+    ~FT_Global() {
+      FT_Done_FreeType( library );
+    }
+  };
+
+  FT_Global  global_ft;
+
+
+  extern "C" int
+  LLVMFuzzerTestOneInput( const uint8_t*  data,
+                          size_t          size_ )
+  {
+    unsigned char  pixels[4];
+
+    FT_Bitmap  bitmap_mono = {
+      1,                  // rows
+      1,                  // width
+      4,                  // pitch
+      pixels,             // buffer
+      2,                  // num_grays
+      FT_PIXEL_MODE_MONO, // pixel_mode
+      0,                  // palette_mode
+      NULL                // palette
+    };
+
+    FT_Bitmap  bitmap_gray = {
+      1,                  // rows
+      1,                  // width
+      4,                  // pitch
+      pixels,             // buffer
+      256,                // num_grays
+      FT_PIXEL_MODE_GRAY, // pixel_mode
+      0,                  // palette_mode
+      NULL                // palette
+    };
+
+    const size_t vsize = sizeof ( FT_Vector );
+    const size_t tsize = sizeof ( char );
+
+    // we use the input data for both points and tags
+    short  n_points = short( size_ / ( vsize + tsize ) );
+    if ( n_points <= 2 )
+      return 0;
+
+    FT_Vector*  points = reinterpret_cast<FT_Vector*>(
+                           const_cast<uint8_t*>(
+                             data ) );
+    char*       tags   = reinterpret_cast<char*>(
+                           const_cast<uint8_t*>(
+                             data + size_t( n_points ) * vsize ) );
+
+    // to reduce the number of invalid outlines that are immediately
+    // rejected in `FT_Outline_Render', limit values to 2^18 pixels
+    // (i.e., 2^24 bits)
+    for ( short  i = 0; i < n_points; i++ )
+    {
+      if ( points[i].x == LONG_MIN )
+        points[i].x = 0;
+      else if ( points[i].x < 0 )
+        points[i].x = -( -points[i].x & 0xFFFFFF ) - 1;
+      else
+        points[i].x = ( points[i].x & 0xFFFFFF ) + 1;
+
+      if ( points[i].y == LONG_MIN )
+        points[i].y = 0;
+      else if ( points[i].y < 0 )
+        points[i].y = -( -points[i].y & 0xFFFFFF ) - 1;
+      else
+        points[i].y = ( points[i].y & 0xFFFFFF ) + 1;
+    }
+
+    short  contours[1];
+    contours[0] = n_points - 1;
+
+    FT_Outline  outline =
+    {
+      1,               // n_contours
+      n_points,        // n_points
+      points,          // points
+      tags,            // tags
+      contours,        // contours
+      FT_OUTLINE_NONE  // flags
+    };
+
+    FT_Outline_Get_Bitmap( library, &outline, &bitmap_mono );
+    FT_Outline_Get_Bitmap( library, &outline, &bitmap_gray );
+
+    return 0;
+  }
+
+
+// END
diff --git a/src/tools/ftfuzzer/runinput.cc b/src/tools/ftfuzzer/runinput.cc
new file mode 100644
index 0000000..2b02f57
--- /dev/null
+++ b/src/tools/ftfuzzer/runinput.cc
@@ -0,0 +1,58 @@
+// runinput.cc
+//
+//   A `main' function for fuzzers like `ftfuzzer.cc'.
+//
+// Copyright 2015-2018 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 <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+
+  extern "C" void
+  LLVMFuzzerTestOneInput( const uint8_t*  data,
+                          size_t          size );
+
+
+  unsigned char a[1 << 24];
+
+
+  int
+  main( int     argc,
+        char*  *argv )
+  {
+    assert( argc >= 2 );
+
+    for ( int i = 1; i < argc; i++ )
+    {
+      fprintf( stderr, "%s\n", argv[i] );
+
+      FILE*  f = fopen( argv[i], "r" );
+      assert( f );
+
+      size_t  n = fread( a, 1, sizeof ( a ), f );
+      fclose( f );
+      if ( !n )
+        continue;
+
+      unsigned char*  b = (unsigned char*)malloc( n );
+      memcpy( b, a, n );
+
+      LLVMFuzzerTestOneInput( b, n );
+
+      free( b );
+    }
+  }
+
+
+// END
diff --git a/src/tools/ftrandom/Makefile b/src/tools/ftrandom/Makefile
index 2e61929..24dc49c 100644
--- a/src/tools/ftrandom/Makefile
+++ b/src/tools/ftrandom/Makefile
@@ -5,7 +5,12 @@
 OBJ_DIR ?= $(TOP_DIR)/objs
 
 
-# The setup below is for gcc on a Unix-like platform.
+# The setup below is for gcc on a Unix-like platform,
+# where FreeType has been set up to create a static library
+# (which is the default).
+
+VPATH = $(OBJ_DIR) \
+        $(OBJ_DIR)/.libs
 
 SRC_DIR = $(TOP_DIR)/src/tools/ftrandom
 
@@ -20,16 +25,21 @@
          -Wchar-subscripts \
          -Wsequence-point
 CFLAGS = $(WFLAGS) \
-         -g \
-         -I $(TOP_DIR)/include
+         -g
+INCLUDES = -I $(TOP_DIR)/include
+LDFLAGS =
 LIBS = -lm \
-       -L $(OBJ_DIR) \
-       -lfreetype \
-       -lz
+       -lz \
+       -lpng \
+       -lbz2 \
+       -lharfbuzz
 
 all: $(OBJ_DIR)/ftrandom
 
-$(OBJ_DIR)/ftrandom: $(SRC_DIR)/ftrandom.c $(OBJ_DIR)/libfreetype.a
-	$(CC) -o $(OBJ_DIR)/ftrandom $(CFLAGS) $(SRC_DIR)/ftrandom.c $(LIBS)
+$(OBJ_DIR)/ftrandom.o: $(SRC_DIR)/ftrandom.c
+	$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
+
+$(OBJ_DIR)/ftrandom: $(OBJ_DIR)/ftrandom.o libfreetype.a
+	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
 
 # EOF
diff --git a/src/tools/ftrandom/README b/src/tools/ftrandom/README
index 71bf053..7c61086 100644
--- a/src/tools/ftrandom/README
+++ b/src/tools/ftrandom/README
@@ -1,48 +1,69 @@
 ftrandom
---------
+========
 
 This program expects a set of directories containing good fonts, and a set
 of extensions of fonts to be tested.  It will randomly pick a font, copy it,
-introduce and error and then test it.
+introduce an error and then test it.
 
-The FreeType tests are quite basic:
+The FreeType tests are quite basic; for each erroneous font ftrandom
 
-  For each erroneous font it
-    forks off a new tester;
-    initializes the library;
-    opens each font in the file;
-    loads each glyph;
-      (optionally reviewing the contours of the glyph)
-      (optionally rasterizing)
-    closes the face.
+  . forks off a new tester,
+  . initializes the library,
+  . opens each font in the file,
+  . loads each glyph,
+  . optionally reviews the contours of the glyph,
+  . optionally rasterizes the glyph, and
+  . closes the face.
 
-If the tester exits with a signal, or takes longer than 20 seconds then
-ftrandom saves the erroneous font and continues.  If the tester exits
-normally or with an error, then the superstructure removes the test font and
-continues.
+If a tester takes longer than 20 seconds, ftrandom saves the erroneous font
+and continues.  If the tester exits normally or with an error, then the
+superstructure removes the test font and continues.
 
-Arguments are:
+
+Command line options
+--------------------
 
   --all                    Test every font in the directory(ies) no matter
-                           what its extension (some CID-keyed fonts have no
-                           extension).
-  --check-outlines         Call FT_Outline_Decompose on each glyph.
+                           what its extension.
+  --check-outlines         Call `FT_Outline_Decompose' on each glyph.
   --dir <dir>              Append <dir> to the list of directories to search
-                           for good fonts.
+                           for good fonts.  No recursive search.
   --error-count <cnt>      Introduce <cnt> single-byte errors into the
-                           erroneous fonts.
+                           erroneous fonts (default: 1).
   --error-fraction <frac>  Multiply the file size of the font by <frac> and
                            introduce that many errors into the erroneous
-                           font file.
-  --ext <ext>              Add <ext> to the set of font types tested.  Known
-                           extensions are `ttf', `otf', `ttc', `cid', `pfb',
-                           `pfa', `bdf', `pcf', `pfr', `fon', `otb', and
-                           `cff'.
+                           font file.  <frac> should be in the range [0;1]
+                           (default: 0.0).
+  --ext <ext>              Add <ext> to the set of font types tested.
   --help                   Print out this list of options.
   --nohints                Specify FT_LOAD_NO_HINTING when loading glyphs.
-  --rasterize              Call FT_Render_Glyph as well as loading it.
+  --rasterize              Call `FT_Render_Glyph' as well as loading it.
   --result <dir>           This is the directory in which test files are
                            placed.
   --test <file>            Run a single test on a pre-generated testcase.
-                           Done in the current process so it can be debugged
-                           more easily.
+                           This is done in the current process so it can be
+                           debugged more easily.
+
+The default font extensions tested by ftrandom are
+
+  .ttf .otf .ttc .cid .pfb .pfa .bdf .pcf .pfr .fon .otb .cff
+
+The default font directory is controlled by the macro `GOOD_FONTS_DIR' in
+the source code (and can be thus specified during compilation); its default
+value is
+
+  /usr/local/share/fonts
+
+The default result directory is `results' (in the current directory).
+
+
+Compilation
+-----------
+
+Two possible solutions.
+
+. Run ftrandom within a debugging tool like `valgrind' to catch various
+  memory issues.
+
+. Compile FreeType with sanitizer flags as provided by gcc or clang, for
+  example, then link it with ftrandom.
diff --git a/src/tools/ftrandom/ftrandom.c b/src/tools/ftrandom/ftrandom.c
index 9a5b632..ab5cfc9 100644
--- a/src/tools/ftrandom/ftrandom.c
+++ b/src/tools/ftrandom/ftrandom.c
@@ -29,6 +29,9 @@
 /* This file is now part of the FreeType library */
 
 
+#define _XOPEN_SOURCE 500 /* for `kill', `strdup', `random', and `srandom' */
+
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -38,7 +41,6 @@
 #include <sys/wait.h>
 #include <unistd.h>
 #include <dirent.h>
-#include <math.h>
 #include <signal.h>
 #include <time.h>
 
@@ -56,7 +58,7 @@
   static int    rasterize      = false;
   static char*  results_dir    = "results";
 
-#define GOOD_FONTS_DIR  "/home/wl/freetype-testfonts"
+#define GOOD_FONTS_DIR  "/usr/local/share/fonts"
 
   static char*  default_dir_list[] =
   {
@@ -81,28 +83,31 @@
     NULL
   };
 
-  static int  error_count    = 1;
-  static int  error_fraction = 0;
+  static unsigned int  error_count    = 1;
+  static double        error_fraction = 0.0;
 
   static FT_F26Dot6  font_size = 12 * 64;
 
   static struct fontlist
   {
     char*         name;
-    int           len;
+    long          len;
     unsigned int  isbinary: 1;
     unsigned int  isascii: 1;
     unsigned int  ishex: 1;
 
   } *fontlist;
 
-  static int  fcnt;
+  static unsigned int  fcnt;
 
 
   static int
   FT_MoveTo( const FT_Vector  *to,
              void             *user )
   {
+    FT_UNUSED( to );
+    FT_UNUSED( user );
+
     return 0;
   }
 
@@ -111,6 +116,9 @@
   FT_LineTo( const FT_Vector  *to,
              void             *user )
   {
+    FT_UNUSED( to );
+    FT_UNUSED( user );
+
     return 0;
   }
 
@@ -120,6 +128,10 @@
               const FT_Vector  *to,
               void             *user )
   {
+    FT_UNUSED( _cp );
+    FT_UNUSED( to );
+    FT_UNUSED( user );
+
     return 0;
   }
 
@@ -130,6 +142,11 @@
               const FT_Vector  *to,
               void             *user )
   {
+    FT_UNUSED( cp1 );
+    FT_UNUSED( cp2 );
+    FT_UNUSED( to );
+    FT_UNUSED( user );
+
     return 0;
   }
 
@@ -147,8 +164,8 @@
   static void
   TestFace( FT_Face  face )
   {
-    int  gid;
-    int  load_flags = FT_LOAD_DEFAULT;
+    unsigned int  gid;
+    int           load_flags = FT_LOAD_DEFAULT;
 
 
     if ( check_outlines         &&
@@ -160,7 +177,7 @@
 
     FT_Set_Char_Size( face, 0, font_size, 72, 72 );
 
-    for ( gid = 0; gid < face->num_glyphs; ++gid )
+    for ( gid = 0; gid < face->num_glyphs; gid++ )
     {
       if ( check_outlines         &&
            FT_IS_SCALABLE( face ) )
@@ -202,19 +219,21 @@
       TestFace( face );
     else
     {
-      int  i, num;
+      long  i, num;
 
 
       num = face->num_faces;
       FT_Done_Face( face );
 
-      for ( i = 0; i < num; ++i )
+      for ( i = 0; i < num; i++ )
       {
         if ( !FT_New_Face( context, testfont, i, &face ) )
           TestFace( face );
       }
     }
 
+    FT_Done_FreeType( context );
+
     exit( 0 );
   }
 
@@ -227,16 +246,16 @@
     char*  pt;
 
 
-    if ( extensions == NULL )
+    if ( !extensions )
       return true;
 
     pt = strrchr( filename, '.' );
-    if ( pt == NULL )
+    if ( !pt )
       return false;
     if ( pt < strrchr( filename, '/' ) )
       return false;
 
-    for ( i = 0; extensions[i] != NULL; ++i )
+    for ( i = 0; extensions[i] != NULL; i++ )
       if ( strcasecmp( pt + 1, extensions[i] ) == 0 ||
            strcasecmp( pt,     extensions[i] ) == 0 )
         return true;
@@ -254,7 +273,7 @@
     item->isbinary = item->isascii = item->ishex = false;
 
     foo = fopen( item->name, "rb" );
-    if ( foo != NULL )
+    if ( foo )
     {
       /* Try to guess the file type from the first few characters... */
       int  ch1 = getc( foo );
@@ -281,8 +300,8 @@
       else if ( ch1 == '%' && ch2 == '!' )
       {
         /* Random PostScript */
-        if ( strstr( item->name, ".pfa" ) != NULL ||
-             strstr( item->name, ".PFA" ) != NULL )
+        if ( strstr( item->name, ".pfa" ) ||
+             strstr( item->name, ".PFA" ) )
           item->ishex = true;
         else
           item->isascii = true;
@@ -329,22 +348,23 @@
   FindFonts( char**  fontdirs,
              char**  extensions )
   {
-    int          i, max;
-    char         buffer[1025];
-    struct stat  statb;
+    int           i;
+    unsigned int  max;
+    char          buffer[1025];
+    struct stat   statb;
 
 
     max  = 0;
     fcnt = 0;
 
-    for ( i = 0; fontdirs[i] != NULL; ++i )
+    for ( i = 0; fontdirs[i] != NULL; i++ )
     {
       DIR*            examples;
       struct dirent*  ent;
 
 
       examples = opendir( fontdirs[i] );
-      if ( examples == NULL )
+      if ( !examples )
       {
         fprintf( stderr,
                  "Can't open example font directory `%s'\n",
@@ -358,13 +378,13 @@
                   "%s/%s", fontdirs[i], ent->d_name );
         if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) )
           continue;
-        if ( extensions == NULL || extmatch( buffer, extensions ) )
+        if ( !extensions || extmatch( buffer, extensions ) )
         {
           if ( fcnt >= max )
           {
             max += 100;
             fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) );
-            if ( fontlist == NULL )
+            if ( !fontlist )
             {
               fprintf( stderr, "Can't allocate memory\n" );
               exit( 1 );
@@ -375,7 +395,7 @@
           fontlist[fcnt].len  = statb.st_size;
 
           figurefiletype( &fontlist[fcnt] );
-          ++fcnt;
+          fcnt++;
         }
       }
 
@@ -392,13 +412,13 @@
   }
 
 
-  static int
+  static unsigned int
   getErrorCnt( struct fontlist*  item )
   {
-    if ( error_count == 0 && error_fraction == 0 )
+    if ( error_count == 0 && error_fraction == 0.0 )
       return 0;
 
-    return error_count + ceil( error_fraction * item->len );
+    return error_count + (unsigned int)( error_fraction * item->len );
   }
 
 
@@ -417,21 +437,21 @@
   copyfont( struct fontlist*  item,
             char*             newfont )
   {
-    static char  buffer[8096];
-    FILE         *good, *new;
-    int          len;
-    int          i, err_cnt;
+    static char   buffer[8096];
+    FILE          *good, *newf;
+    size_t        len;
+    unsigned int  i, err_cnt;
 
 
     good = fopen( item->name, "r" );
-    if ( good == NULL )
+    if ( !good )
     {
       fprintf( stderr, "Can't open `%s'\n", item->name );
       return false;
     }
 
-    new = fopen( newfont, "w+" );
-    if ( new == NULL )
+    newf = fopen( newfont, "w+" );
+    if ( !newf )
     {
       fprintf( stderr, "Can't create temporary output file `%s'\n",
                newfont );
@@ -439,19 +459,19 @@
     }
 
     while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 )
-      fwrite( buffer, 1, len, new );
+      fwrite( buffer, 1, len, newf );
 
     fclose( good );
 
     err_cnt = getErrorCnt( item );
-    for ( i = 0; i < err_cnt; ++i )
+    for ( i = 0; i < err_cnt; i++ )
     {
-      fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET );
+      fseek( newf, getRandom( 0, (int)( item->len - 1 ) ), SEEK_SET );
 
       if ( item->isbinary )
-        putc( getRandom( 0, 0xFF ), new );
+        putc( getRandom( 0, 0xFF ), newf );
       else if ( item->isascii )
-        putc( getRandom( 0x20, 0x7E ), new );
+        putc( getRandom( 0x20, 0x7E ), newf );
       else
       {
         int  hex = getRandom( 0, 15 );
@@ -462,18 +482,18 @@
         else
           hex += 'A' - 10;
 
-        putc( hex, new );
+        putc( hex, newf );
       }
     }
 
-    if ( ferror( new ) )
+    if ( ferror( newf ) )
     {
-      fclose( new );
+      fclose( newf );
       unlink( newfont );
       return false;
     }
 
-    fclose( new );
+    fclose( newf );
 
     return true;
   }
@@ -484,6 +504,8 @@
   static void
   abort_test( int  sig )
   {
+    FT_UNUSED( sig );
+
     /* If a time-out happens, then kill the child */
     kill( child_pid, SIGFPE );
     write( 2, "Timeout... ", 11 );
@@ -493,7 +515,7 @@
   static void
   do_test( void )
   {
-    int         i        = getRandom( 0, fcnt - 1 );
+    int         i        = getRandom( 0, (int)( fcnt - 1 ) );
     static int  test_num = 0;
     char        buffer[1024];
 
@@ -534,22 +556,42 @@
   usage( FILE*  out,
          char*  name )
   {
+    char**  d = default_dir_list;
+    char**  e = default_ext_list;
+
+
     fprintf( out, "%s [options] -- Generate random erroneous fonts\n"
                   "  and attempt to parse them with FreeType.\n\n", name );
 
     fprintf( out, "  --all                    All non-directory files are assumed to be fonts.\n" );
     fprintf( out, "  --check-outlines         Make sure we can parse the outlines of each glyph.\n" );
-    fprintf( out, "  --dir <path>             Append <path> to list of font search directories.\n" );
-    fprintf( out, "  --error-count <cnt>      Introduce <cnt> single byte errors into each font.\n" );
+    fprintf( out, "  --dir <path>             Append <path> to list of font search directories\n"
+                  "                           (no recursive search).\n" );
+    fprintf( out, "  --error-count <cnt>      Introduce <cnt> single byte errors into each font\n"
+                  "                           (default: 1)\n" );
     fprintf( out, "  --error-fraction <frac>  Introduce <frac>*filesize single byte errors\n"
-                  "                           into each font.\n" );
+                  "                           into each font (default: 0.0).\n" );
     fprintf( out, "  --ext <ext>              Add <ext> to list of extensions indicating fonts.\n" );
     fprintf( out, "  --help                   Print this.\n" );
     fprintf( out, "  --nohints                Turn off hinting.\n" );
     fprintf( out, "  --rasterize              Attempt to rasterize each glyph.\n" );
-    fprintf( out, "  --results <dir>          Directory in which to place the test fonts.\n" );
+    fprintf( out, "  --results <path>         Place the created test fonts into <path>\n"
+                  "                           (default: `results')\n" );
     fprintf( out, "  --size <float>           Use the given font size for the tests.\n" );
     fprintf( out, "  --test <file>            Run a single test on an already existing file.\n" );
+    fprintf( out, "\n" );
+
+    fprintf( out, "Default font extensions:\n" );
+    fprintf( out, " " );
+    while ( *e )
+      fprintf( out, " .%s", *e++ );
+    fprintf( out, "\n" );
+
+    fprintf( out, "Default font directories:\n" );
+    fprintf( out, " " );
+    while ( *d )
+      fprintf( out, " %s", *d++ );
+    fprintf( out, "\n" );
   }
 
 
@@ -564,17 +606,17 @@
     char*   testfile = NULL;
 
 
-    dirs = calloc( argc + 1, sizeof ( char ** ) );
-    exts = calloc( argc + 1, sizeof ( char ** ) );
+    dirs = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) );
+    exts = calloc( (size_t)( argc + 1 ), sizeof ( char ** ) );
 
-    for ( i = 1; i < argc; ++i )
+    for ( i = 1; i < argc; i++ )
     {
       char*  pt = argv[i];
       char*  end;
 
 
       if ( pt[0] == '-' && pt[1] == '-' )
-        ++pt;
+        pt++;
 
       if ( strcmp( pt, "-all" ) == 0 )
         allexts = true;
@@ -585,9 +627,9 @@
       else if ( strcmp( pt, "-error-count" ) == 0 )
       {
         if ( !rset )
-          error_fraction = 0;
+          error_fraction = 0.0;
         rset = true;
-        error_count = strtol( argv[++i], &end, 10 );
+        error_count = (unsigned int)strtoul( argv[++i], &end, 10 );
         if ( *end != '\0' )
         {
           fprintf( stderr, "Bad value for error-count: %s\n", argv[i] );
@@ -605,6 +647,11 @@
           fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] );
           exit( 1 );
         }
+        if ( error_fraction < 0.0 || error_fraction > 1.0 )
+        {
+          fprintf( stderr, "error-fraction must be in the range [0;1]\n" );
+          exit( 1 );
+        }
       }
       else if ( strcmp( pt, "-ext" ) == 0 )
         exts[ecnt++] = argv[++i];
@@ -654,11 +701,11 @@
       dirs = default_dir_list;
     }
 
-    if ( testfile != NULL )
+    if ( testfile )
       ExecuteTest( testfile );         /* This should never return */
 
     time( &now );
-    srandom( now );
+    srandom( (unsigned int)now );
 
     FindFonts( dirs, exts );
     mkdir( results_dir, 0755 );
diff --git a/src/tools/glnames.py b/src/tools/glnames.py
index 0ad554c..b048d29 100644
--- a/src/tools/glnames.py
+++ b/src/tools/glnames.py
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -151,7 +151,7 @@
 # The list of standard `SID' glyph names.  For the official list,
 # see Annex A of document at
 #
-#   http://partners.adobe.com/public/developer/en/font/5176.CFF.pdf  .
+#   https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf  .
 #
 sid_standard_names = \
 [
@@ -415,7 +415,7 @@
 # This data has been taken literally from the files `glyphlist.txt'
 # and `zapfdingbats.txt' version 2.0, Sept 2002.  It is available from
 #
-#   http://sourceforge.net/adobe/aglfn/
+#   https://github.com/adobe-type-tools/agl-aglfn
 #
 adobe_glyph_list = """\
 A;0041
@@ -4920,8 +4920,17 @@
 
   def dump( self, file ):
     write = file.write
-    write( "  static const char  " + self.master_table +
-           "[" + repr( self.total ) + "] =\n" )
+    write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
+    write( "#ifdef  __cplusplus\n" )
+    write( '  extern "C"\n' )
+    write( "#else\n" )
+    write( "  extern\n" )
+    write( "#endif\n" )
+    write( "#endif\n" )
+    write( "  const char  " + self.master_table +
+           "[" + repr( self.total ) + "]\n" )
+    write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
+    write( "  =\n" )
     write( "  {\n" )
 
     line = ""
@@ -4930,7 +4939,10 @@
       line += string.join( ( re.findall( ".", name ) ), "','" )
       line += "', 0,\n"
 
-    write( line + "  };\n\n\n" )
+    write( line )
+    write( "  }\n" )
+    write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
+    write( "  ;\n\n\n" )
 
   def dump_sublist( self, file, table_name, macro_name, sublist ):
     write = file.write
@@ -4938,8 +4950,17 @@
 
     write( "  /* Values are offsets into the `" +
            self.master_table + "' table */\n\n" )
-    write( "  static const short  " + table_name +
-           "[" + macro_name + "] =\n" )
+    write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
+    write( "#ifdef  __cplusplus\n" )
+    write( '  extern "C"\n' )
+    write( "#else\n" )
+    write( "  extern\n" )
+    write( "#endif\n" )
+    write( "#endif\n" )
+    write( "  const short  " + table_name +
+           "[" + macro_name + "]\n" )
+    write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
+    write( "  =\n" )
     write( "  {\n" )
 
     line  = "    "
@@ -4955,7 +4976,11 @@
         col   = 0
         comma = ",\n    "
 
-    write( line + "\n  };\n\n\n" )
+    write( line )
+    write( "\n" )
+    write( "  }\n" )
+    write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
+    write( "  ;\n\n\n" )
 
 
 # We now store the Adobe Glyph List in compressed form.  The list is put
@@ -5188,8 +5213,17 @@
 
   write = file.write
   write( "  /* the following are indices into the SID name table */\n" )
-  write( "  static const unsigned short  " + encoding_name +
-         "[" + repr( len( encoding_list ) ) + "] =\n" )
+  write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
+  write( "#ifdef  __cplusplus\n" )
+  write( '  extern "C"\n' )
+  write( "#else\n" )
+  write( "  extern\n" )
+  write( "#endif\n" )
+  write( "#endif\n" )
+  write( "  const unsigned short  " + encoding_name +
+         "[" + repr( len( encoding_list ) ) + "]\n" )
+  write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
+  write( "  =\n" )
   write( "  {\n" )
 
   line  = "    "
@@ -5204,14 +5238,27 @@
       col = 0
       comma = ",\n    "
 
-  write( line + "\n  };\n\n\n" )
+  write( line )
+  write( "\n" )
+  write( "  }\n" )
+  write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
+  write( "  ;\n\n\n" )
 
 
 def dump_array( the_array, write, array_name ):
   """dumps a given encoding"""
 
-  write( "  static const unsigned char  " + array_name +
-         "[" + repr( len( the_array ) ) + "L] =\n" )
+  write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
+  write( "#ifdef  __cplusplus\n" )
+  write( '  extern "C"\n' )
+  write( "#else\n" )
+  write( "  extern\n" )
+  write( "#endif\n" )
+  write( "#endif\n" )
+  write( "  const unsigned char  " + array_name +
+         "[" + repr( len( the_array ) ) + "L]\n" )
+  write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
+  write( "  =\n" )
   write( "  {\n" )
 
   line  = ""
@@ -5232,7 +5279,11 @@
       write( line )
       line = ""
 
-  write( line + "\n  };\n\n\n" )
+  write( line )
+  write( "\n" )
+  write( "  }\n" )
+  write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
+  write( "  ;\n\n\n" )
 
 
 def main():
@@ -5242,7 +5293,7 @@
     print __doc__ % sys.argv[0]
     sys.exit( 1 )
 
-  file  = open( sys.argv[1], "w\n" )
+  file  = open( sys.argv[1], "wb" )
   write = file.write
 
   count_sid = len( sid_standard_names )
@@ -5267,7 +5318,7 @@
   write( "/*                                                                         */\n" )
   write( "/*    PostScript glyph names.                                              */\n" )
   write( "/*                                                                         */\n" )
-  write( "/*  Copyright 2005-2015 by                                                 */\n" )
+  write( "/*  Copyright 2005-2018 by                                                 */\n" )
   write( "/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n" )
   write( "/*                                                                         */\n" )
   write( "/*  This file is part of the FreeType project, and may only be used,       */\n" )
@@ -5327,6 +5378,7 @@
   # write the lookup routine now
   #
   write( """\
+#ifdef  DEFINE_PS_TABLES
   /*
    *  This function searches the compressed table efficiently.
    */
@@ -5421,6 +5473,7 @@
   NotFound:
     return 0;
   }
+#endif /* DEFINE_PS_TABLES */
 
 #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
 
diff --git a/src/tools/no-copyright b/src/tools/no-copyright
index 5011e3f..d639aa4 100644
--- a/src/tools/no-copyright
+++ b/src/tools/no-copyright
@@ -14,6 +14,9 @@
 docs/FTL.TXT
 docs/GPLv2.TXT
 #
+include/freetype/internal/fthash.h
+#
+src/base/fthash.c
 src/base/md5.c
 src/base/md5.h
 #
@@ -56,6 +59,7 @@
 src/gzip/zutil.c
 src/gzip/zutil.h
 #
+src/tools/apinames.c
 src/tools/ftrandom/ftrandom.c
 #
 # EOF
diff --git a/src/tools/update-copyright-year b/src/tools/update-copyright-year
index 1077541..934f11c 100755
--- a/src/tools/update-copyright-year
+++ b/src/tools/update-copyright-year
@@ -2,7 +2,7 @@
   & eval 'exec perl -wS -i "$0" $argv:q'
     if 0;
 
-# Copyright 2015 by
+# Copyright 2015-2018 by
 # Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/truetype/Jamfile b/src/truetype/Jamfile
index 55a60af..e321fba 100644
--- a/src/truetype/Jamfile
+++ b/src/truetype/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/truetype Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,15 @@
 
   if $(FT2_MULTI)
   {
-    _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;
+    _sources = ttdriver
+               ttgload
+               ttgxvar
+               ttinterp
+               ttobjs
+               ttpic
+               ttpload
+               ttsubpix
+               ;
   }
   else
   {
diff --git a/src/truetype/module.mk b/src/truetype/module.mk
index c6dc6fa..16bc9c8 100644
--- a/src/truetype/module.mk
+++ b/src/truetype/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/truetype/rules.mk b/src/truetype/rules.mk
index 1db16ba..e16113f 100644
--- a/src/truetype/rules.mk
+++ b/src/truetype/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/truetype/truetype.c b/src/truetype/truetype.c
index f929437..4843709 100644
--- a/src/truetype/truetype.c
+++ b/src/truetype/truetype.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType TrueType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,22 +17,16 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "ttpic.c"
+
 #include "ttdriver.c"   /* driver interface    */
-#include "ttpload.c"    /* tables loader       */
 #include "ttgload.c"    /* glyph loader        */
-#include "ttobjs.c"     /* object manager      */
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-#include "ttinterp.c"
-#include "ttsubpix.c"
-#endif
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include "ttgxvar.c"    /* gx distortable font */
-#endif
+#include "ttinterp.c"
+#include "ttobjs.c"     /* object manager      */
+#include "ttpic.c"
+#include "ttpload.c"    /* tables loader       */
+#include "ttsubpix.c"
 
 
 /* END */
diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c
index 08b30c9..820cafb 100644
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType font driver implementation (body).                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,12 +25,13 @@
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include FT_MULTIPLE_MASTERS_H
 #include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 #endif
 
 #include FT_SERVICE_TRUETYPE_ENGINE_H
 #include FT_SERVICE_TRUETYPE_GLYF_H
 #include FT_SERVICE_PROPERTIES_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttdriver.h"
 #include "ttgload.h"
@@ -61,23 +62,50 @@
   static FT_Error
   tt_property_set( FT_Module    module,         /* TT_Driver */
                    const char*  property_name,
-                   const void*  value )
+                   const void*  value,
+                   FT_Bool      value_is_string )
   {
     FT_Error   error  = FT_Err_Ok;
     TT_Driver  driver = (TT_Driver)module;
 
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
 
     if ( !ft_strcmp( property_name, "interpreter-version" ) )
     {
-      FT_UInt*  interpreter_version = (FT_UInt*)value;
+      FT_UInt  interpreter_version;
 
 
-#ifndef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      if ( *interpreter_version != TT_INTERPRETER_VERSION_35 )
-        error = FT_ERR( Unimplemented_Feature );
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 );
+      }
       else
 #endif
-        driver->interpreter_version = *interpreter_version;
+      {
+        FT_UInt*  iv = (FT_UInt*)value;
+
+
+        interpreter_version = *iv;
+      }
+
+      if ( interpreter_version == TT_INTERPRETER_VERSION_35
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+           || interpreter_version == TT_INTERPRETER_VERSION_38
+#endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+           || interpreter_version == TT_INTERPRETER_VERSION_40
+#endif
+         )
+        driver->interpreter_version = interpreter_version;
+      else
+        error = FT_ERR( Unimplemented_Feature );
 
       return error;
     }
@@ -117,8 +145,10 @@
 
   FT_DEFINE_SERVICE_PROPERTIESREC(
     tt_service_properties,
-    (FT_Properties_SetFunc)tt_property_set,
-    (FT_Properties_GetFunc)tt_property_get )
+
+    (FT_Properties_SetFunc)tt_property_set,     /* set_property */
+    (FT_Properties_GetFunc)tt_property_get      /* get_property */
+  )
 
 
   /*************************************************************************/
@@ -194,13 +224,20 @@
                    FT_Fixed  *advances )
   {
     FT_UInt  nn;
-    TT_Face  face  = (TT_Face) ttface;
+    TT_Face  face = (TT_Face)ttface;
 
 
     /* XXX: TODO: check for sbits */
 
     if ( flags & FT_LOAD_VERTICAL_LAYOUT )
     {
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* no fast retrieval for blended MM fonts without VVAR table */
+      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
+           !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )        )
+        return FT_THROW( Unimplemented_Feature );
+#endif
+
       for ( nn = 0; nn < count; nn++ )
       {
         FT_Short   tsb;
@@ -214,6 +251,13 @@
     }
     else
     {
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* no fast retrieval for blended MM fonts without HVAR table */
+      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
+           !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )        )
+        return FT_THROW( Unimplemented_Feature );
+#endif
+
       for ( nn = 0; nn < count; nn++ )
       {
         FT_Short   lsb;
@@ -228,6 +272,7 @@
     return FT_Err_Ok;
   }
 
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
@@ -259,15 +304,17 @@
       /* use the scaled metrics, even when tt_size_reset fails */
       FT_Select_Metrics( size->face, strike_index );
 
-      tt_size_reset( ttsize ); /* ignore return value */
+      tt_size_reset( ttsize, 0 ); /* ignore return value */
     }
     else
     {
-      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;
-      FT_Size_Metrics*  metrics = &size->metrics;
+      SFNT_Service      sfnt         = (SFNT_Service)ttface->sfnt;
+      FT_Size_Metrics*  size_metrics = &size->metrics;
 
 
-      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
+      error = sfnt->load_strike_metrics( ttface,
+                                         strike_index,
+                                         size_metrics );
       if ( error )
         ttsize->strike_index = 0xFFFFFFFFUL;
     }
@@ -291,7 +338,7 @@
     if ( FT_HAS_FIXED_SIZES( size->face ) )
     {
       TT_Face       ttface = (TT_Face)size->face;
-      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;
+      SFNT_Service  sfnt   = (SFNT_Service)ttface->sfnt;
       FT_ULong      strike_index;
 
 
@@ -309,8 +356,28 @@
 
     if ( FT_IS_SCALABLE( size->face ) )
     {
-      error = tt_size_reset( ttsize );
-      ttsize->root.metrics = ttsize->metrics;
+      error = tt_size_reset( ttsize, 0 );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+      /* for the `MPS' bytecode instruction we need the point size */
+      if ( !error )
+      {
+        FT_UInt  resolution =
+                   ttsize->metrics->x_ppem > ttsize->metrics->y_ppem
+                     ? req->horiResolution
+                     : req->vertResolution;
+
+
+        /* if we don't have a resolution value, assume 72dpi */
+        if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES ||
+             !resolution                              )
+          resolution = 72;
+
+        ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem,
+                                        64 * 72,
+                                        resolution );
+      }
+#endif
     }
 
     return error;
@@ -392,6 +459,11 @@
         load_flags |= FT_LOAD_NO_HINTING;
     }
 
+    /* use hinted metrics only if we load a glyph with hinting */
+    size->metrics = ( load_flags & FT_LOAD_NO_HINTING )
+                      ? &ttsize->metrics
+                      : &size->hinted_metrics;
+
     /* now load the glyph outline if necessary */
     error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
 
@@ -415,24 +487,46 @@
   /*************************************************************************/
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
   FT_DEFINE_SERVICE_MULTIMASTERSREC(
     tt_service_gx_multi_masters,
-    (FT_Get_MM_Func)        NULL,
-    (FT_Set_MM_Design_Func) NULL,
-    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
-    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
-    (FT_Set_Var_Design_Func)TT_Set_Var_Design )
-#endif
+
+    (FT_Get_MM_Func)        NULL,                   /* get_mm         */
+    (FT_Set_MM_Design_Func) NULL,                   /* set_mm_design  */
+    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,        /* set_mm_blend   */
+    (FT_Get_MM_Blend_Func)  TT_Get_MM_Blend,        /* get_mm_blend   */
+    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,          /* get_mm_var     */
+    (FT_Set_Var_Design_Func)TT_Set_Var_Design,      /* set_var_design */
+    (FT_Get_Var_Design_Func)TT_Get_Var_Design,      /* get_var_design */
+    (FT_Set_Instance_Func)  TT_Set_Named_Instance,  /* set_instance   */
+
+    (FT_Get_Var_Blend_Func) tt_get_var_blend,       /* get_var_blend  */
+    (FT_Done_Blend_Func)    tt_done_blend           /* done_blend     */
+  )
+
+  FT_DEFINE_SERVICE_METRICSVARIATIONSREC(
+    tt_service_metrics_variations,
+
+    (FT_HAdvance_Adjust_Func)tt_hadvance_adjust,     /* hadvance_adjust */
+    (FT_LSB_Adjust_Func)     NULL,                   /* lsb_adjust      */
+    (FT_RSB_Adjust_Func)     NULL,                   /* rsb_adjust      */
+
+    (FT_VAdvance_Adjust_Func)tt_vadvance_adjust,     /* vadvance_adjust */
+    (FT_TSB_Adjust_Func)     NULL,                   /* tsb_adjust      */
+    (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
+    (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
+
+    (FT_Metrics_Adjust_Func) tt_apply_mvar           /* metrics_adjust  */
+  )
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
 
   static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
   {
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
-#else
     FT_TRUETYPE_ENGINE_TYPE_PATENTED
-#endif
 
 #else /* !TT_USE_BYTECODE_INTERPRETER */
 
@@ -441,21 +535,28 @@
 #endif /* TT_USE_BYTECODE_INTERPRETER */
   };
 
+
   FT_DEFINE_SERVICE_TTGLYFREC(
     tt_service_truetype_glyf,
-    (TT_Glyf_GetLocationFunc)tt_face_get_location )
+
+    (TT_Glyf_GetLocationFunc)tt_face_get_location      /* get_location */
+  )
+
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC5(
+  FT_DEFINE_SERVICEDESCREC6(
     tt_services,
-    FT_SERVICE_ID_FONT_FORMAT,     FT_FONT_FORMAT_TRUETYPE,
-    FT_SERVICE_ID_MULTI_MASTERS,   &TT_SERVICE_GX_MULTI_MASTERS_GET,
-    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
-    FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
-    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
+
+    FT_SERVICE_ID_FONT_FORMAT,        FT_FONT_FORMAT_TRUETYPE,
+    FT_SERVICE_ID_MULTI_MASTERS,      &TT_SERVICE_GX_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_METRICS_VARIATIONS, &TT_SERVICE_METRICS_VARIATIONS_GET,
+    FT_SERVICE_ID_TRUETYPE_ENGINE,    &tt_service_truetype_engine,
+    FT_SERVICE_ID_TT_GLYF,            &TT_SERVICE_TRUETYPE_GLYF_GET,
+    FT_SERVICE_ID_PROPERTIES,         &TT_SERVICE_PROPERTIES_GET )
 #else
   FT_DEFINE_SERVICEDESCREC4(
     tt_services,
+
     FT_SERVICE_ID_FONT_FORMAT,     FT_FONT_FORMAT_TRUETYPE,
     FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
     FT_SERVICE_ID_TT_GLYF,         &TT_SERVICE_TRUETYPE_GLYF_GET,
@@ -483,7 +584,7 @@
 #endif
 
     result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
-    if ( result != NULL )
+    if ( result )
       return result;
 
 #ifndef FT_CONFIG_OPTION_PIC
@@ -534,31 +635,31 @@
       0x10000L,        /* driver version == 1.0                 */
       0x20000L,        /* driver requires FreeType 2.0 or above */
 
-      (void*)0,        /* driver specific interface */
+      NULL,    /* module-specific interface */
 
-      tt_driver_init,
-      tt_driver_done,
-      tt_get_interface,
+      tt_driver_init,           /* FT_Module_Constructor  module_init   */
+      tt_driver_done,           /* FT_Module_Destructor   module_done   */
+      tt_get_interface,         /* FT_Module_Requester    get_interface */
 
     sizeof ( TT_FaceRec ),
     sizeof ( TT_SizeRec ),
     sizeof ( FT_GlyphSlotRec ),
 
-    tt_face_init,
-    tt_face_done,
-    tt_size_init,
-    tt_size_done,
-    tt_slot_init,
-    0,                       /* FT_Slot_DoneFunc */
+    tt_face_init,               /* FT_Face_InitFunc  init_face */
+    tt_face_done,               /* FT_Face_DoneFunc  done_face */
+    tt_size_init,               /* FT_Size_InitFunc  init_size */
+    tt_size_done,               /* FT_Size_DoneFunc  done_size */
+    tt_slot_init,               /* FT_Slot_InitFunc  init_slot */
+    NULL,                       /* FT_Slot_DoneFunc  done_slot */
 
-    tt_glyph_load,
+    tt_glyph_load,              /* FT_Slot_LoadFunc  load_glyph */
 
-    tt_get_kerning,
-    0,                       /* FT_Face_AttachFunc */
-    tt_get_advances,
+    tt_get_kerning,             /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    tt_get_advances,            /* FT_Face_GetAdvancesFunc  get_advances */
 
-    tt_size_request,
-    TT_SIZE_SELECT
+    tt_size_request,            /* FT_Size_RequestFunc  request_size */
+    TT_SIZE_SELECT              /* FT_Size_SelectFunc   select_size  */
   )
 
 
diff --git a/src/truetype/ttdriver.h b/src/truetype/ttdriver.h
index 6cacd60..707aa68 100644
--- a/src/truetype/ttdriver.h
+++ b/src/truetype/ttdriver.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level TrueType driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTDRIVER_H__
-#define __TTDRIVER_H__
+#ifndef TTDRIVER_H_
+#define TTDRIVER_H_
 
 
 #include <ft2build.h>
@@ -32,7 +32,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTDRIVER_H__ */
+#endif /* TTDRIVER_H_ */
 
 
 /* END */
diff --git a/src/truetype/tterrors.h b/src/truetype/tterrors.h
index ba32cf7..88bca3a 100644
--- a/src/truetype/tterrors.h
+++ b/src/truetype/tterrors.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType error codes (specification only).                           */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __TTERRORS_H__
-#define __TTERRORS_H__
+#ifndef TTERRORS_H_
+#define TTERRORS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  TT_Err_
@@ -36,6 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __TTERRORS_H__ */
+#endif /* TTERRORS_H_ */
+
 
 /* END */
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
index e1acd69..39d9c3f 100644
--- a/src/truetype/ttgload.c
+++ b/src/truetype/ttgload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Glyph Loader (body).                                        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,12 +18,14 @@
 
 #include <ft2build.h>
 #include FT_INTERNAL_DEBUG_H
+#include FT_CONFIG_CONFIG_H
 #include FT_INTERNAL_CALC_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_OUTLINE_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
+#include FT_LIST_H
 
 #include "ttgload.h"
 #include "ttpload.h"
@@ -85,7 +87,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* Return the vertical metrics in font units for a given glyph.          */
-  /* See macro `TT_LOADER_SET_PP' below for explanations.                  */
+  /* See function `tt_loader_set_pp' below for explanations.               */
   /*                                                                       */
   FT_LOCAL_DEF( void )
   TT_Get_VMetrics( TT_Face     face,
@@ -120,8 +122,8 @@
   tt_get_metrics( TT_Loader  loader,
                   FT_UInt    glyph_index )
   {
-    TT_Face    face   = (TT_Face)loader->face;
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Face    face   = loader->face;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
 #endif
 
@@ -152,7 +154,7 @@
     loader->top_bearing  = top_bearing;
     loader->vadvance     = advance_height;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
          loader->exec                                             )
     {
@@ -161,10 +163,10 @@
       /* This may not be the right place for this, but it works...  */
       /* Note that we have to unconditionally load the tweaks since */
       /* it is possible that glyphs individually switch ClearType's */
-      /* backwards compatibility mode on and off.                   */
+      /* backward compatibility mode on and off.                    */
       sph_set_tweaks( loader, glyph_index );
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     if ( !loader->linear_def )
     {
@@ -182,7 +184,7 @@
   tt_get_metrics_incr_overrides( TT_Loader  loader,
                                  FT_UInt    glyph_index )
   {
-    TT_Face  face = (TT_Face)loader->face;
+    TT_Face  face = loader->face;
 
     FT_Short   left_bearing = 0, top_bearing = 0;
     FT_UShort  advance_width = 0, advance_height = 0;
@@ -193,39 +195,39 @@
     if ( face->root.internal->incremental_interface                           &&
          face->root.internal->incremental_interface->funcs->get_glyph_metrics )
     {
-      FT_Incremental_MetricsRec  metrics;
+      FT_Incremental_MetricsRec  incr_metrics;
       FT_Error                   error;
 
 
-      metrics.bearing_x = loader->left_bearing;
-      metrics.bearing_y = 0;
-      metrics.advance   = loader->advance;
-      metrics.advance_v = 0;
+      incr_metrics.bearing_x = loader->left_bearing;
+      incr_metrics.bearing_y = 0;
+      incr_metrics.advance   = loader->advance;
+      incr_metrics.advance_v = 0;
 
       error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
                 face->root.internal->incremental_interface->object,
-                glyph_index, FALSE, &metrics );
+                glyph_index, FALSE, &incr_metrics );
       if ( error )
         goto Exit;
 
-      left_bearing  = (FT_Short)metrics.bearing_x;
-      advance_width = (FT_UShort)metrics.advance;
+      left_bearing  = (FT_Short)incr_metrics.bearing_x;
+      advance_width = (FT_UShort)incr_metrics.advance;
 
 #if 0
 
       /* GWW: Do I do the same for vertical metrics? */
-      metrics.bearing_x = 0;
-      metrics.bearing_y = loader->top_bearing;
-      metrics.advance   = loader->vadvance;
+      incr_metrics.bearing_x = 0;
+      incr_metrics.bearing_y = loader->top_bearing;
+      incr_metrics.advance   = loader->vadvance;
 
       error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
                 face->root.internal->incremental_interface->object,
-                glyph_index, TRUE, &metrics );
+                glyph_index, TRUE, &incr_metrics );
       if ( error )
         goto Exit;
 
-      top_bearing    = (FT_Short)metrics.bearing_y;
-      advance_height = (FT_UShort)metrics.advance;
+      top_bearing    = (FT_Short)incr_metrics.bearing_y;
+      advance_height = (FT_UShort)incr_metrics.advance;
 
 #endif /* 0 */
 
@@ -250,29 +252,6 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Translates an array of coordinates.                                   */
-  /*                                                                       */
-  static void
-  translate_array( FT_UInt     n,
-                   FT_Vector*  coords,
-                   FT_Pos      delta_x,
-                   FT_Pos      delta_y )
-  {
-    FT_UInt  k;
-
-
-    if ( delta_x )
-      for ( k = 0; k < n; k++ )
-        coords[k].x += delta_x;
-
-    if ( delta_y )
-      for ( k = 0; k < n; k++ )
-        coords[k].y += delta_y;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
   /* The following functions are used by default with TrueType fonts.      */
   /* However, they can be replaced by alternatives if we need to support   */
   /* TrueType-compressed formats (like MicroType) in the future.           */
@@ -354,7 +333,6 @@
     FT_Outline*     outline;
     FT_UShort       n_ins;
     FT_Int          n_points;
-    FT_ULong        tmp;
 
     FT_Byte         *flag, *flag_limit;
     FT_Byte         c, count;
@@ -420,18 +398,21 @@
 
     FT_TRACE5(( "  Instructions size: %u\n", n_ins ));
 
-    /* check it */
-    if ( ( limit - p ) < n_ins )
-    {
-      FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
-      error = FT_THROW( Too_Many_Hints );
-      goto Fail;
-    }
-
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
     if ( IS_HINTED( load->load_flags ) )
     {
+      FT_ULong  tmp;
+
+
+      /* check instructions size */
+      if ( ( limit - p ) < n_ins )
+      {
+        FT_TRACE1(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
+        error = FT_THROW( Too_Many_Hints );
+        goto Fail;
+      }
+
       /* we don't trust `maxSizeOfInstructions' in the `maxp' table */
       /* and thus update the bytecode array size by ourselves       */
 
@@ -449,7 +430,8 @@
       load->glyph->control_len  = n_ins;
       load->glyph->control_data = load->exec->glyphIns;
 
-      FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
+      if ( n_ins )
+        FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
     }
 
 #endif /* TT_USE_BYTECODE_INTERPRETER */
@@ -462,7 +444,7 @@
     flag       = (FT_Byte*)outline->tags;
     flag_limit = flag + n_points;
 
-    FT_ASSERT( flag != NULL );
+    FT_ASSERT( flag );
 
     while ( flag < flag_limit )
     {
@@ -656,20 +638,20 @@
 
       if ( subglyph->flags & WE_HAVE_A_SCALE )
       {
-        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
         yy = xx;
       }
       else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
       {
-        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
-        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
       }
       else if ( subglyph->flags & WE_HAVE_A_2X2 )
       {
-        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
-        yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
-        xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
-        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
+        yx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
+        xy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
       }
 
       subglyph->transform.xx = xx;
@@ -682,6 +664,52 @@
     } while ( subglyph->flags & MORE_COMPONENTS );
 
     gloader->current.num_subglyphs = num_subglyphs;
+    FT_TRACE5(( "  %d component%s\n",
+                num_subglyphs,
+                num_subglyphs > 1 ? "s" : "" ));
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    {
+      FT_UInt  i;
+
+
+      subglyph = gloader->current.subglyphs;
+
+      for ( i = 0; i < num_subglyphs; i++ )
+      {
+        if ( num_subglyphs > 1 )
+          FT_TRACE7(( "    subglyph %d:\n", i ));
+
+        FT_TRACE7(( "      glyph index: %d\n", subglyph->index ));
+
+        if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+          FT_TRACE7(( "      offset: x=%d, y=%d\n",
+                      subglyph->arg1,
+                      subglyph->arg2 ));
+        else
+          FT_TRACE7(( "      matching points: base=%d, component=%d\n",
+                      subglyph->arg1,
+                      subglyph->arg2 ));
+
+        if ( subglyph->flags & WE_HAVE_A_SCALE )
+          FT_TRACE7(( "      scaling: %f\n",
+                      subglyph->transform.xx / 65536.0 ));
+        else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+          FT_TRACE7(( "      scaling: x=%f, y=%f\n",
+                      subglyph->transform.xx / 65536.0,
+                      subglyph->transform.yy / 65536.0 ));
+        else if ( subglyph->flags & WE_HAVE_A_2X2 )
+          FT_TRACE7(( "      scaling: xx=%f, yx=%f\n"
+                      "               xy=%f, yy=%f\n",
+                      subglyph->transform.xx / 65536.0,
+                      subglyph->transform.yx / 65536.0,
+                      subglyph->transform.xy / 65536.0,
+                      subglyph->transform.yy / 65536.0 ));
+
+        subglyph++;
+      }
+    }
+#endif /* FT_DEBUG_LEVEL_TRACE */
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
@@ -753,8 +781,9 @@
   TT_Hint_Glyph( TT_Loader  loader,
                  FT_Bool    is_composite )
   {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    TT_Face    face   = (TT_Face)loader->face;
+#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \
+    defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    TT_Face    face   = loader->face;
     TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
 #endif
 
@@ -772,7 +801,7 @@
     {
       FT_TRACE1(( "TT_Hint_Glyph: too long instructions" ));
       FT_TRACE1(( " (0x%lx byte) is truncated\n",
-                 loader->glyph->control_len ));
+                  loader->glyph->control_len ));
     }
     n_ins = loader->glyph->control_len;
 
@@ -781,7 +810,7 @@
       FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
 
     /* Reset graphics state. */
-    loader->exec->GS = ((TT_Size)loader->size)->GS;
+    loader->exec->GS = loader->size->GS;
 
     /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
     /*      completely refer to the (already) hinted subglyphs.     */
@@ -794,10 +823,8 @@
     }
     else
     {
-      loader->exec->metrics.x_scale =
-        ((TT_Size)loader->size)->metrics.x_scale;
-      loader->exec->metrics.y_scale =
-        ((TT_Size)loader->size)->metrics.y_scale;
+      loader->exec->metrics.x_scale = loader->size->metrics->x_scale;
+      loader->exec->metrics.y_scale = loader->size->metrics->y_scale;
     }
 #endif
 
@@ -838,13 +865,23 @@
 
 #endif
 
-    /* save glyph phantom points */
-    loader->pp1 = zone->cur[zone->n_points - 4];
-    loader->pp2 = zone->cur[zone->n_points - 3];
-    loader->pp3 = zone->cur[zone->n_points - 2];
-    loader->pp4 = zone->cur[zone->n_points - 1];
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* Save possibly modified glyph phantom points unless in v40 backward  */
+    /* compatibility mode, where no movement on the x axis means no reason */
+    /* to change bearings or advance widths.                               */
+    if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
+            loader->exec->backward_compatibility ) )
+    {
+#endif
+      loader->pp1 = zone->cur[zone->n_points - 4];
+      loader->pp2 = zone->cur[zone->n_points - 3];
+      loader->pp3 = zone->cur[zone->n_points - 2];
+      loader->pp4 = zone->cur[zone->n_points - 1];
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    }
+#endif
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
     {
       if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
@@ -853,7 +890,7 @@
       else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
         FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     return FT_Err_Ok;
   }
@@ -897,13 +934,24 @@
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-    if ( ((TT_Face)loader->face)->doblend )
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) ||
+         FT_IS_VARIATION( FT_FACE( loader->face ) )      )
     {
       /* Deltas apply to the unscaled data. */
-      error = TT_Vary_Apply_Glyph_Deltas( (TT_Face)(loader->face),
-                                           loader->glyph_index,
-                                           outline,
-                                           (FT_UInt)n_points );
+      error = TT_Vary_Apply_Glyph_Deltas( loader->face,
+                                          loader->glyph_index,
+                                          outline,
+                                          (FT_UInt)n_points );
+
+      /* recalculate linear horizontal and vertical advances */
+      /* if we don't have HVAR and VVAR, respectively        */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+        loader->linear = outline->points[n_points - 3].x -
+                         outline->points[n_points - 4].x;
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+        loader->vadvance = outline->points[n_points - 1].x -
+                           outline->points[n_points - 2].x;
+
       if ( error )
         return error;
     }
@@ -919,12 +967,12 @@
     }
 
     {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      TT_Face    face   = (TT_Face)loader->face;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      TT_Face    face   = loader->face;
       TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
 
       FT_String*  family         = face->root.family_name;
-      FT_UInt     ppem           = loader->size->metrics.x_ppem;
+      FT_UInt     ppem           = loader->size->metrics->x_ppem;
       FT_String*  style          = face->root.style_name;
       FT_UInt     x_scale_factor = 1000;
 #endif
@@ -938,7 +986,7 @@
       FT_Bool  do_scale = FALSE;
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
       {
@@ -953,9 +1001,9 @@
         if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
              x_scale_factor != 1000                         )
         {
-          x_scale = FT_MulDiv( ((TT_Size)loader->size)->metrics.x_scale,
+          x_scale = FT_MulDiv( loader->size->metrics->x_scale,
                                (FT_Long)x_scale_factor, 1000 );
-          y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+          y_scale = loader->size->metrics->y_scale;
 
           /* compensate for any scaling by de/emboldening; */
           /* the amount was determined via experimentation */
@@ -969,14 +1017,14 @@
       }
       else
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       {
         /* scale the glyph */
         if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
         {
-          x_scale = ((TT_Size)loader->size)->metrics.x_scale;
-          y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+          x_scale = loader->size->metrics->x_scale;
+          y_scale = loader->size->metrics->y_scale;
 
           do_scale = TRUE;
         }
@@ -989,9 +1037,24 @@
           vec->x = FT_MulFix( vec->x, x_scale );
           vec->y = FT_MulFix( vec->y, y_scale );
         }
+      }
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* if we have a HVAR table, `pp1' and/or `pp2' are already adjusted */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ||
+           !IS_HINTED( loader->load_flags )                                 )
+#endif
+      {
         loader->pp1 = outline->points[n_points - 4];
         loader->pp2 = outline->points[n_points - 3];
+      }
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* if we have a VVAR table, `pp3' and/or `pp4' are already adjusted */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ||
+           !IS_HINTED( loader->load_flags )                                 )
+#endif
+      {
         loader->pp3 = outline->points[n_points - 2];
         loader->pp4 = outline->points[n_points - 1];
       }
@@ -1023,30 +1086,29 @@
                                   FT_UInt      start_point,
                                   FT_UInt      num_base_points )
   {
-    FT_GlyphLoader  gloader    = loader->gloader;
-    FT_Vector*      base_vec   = gloader->base.outline.points;
-    FT_UInt         num_points = (FT_UInt)gloader->base.outline.n_points;
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_Outline      current;
     FT_Bool         have_scale;
     FT_Pos          x, y;
 
 
+    current.points   = gloader->base.outline.points +
+                         num_base_points;
+    current.n_points = gloader->base.outline.n_points -
+                         (short)num_base_points;
+
     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 )
-    {
-      FT_UInt  i;
-
-
-      for ( i = num_base_points; i < num_points; i++ )
-        FT_Vector_Transform( base_vec + i, &subglyph->transform );
-    }
+      FT_Outline_Transform( &current, &subglyph->transform );
 
     /* get offset */
     if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
     {
+      FT_UInt     num_points = (FT_UInt)gloader->base.outline.n_points;
       FT_UInt     k = (FT_UInt)subglyph->arg1;
       FT_UInt     l = (FT_UInt)subglyph->arg2;
       FT_Vector*  p1;
@@ -1101,7 +1163,7 @@
                                             : -subglyph->transform.yx;
         int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy
                                             : -subglyph->transform.xy;
-        int  d = subglyph->transform.yy > 0 ? subglyph->transform.yy
+        int  d = subglyph->transform.yy > 0 ?  subglyph->transform.yy
                                             : -subglyph->transform.yy;
         int  m = a > b ? a : b;
         int  n = c > d ? c : d;
@@ -1135,8 +1197,8 @@
 
       if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
       {
-        FT_Fixed  x_scale = ((TT_Size)loader->size)->metrics.x_scale;
-        FT_Fixed  y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+        FT_Fixed  x_scale = loader->size->metrics->x_scale;
+        FT_Fixed  y_scale = loader->size->metrics->y_scale;
 
 
         x = FT_MulFix( x, x_scale );
@@ -1144,16 +1206,34 @@
 
         if ( subglyph->flags & ROUND_XY_TO_GRID )
         {
-          x = FT_PIX_ROUND( x );
-          y = FT_PIX_ROUND( y );
+          TT_Face    face   = loader->face;
+          TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+
+          if ( IS_HINTED( loader->load_flags ) )
+          {
+            /*
+             * We round the horizontal offset only if there is hinting along
+             * the x axis; this corresponds to integer advance width values.
+             *
+             * Theoretically, a glyph's bytecode can toggle ClearType's
+             * `backward compatibility' mode, which would allow modification
+             * of the advance width.  In reality, however, applications
+             * neither allow nor expect modified advance widths if subpixel
+             * rendering is active.
+             *
+             */
+            if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 )
+              x = FT_PIX_ROUND( x );
+
+            y = FT_PIX_ROUND( y );
+          }
         }
       }
     }
 
     if ( x || y )
-      translate_array( num_points - num_base_points,
-                       base_vec + num_base_points,
-                       x, y );
+      FT_Outline_Translate( &current, x, y );
 
     return FT_Err_Ok;
   }
@@ -1215,7 +1295,7 @@
       FT_TRACE5(( "  Instructions size = %d\n", n_ins ));
 
       /* check it */
-      max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
+      max_ins = loader->face->max_profile.maxSizeOfInstructions;
       if ( n_ins > max_ins )
       {
         /* don't trust `maxSizeOfInstructions'; */
@@ -1349,49 +1429,72 @@
    * (3) for everything else.
    *
    */
+  static void
+  tt_loader_set_pp( TT_Loader  loader )
+  {
+    FT_Bool  subpixel_hinting = 0;
+    FT_Bool  grayscale        = 0;
+    FT_Bool  use_aw_2         = 0;
+
 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face );
+#endif
 
-#define TT_LOADER_SET_PP( loader )                                          \
-          do                                                                \
-          {                                                                 \
-            FT_Bool  subpixel_hinting_ = loader->exec                       \
-                                           ? loader->exec->subpixel_hinting \
-                                           : 0;                             \
-            FT_Bool  grayscale_        = loader->exec                       \
-                                           ? loader->exec->grayscale        \
-                                           : 0;                             \
-            FT_Bool  use_aw_2_         = (FT_Bool)( subpixel_hinting_ &&    \
-                                                    grayscale_        );    \
-                                                                            \
-                                                                            \
-            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
-            (loader)->pp1.y = 0;                                            \
-            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
-            (loader)->pp2.y = 0;                                            \
-                                                                            \
-            (loader)->pp3.x = use_aw_2_ ? (loader)->advance / 2 : 0;        \
-            (loader)->pp3.y = (loader)->bbox.yMax + (loader)->top_bearing;  \
-            (loader)->pp4.x = use_aw_2_ ? (loader)->advance / 2 : 0;        \
-            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
-          } while ( 0 )
 
-#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
+    {
+      subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting
+                                      : 0;
+      grayscale        = loader->exec ? loader->exec->grayscale
+                                      : 0;
+    }
+#endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+    {
+      subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean
+                                      : 0;
+      grayscale        = loader->exec ? loader->exec->grayscale_cleartype
+                                      : 0;
+    }
+#endif
 
-#define TT_LOADER_SET_PP( loader )                                          \
-          do                                                                \
-          {                                                                 \
-            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
-            (loader)->pp1.y = 0;                                            \
-            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
-            (loader)->pp2.y = 0;                                            \
-                                                                            \
-            (loader)->pp3.x = 0;                                            \
-            (loader)->pp3.y = (loader)->bbox.yMax + (loader)->top_bearing;  \
-            (loader)->pp4.x = 0;                                            \
-            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
-          } while ( 0 )
+    use_aw_2 = (FT_Bool)( subpixel_hinting && grayscale );
 
-#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+    loader->pp1.x = loader->bbox.xMin - loader->left_bearing;
+    loader->pp1.y = 0;
+    loader->pp2.x = loader->pp1.x + loader->advance;
+    loader->pp2.y = 0;
+
+    loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0;
+    loader->pp3.y = loader->bbox.yMax + loader->top_bearing;
+    loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0;
+    loader->pp4.y = loader->pp3.y - loader->vadvance;
+  }
+
+
+  /* a utility function to retrieve i-th node from given FT_List */
+  static FT_ListNode
+  ft_list_get_node_at( FT_List  list,
+                       FT_UInt  idx )
+  {
+    FT_ListNode  cur;
+
+
+    if ( !list )
+      return NULL;
+
+    for ( cur = list->head; cur; cur = cur->next )
+    {
+      if ( !idx )
+        return cur;
+
+      idx--;
+    }
+
+    return NULL;
+  }
 
 
   /*************************************************************************/
@@ -1412,7 +1515,7 @@
     FT_Error        error        = FT_Err_Ok;
     FT_Fixed        x_scale, y_scale;
     FT_ULong        offset;
-    TT_Face         face         = (TT_Face)loader->face;
+    TT_Face         face         = loader->face;
     FT_GlyphLoader  gloader      = loader->gloader;
     FT_Bool         opened_frame = 0;
 
@@ -1423,13 +1526,17 @@
 #endif
 
 
-    /* some fonts have an incorrect value of `maxComponentDepth', */
-    /* thus we allow depth 1 to catch the majority of them        */
-    if ( recurse_count > 1                                   &&
-         recurse_count > face->max_profile.maxComponentDepth )
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( recurse_count )
+      FT_TRACE5(( "  nesting level: %d\n", recurse_count ));
+#endif
+
+    /* some fonts have an incorrect value of `maxComponentDepth' */
+    if ( recurse_count > face->max_profile.maxComponentDepth )
     {
-      error = FT_THROW( Invalid_Composite );
-      goto Exit;
+      FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n",
+                  recurse_count ));
+      face->max_profile.maxComponentDepth = (FT_UShort)recurse_count;
     }
 
 #ifndef FT_CONFIG_OPTION_INCREMENTAL
@@ -1445,8 +1552,8 @@
 
     if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
     {
-      x_scale = ((TT_Size)loader->size)->metrics.x_scale;
-      y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+      x_scale = loader->size->metrics->x_scale;
+      y_scale = loader->size->metrics->y_scale;
     }
     else
     {
@@ -1475,7 +1582,7 @@
       offset            = 0;
       loader->byte_len  = glyph_data.length;
 
-      FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
+      FT_ZERO( &inc_stream );
       FT_Stream_OpenMemory( &inc_stream,
                             glyph_data.pointer,
                             (FT_ULong)glyph_data.length );
@@ -1493,10 +1600,10 @@
     {
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
       /* for the incremental interface, `glyf_offset' is always zero */
-      if ( !loader->glyf_offset                        &&
+      if ( !face->glyf_offset                          &&
            !face->root.internal->incremental_interface )
 #else
-      if ( !loader->glyf_offset )
+      if ( !face->glyf_offset )
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
       {
         FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
@@ -1505,7 +1612,7 @@
       }
 
       error = face->access_glyph_frame( loader, glyph_index,
-                                        loader->glyf_offset + offset,
+                                        face->glyf_offset + offset,
                                         (FT_UInt)loader->byte_len );
       if ( error )
         goto Exit;
@@ -1544,7 +1651,7 @@
 
       /* must initialize points before (possibly) overriding */
       /* glyph metrics from the incremental interface        */
-      TT_LOADER_SET_PP( loader );
+      tt_loader_set_pp( loader );
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
       tt_get_metrics_incr_overrides( loader, glyph_index );
@@ -1552,7 +1659,8 @@
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( ((TT_Face)(loader->face))->doblend )
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      )
       {
         /* a small outline structure with four elements for */
         /* communication with `TT_Vary_Apply_Glyph_Deltas'  */
@@ -1579,10 +1687,10 @@
         outline.contours   = contours;
 
         /* this must be done before scaling */
-        error = TT_Vary_Apply_Glyph_Deltas( (TT_Face)(loader->face),
-                                             glyph_index,
-                                             &outline,
-                                             outline.n_points );
+        error = TT_Vary_Apply_Glyph_Deltas( loader->face,
+                                            glyph_index,
+                                            &outline,
+                                            (FT_UInt)outline.n_points );
         if ( error )
           goto Exit;
 
@@ -1595,6 +1703,14 @@
         loader->pp3.y = points[2].y;
         loader->pp4.x = points[3].x;
         loader->pp4.y = points[3].y;
+
+
+        /* recalculate linear horizontal and vertical advances */
+        /* if we don't have HVAR and VVAR, respectively        */
+        if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+          loader->linear = loader->pp2.x - loader->pp1.x;
+        if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+          loader->vadvance = loader->pp4.x - loader->pp3.x;
       }
 
 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
@@ -1619,7 +1735,7 @@
 
     /* must initialize phantom points before (possibly) overriding */
     /* glyph metrics from the incremental interface                */
-    TT_LOADER_SET_PP( loader );
+    tt_loader_set_pp( loader );
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     tt_get_metrics_incr_overrides( loader, glyph_index );
@@ -1653,12 +1769,53 @@
     /***********************************************************************/
 
     /* otherwise, load a composite! */
-    else if ( loader->n_contours == -1 )
+    else if ( loader->n_contours < 0 )
     {
+      FT_Memory  memory = face->root.memory;
+
       FT_UInt   start_point;
       FT_UInt   start_contour;
       FT_ULong  ins_pos;  /* position of composite instructions, if any */
 
+      FT_ListNode  node, node2;
+
+
+      /* normalize the `n_contours' value */
+      loader->n_contours = -1;
+
+      /*
+       * We store the glyph index directly in the `node->data' pointer,
+       * following the glib solution (cf. macro `GUINT_TO_POINTER') with a
+       * double cast to make this portable.  Note, however, that this needs
+       * pointers with a width of at least 32 bits.
+       */
+
+
+      /* clear the nodes filled by sibling chains */
+      node = ft_list_get_node_at( &loader->composites, recurse_count );
+      for ( node2 = node; node2; node2 = node2->next )
+        node2->data = (void*)FT_ULONG_MAX;
+
+      /* check whether we already have a composite glyph with this index */
+      if ( FT_List_Find( &loader->composites,
+                         FT_UINT_TO_POINTER( glyph_index ) ) )
+      {
+        FT_TRACE1(( "TT_Load_Composite_Glyph:"
+                    " infinite recursion detected\n" ));
+        error = FT_THROW( Invalid_Composite );
+        goto Exit;
+      }
+
+      else if ( node )
+        node->data = FT_UINT_TO_POINTER( glyph_index );
+
+      else
+      {
+        if ( FT_NEW( node ) )
+          goto Exit;
+        node->data = FT_UINT_TO_POINTER( glyph_index );
+        FT_List_Add( &loader->composites, node );
+      }
 
       start_point   = (FT_UInt)gloader->base.outline.n_points;
       start_contour = (FT_UInt)gloader->base.outline.n_contours;
@@ -1677,9 +1834,10 @@
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( face->doblend )
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      )
       {
-        FT_UInt      i, limit;
+        short        i, limit;
         FT_SubGlyph  subglyph;
 
         FT_Outline  outline;
@@ -1687,22 +1845,24 @@
         char*       tags     = NULL;
         short*      contours = NULL;
 
-        FT_Memory  memory = face->root.memory;
 
-
-        limit = gloader->current.num_subglyphs;
+        limit = (short)gloader->current.num_subglyphs;
 
         /* construct an outline structure for              */
         /* communication with `TT_Vary_Apply_Glyph_Deltas' */
-        outline.n_points   = gloader->current.num_subglyphs + 4;
+        outline.n_points   = (short)( gloader->current.num_subglyphs + 4 );
         outline.n_contours = outline.n_points;
 
+        outline.points   = NULL;
+        outline.tags     = NULL;
+        outline.contours = NULL;
+
         if ( FT_NEW_ARRAY( points, outline.n_points )   ||
              FT_NEW_ARRAY( tags, outline.n_points )     ||
              FT_NEW_ARRAY( contours, outline.n_points ) )
           goto Exit1;
 
-        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+        subglyph = gloader->current.subglyphs;
 
         for ( i = 0; i < limit; i++, subglyph++ )
         {
@@ -1744,22 +1904,22 @@
 
         /* this call provides additional offsets */
         /* for each component's translation      */
-        if ( ( error = TT_Vary_Apply_Glyph_Deltas(
-                         face,
-                         glyph_index,
-                         &outline,
-                         outline.n_points ) ) != 0 )
+        if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas(
+                             face,
+                             glyph_index,
+                             &outline,
+                             (FT_UInt)outline.n_points ) ) )
           goto Exit1;
 
-        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+        subglyph = gloader->current.subglyphs;
 
         for ( i = 0; i < limit; i++, subglyph++ )
         {
-          /* XXX: overflow check for subglyph->{arg1,arg2}.         */
-          /*      Deltas must be within signed 16-bit,              */
-          /*      but the restriction of summed deltas is not clear */
-          subglyph->arg1 = (FT_Int16)points[i].x;
-          subglyph->arg2 = (FT_Int16)points[i].y;
+          if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+          {
+            subglyph->arg1 = (FT_Int16)points[i].x;
+            subglyph->arg2 = (FT_Int16)points[i].y;
+          }
         }
 
         loader->pp1.x = points[i + 0].x;
@@ -1772,6 +1932,13 @@
         loader->pp4.x = points[i + 3].x;
         loader->pp4.y = points[i + 3].y;
 
+        /* recalculate linear horizontal and vertical advances */
+        /* if we don't have HVAR and VVAR, respectively        */
+        if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+          loader->linear = loader->pp2.x - loader->pp1.x;
+        if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+          loader->vadvance = loader->pp4.x - loader->pp3.x;
+
       Exit1:
         FT_FREE( outline.points );
         FT_FREE( outline.tags );
@@ -1831,6 +1998,9 @@
         {
           FT_Vector  pp[4];
 
+          FT_Int  linear_hadvance;
+          FT_Int  linear_vadvance;
+
 
           /* Each time we call load_truetype_glyph in this loop, the   */
           /* value of `gloader.base.subglyphs' can change due to table */
@@ -1843,6 +2013,9 @@
           pp[2] = loader->pp3;
           pp[3] = loader->pp4;
 
+          linear_hadvance = loader->linear;
+          linear_vadvance = loader->vadvance;
+
           num_base_points = (FT_UInt)gloader->base.outline.n_points;
 
           error = load_truetype_glyph( loader,
@@ -1862,6 +2035,9 @@
             loader->pp2 = pp[1];
             loader->pp3 = pp[2];
             loader->pp4 = pp[3];
+
+            loader->linear   = linear_hadvance;
+            loader->vadvance = linear_vadvance;
           }
 
           num_points = (FT_UInt)gloader->base.outline.n_points;
@@ -1902,12 +2078,6 @@
         }
       }
     }
-    else
-    {
-      /* invalid composite count (negative but not -1) */
-      error = FT_THROW( Invalid_Outline );
-      goto Exit;
-    }
 
     /***********************************************************************/
     /***********************************************************************/
@@ -1935,20 +2105,21 @@
   compute_glyph_metrics( TT_Loader  loader,
                          FT_UInt    glyph_index )
   {
-    TT_Face    face   = (TT_Face)loader->face;
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+    TT_Face    face   = loader->face;
+#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \
+    defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
 #endif
 
     FT_BBox       bbox;
     FT_Fixed      y_scale;
     TT_GlyphSlot  glyph = loader->glyph;
-    TT_Size       size  = (TT_Size)loader->size;
+    TT_Size       size  = loader->size;
 
 
     y_scale = 0x10000L;
     if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-      y_scale = size->root.metrics.y_scale;
+      y_scale = size->metrics->y_scale;
 
     if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
       FT_Outline_Get_CBox( &glyph->outline, &bbox );
@@ -1963,18 +2134,27 @@
     glyph->metrics.horiBearingY = bbox.yMax;
     glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;
 
-    /* adjust advance width to the value contained in the hdmx table */
-    if ( !face->postscript.isFixedPitch  &&
-         IS_HINTED( loader->load_flags ) )
+    /* Adjust advance width to the value contained in the hdmx table   */
+    /* unless FT_LOAD_COMPUTE_METRICS is set or backward compatibility */
+    /* mode of the v40 interpreter is active.  See `ttinterp.h' for    */
+    /* details on backward compatibility mode.                         */
+    if (
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+         !( driver->interpreter_version == TT_INTERPRETER_VERSION_40  &&
+            ( loader->exec && loader->exec->backward_compatibility  ) ) &&
+#endif
+         !face->postscript.isFixedPitch                                 &&
+         IS_HINTED( loader->load_flags )                                &&
+         !( loader->load_flags & FT_LOAD_COMPUTE_METRICS )              )
     {
       FT_Byte*  widthp;
 
 
       widthp = tt_face_get_device_metrics( face,
-                                           size->root.metrics.x_ppem,
+                                           size->metrics->x_ppem,
                                            glyph_index );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
       {
@@ -1988,21 +2168,21 @@
              ( ( ignore_x_mode && loader->exec->compatible_widths ) ||
                 !ignore_x_mode                                      ||
                 SPH_OPTION_BITMAP_WIDTHS                            ) )
-          glyph->metrics.horiAdvance = *widthp << 6;
+          glyph->metrics.horiAdvance = *widthp * 64;
       }
       else
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       {
         if ( widthp )
-          glyph->metrics.horiAdvance = *widthp << 6;
+          glyph->metrics.horiAdvance = *widthp * 64;
       }
     }
 
     /* set glyph dimensions */
-    glyph->metrics.width  = bbox.xMax - bbox.xMin;
-    glyph->metrics.height = bbox.yMax - bbox.yMin;
+    glyph->metrics.width  = SUB_LONG( bbox.xMax, bbox.xMin );
+    glyph->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin );
 
     /* Now take care of vertical metrics.  In the case where there is */
     /* no vertical information within the font (relatively common),   */
@@ -2038,7 +2218,8 @@
         /*       table in the font.  Otherwise, we use the     */
         /*       values defined in the horizontal header.      */
 
-        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+        height = (FT_Short)FT_DivFix( SUB_LONG( bbox.yMax,
+                                                bbox.yMin ),
                                       y_scale );
         if ( face->os2.version != 0xFFFFU )
           advance = (FT_Pos)( face->os2.sTypoAscender -
@@ -2053,7 +2234,7 @@
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
       {
         FT_Incremental_InterfaceRec*  incr;
-        FT_Incremental_MetricsRec     metrics;
+        FT_Incremental_MetricsRec     incr_metrics;
         FT_Error                      error;
 
 
@@ -2063,19 +2244,19 @@
         /* overriding metrics for this glyph.                       */
         if ( incr && incr->funcs->get_glyph_metrics )
         {
-          metrics.bearing_x = 0;
-          metrics.bearing_y = top;
-          metrics.advance   = advance;
+          incr_metrics.bearing_x = 0;
+          incr_metrics.bearing_y = top;
+          incr_metrics.advance   = advance;
 
           error = incr->funcs->get_glyph_metrics( incr->object,
                                                   glyph_index,
                                                   TRUE,
-                                                  &metrics );
+                                                  &incr_metrics );
           if ( error )
             return error;
 
-          top     = metrics.bearing_y;
-          advance = metrics.advance;
+          top     = incr_metrics.bearing_y;
+          advance = incr_metrics.advance;
         }
       }
 
@@ -2117,7 +2298,7 @@
     SFNT_Service        sfnt;
     FT_Stream           stream;
     FT_Error            error;
-    TT_SBit_MetricsRec  metrics;
+    TT_SBit_MetricsRec  sbit_metrics;
 
 
     face   = (TT_Face)glyph->face;
@@ -2130,34 +2311,34 @@
                                    (FT_UInt)load_flags,
                                    stream,
                                    &glyph->bitmap,
-                                   &metrics );
+                                   &sbit_metrics );
     if ( !error )
     {
       glyph->outline.n_points   = 0;
       glyph->outline.n_contours = 0;
 
-      glyph->metrics.width  = (FT_Pos)metrics.width  << 6;
-      glyph->metrics.height = (FT_Pos)metrics.height << 6;
+      glyph->metrics.width  = (FT_Pos)sbit_metrics.width  * 64;
+      glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64;
 
-      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
-      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
-      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
+      glyph->metrics.horiBearingX = (FT_Pos)sbit_metrics.horiBearingX * 64;
+      glyph->metrics.horiBearingY = (FT_Pos)sbit_metrics.horiBearingY * 64;
+      glyph->metrics.horiAdvance  = (FT_Pos)sbit_metrics.horiAdvance  * 64;
 
-      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
-      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
-      glyph->metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
+      glyph->metrics.vertBearingX = (FT_Pos)sbit_metrics.vertBearingX * 64;
+      glyph->metrics.vertBearingY = (FT_Pos)sbit_metrics.vertBearingY * 64;
+      glyph->metrics.vertAdvance  = (FT_Pos)sbit_metrics.vertAdvance  * 64;
 
       glyph->format = FT_GLYPH_FORMAT_BITMAP;
 
       if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
       {
-        glyph->bitmap_left = metrics.vertBearingX;
-        glyph->bitmap_top  = metrics.vertBearingY;
+        glyph->bitmap_left = sbit_metrics.vertBearingX;
+        glyph->bitmap_top  = sbit_metrics.vertBearingY;
       }
       else
       {
-        glyph->bitmap_left = metrics.horiBearingX;
-        glyph->bitmap_top  = metrics.horiBearingY;
+        glyph->bitmap_left = sbit_metrics.horiBearingX;
+        glyph->bitmap_top  = sbit_metrics.horiBearingY;
       }
     }
 
@@ -2174,19 +2355,23 @@
                   FT_Int32      load_flags,
                   FT_Bool       glyf_table_only )
   {
-    FT_Error  error;
-
     TT_Face    face;
     FT_Stream  stream;
+
 #ifdef TT_USE_BYTECODE_INTERPRETER
+    FT_Error   error;
     FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \
+    defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( (TT_Face)glyph->face );
+#endif
 #endif
 
 
     face   = (TT_Face)glyph->face;
     stream = face->root.stream;
 
-    FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
+    FT_ZERO( loader );
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
@@ -2194,11 +2379,13 @@
     if ( IS_HINTED( load_flags ) && !glyf_table_only )
     {
       TT_ExecContext  exec;
-      FT_Bool         grayscale;
+      FT_Bool         grayscale = TRUE;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      FT_Bool         subpixel_hinting_lean;
+      FT_Bool         grayscale_cleartype;
+#endif
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       FT_Bool  subpixel_hinting = FALSE;
 
 #if 0
@@ -2210,7 +2397,7 @@
       FT_Bool  subpixel_positioned;
       FT_Bool  gray_cleartype;
 #endif
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       FT_Bool  reexecute = FALSE;
 
@@ -2231,7 +2418,32 @@
       if ( !exec )
         return FT_THROW( Could_Not_Find_Context );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+      {
+        subpixel_hinting_lean =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   FT_RENDER_MODE_MONO               );
+        grayscale_cleartype =
+          FT_BOOL( subpixel_hinting_lean         &&
+                   !( ( load_flags         &
+                        FT_LOAD_TARGET_LCD )   ||
+                      ( load_flags           &
+                        FT_LOAD_TARGET_LCD_V ) ) );
+        exec->vertical_lcd_lean =
+          FT_BOOL( subpixel_hinting_lean    &&
+                   ( load_flags           &
+                     FT_LOAD_TARGET_LCD_V ) );
+      }
+      else
+      {
+        subpixel_hinting_lean   = FALSE;
+        grayscale_cleartype     = FALSE;
+        exec->vertical_lcd_lean = FALSE;
+      }
+#endif
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
       {
@@ -2288,18 +2500,23 @@
       }
       else
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-      {
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+        grayscale = FT_BOOL( !subpixel_hinting_lean               &&
+                             FT_LOAD_TARGET_MODE( load_flags ) !=
+                               FT_RENDER_MODE_MONO                );
+      else
+#endif
         grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                             FT_RENDER_MODE_MONO );
-      }
+                               FT_RENDER_MODE_MONO             );
 
       error = TT_Load_Context( exec, face, size );
       if ( error )
         return error;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
       {
@@ -2327,9 +2544,37 @@
       }
       else
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       {
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+        if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
+        {
+          /* a change from mono to subpixel rendering (and vice versa) */
+          /* requires a re-execution of the CVT program                */
+          if ( subpixel_hinting_lean != exec->subpixel_hinting_lean )
+          {
+            FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
+                        " re-executing `prep' table\n" ));
+
+            exec->subpixel_hinting_lean = subpixel_hinting_lean;
+            reexecute                   = TRUE;
+          }
+
+          /* a change from colored to grayscale subpixel rendering (and */
+          /* vice versa) requires a re-execution of the CVT program     */
+          if ( grayscale_cleartype != exec->grayscale_cleartype )
+          {
+            FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change,"
+                        " re-executing `prep' table\n" ));
+
+            exec->grayscale_cleartype = grayscale_cleartype;
+            reexecute                 = TRUE;
+          }
+        }
+#endif
+
         /* a change from mono to grayscale rendering (and vice versa) */
         /* requires a re-execution of the CVT program                 */
         if ( grayscale != exec->grayscale )
@@ -2362,10 +2607,11 @@
       if ( exec->GS.instruct_control & 2 )
         exec->GS = tt_default_graphics_state;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       /* check whether we have a font hinted for ClearType --           */
       /* note that this flag can also be modified in a glyph's bytecode */
-      if ( exec->GS.instruct_control & 4 )
+      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
+           exec->GS.instruct_control & 4                            )
         exec->ignore_x_mode = 0;
 #endif
 
@@ -2376,32 +2622,6 @@
 
 #endif /* TT_USE_BYTECODE_INTERPRETER */
 
-    /* seek to the beginning of the glyph table -- for Type 42 fonts     */
-    /* the table might be accessed from a Postscript stream or something */
-    /* else...                                                           */
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    if ( face->root.internal->incremental_interface )
-      loader->glyf_offset = 0;
-    else
-
-#endif
-
-    {
-      error = face->goto_table( face, TTAG_glyf, stream, 0 );
-
-      if ( FT_ERR_EQ( error, Table_Missing ) )
-        loader->glyf_offset = 0;
-      else if ( error )
-      {
-        FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
-        return error;
-      }
-      else
-        loader->glyf_offset = FT_STREAM_POS();
-    }
-
     /* get face's glyph loader */
     if ( !glyf_table_only )
     {
@@ -2414,15 +2634,28 @@
 
     loader->load_flags = (FT_ULong)load_flags;
 
-    loader->face   = (FT_Face)face;
-    loader->size   = (FT_Size)size;
+    loader->face   = face;
+    loader->size   = size;
     loader->glyph  = (FT_GlyphSlot)glyph;
     loader->stream = stream;
 
+    loader->composites.head = NULL;
+    loader->composites.tail = NULL;
+
     return FT_Err_Ok;
   }
 
 
+  static void
+  tt_loader_done( TT_Loader  loader )
+  {
+    FT_List_Finalize( &loader->composites,
+                      NULL,
+                      loader->face->root.memory,
+                      NULL );
+  }
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -2459,39 +2692,108 @@
     FT_Error      error;
     TT_LoaderRec  loader;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#define IS_DEFAULT_INSTANCE  ( !( FT_IS_NAMED_INSTANCE( glyph->face ) ||  \
+                                  FT_IS_VARIATION( glyph->face )      ) )
+#else
+#define IS_DEFAULT_INSTANCE  1
+#endif
+
 
     FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index ));
 
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
 
-    /* try to load embedded bitmap if any              */
-    /*                                                 */
-    /* XXX: The convention should be emphasized in     */
-    /*      the documents because it can be confusing. */
+    /* try to load embedded bitmap (if any) */
     if ( size->strike_index != 0xFFFFFFFFUL      &&
-         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 &&
+         IS_DEFAULT_INSTANCE                     )
     {
+      FT_Fixed  x_scale = size->root.metrics.x_scale;
+      FT_Fixed  y_scale = size->root.metrics.y_scale;
+
+
       error = load_sbit_image( size, glyph, glyph_index, load_flags );
-      if ( !error )
+      if ( FT_ERR_EQ( error, Missing_Bitmap ) )
+      {
+        /* the bitmap strike is incomplete and misses the requested glyph; */
+        /* if we have a bitmap-only font, return an empty glyph            */
+        if ( !FT_IS_SCALABLE( glyph->face ) )
+        {
+          TT_Face  face = (TT_Face)glyph->face;
+
+          FT_Short  left_bearing = 0;
+          FT_Short  top_bearing  = 0;
+
+          FT_UShort  advance_width  = 0;
+          FT_UShort  advance_height = 0;
+
+
+          /* to return an empty glyph, however, we need metrics data   */
+          /* from the `hmtx' (or `vmtx') table; the assumption is that */
+          /* empty glyphs are missing intentionally, representing      */
+          /* whitespace - not having at least horizontal metrics is    */
+          /* thus considered an error                                  */
+          if ( !face->horz_metrics_size )
+            return error;
+
+          /* we now construct an empty bitmap glyph */
+          TT_Get_HMetrics( face, glyph_index,
+                           &left_bearing,
+                           &advance_width );
+          TT_Get_VMetrics( face, glyph_index,
+                           0,
+                           &top_bearing,
+                           &advance_height );
+
+          glyph->outline.n_points   = 0;
+          glyph->outline.n_contours = 0;
+
+          glyph->metrics.width  = 0;
+          glyph->metrics.height = 0;
+
+          glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale );
+          glyph->metrics.horiBearingY = 0;
+          glyph->metrics.horiAdvance  = FT_MulFix( advance_width, x_scale );
+
+          glyph->metrics.vertBearingX = 0;
+          glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale );
+          glyph->metrics.vertAdvance  = FT_MulFix( advance_height, y_scale );
+
+          glyph->format            = FT_GLYPH_FORMAT_BITMAP;
+          glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
+
+          glyph->bitmap_left = 0;
+          glyph->bitmap_top  = 0;
+
+          return FT_Err_Ok;
+        }
+      }
+      else if ( error )
+      {
+        /* return error if font is not scalable */
+        if ( !FT_IS_SCALABLE( glyph->face ) )
+          return error;
+      }
+      else
       {
         if ( FT_IS_SCALABLE( glyph->face ) )
         {
           /* for the bbox we need the header only */
           (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
           (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
+          tt_loader_done( &loader );
           glyph->linearHoriAdvance = loader.linear;
           glyph->linearVertAdvance = loader.vadvance;
 
           /* sanity checks: if `xxxAdvance' in the sbit metric */
           /* structure isn't set, use `linearXXXAdvance'      */
           if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance )
-            glyph->metrics.horiAdvance =
-              FT_MulFix( glyph->linearHoriAdvance,
-                         size->root.metrics.x_scale );
+            glyph->metrics.horiAdvance = FT_MulFix( glyph->linearHoriAdvance,
+                                                    x_scale );
           if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance )
-            glyph->metrics.vertAdvance =
-              FT_MulFix( glyph->linearVertAdvance,
-                         size->root.metrics.y_scale );
+            glyph->metrics.vertAdvance = FT_MulFix( glyph->linearVertAdvance,
+                                                    y_scale );
         }
 
         return FT_Err_Ok;
@@ -2502,14 +2804,20 @@
 
     /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
     if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
-      return FT_THROW( Invalid_Size_Handle );
+    {
+      error = FT_THROW( Invalid_Size_Handle );
+      goto Exit;
+    }
 
     if ( load_flags & FT_LOAD_SBITS_ONLY )
-      return FT_THROW( Invalid_Argument );
+    {
+      error = FT_THROW( Invalid_Argument );
+      goto Exit;
+    }
 
     error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
     if ( error )
-      return error;
+      goto Exit;
 
     glyph->format        = FT_GLYPH_FORMAT_OUTLINE;
     glyph->num_subglyphs = 0;
@@ -2574,14 +2882,23 @@
       error = compute_glyph_metrics( &loader, glyph_index );
     }
 
+    tt_loader_done( &loader );
+
     /* Set the `high precision' bit flag.                           */
     /* This is _critical_ to get correct output for monochrome      */
     /* TrueType glyphs at all sizes using the bytecode interpreter. */
     /*                                                              */
     if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
-         size->root.metrics.y_ppem < 24     )
+         size->metrics->y_ppem < 24         )
       glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
 
+  Exit:
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( error )
+      FT_TRACE1(( "  failed (error code 0x%x)\n",
+                  error ));
+#endif
+
     return error;
   }
 
diff --git a/src/truetype/ttgload.h b/src/truetype/ttgload.h
index 8e3255e..d237cfd 100644
--- a/src/truetype/ttgload.h
+++ b/src/truetype/ttgload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTGLOAD_H__
-#define __TTGLOAD_H__
+#ifndef TTGLOAD_H_
+#define TTGLOAD_H_
 
 
 #include <ft2build.h>
@@ -56,7 +56,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTGLOAD_H__ */
+#endif /* TTGLOAD_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
index 2b12483..29ab2a4 100644
--- a/src/truetype/ttgxvar.c
+++ b/src/truetype/ttgxvar.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType GX Font Variation loader                                    */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,10 +22,6 @@
   /*                                                                       */
   /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html */
   /*                                                                       */
-  /* The documentation for `fvar' is inconsistent.  At one point it says   */
-  /* that `countSizePairs' should be 3, at another point 2.  It should     */
-  /* be 2.                                                                 */
-  /*                                                                       */
   /* The documentation for `gvar' is not intelligible; `cvar' refers you   */
   /* to `gvar' and is thus also incomprehensible.                          */
   /*                                                                       */
@@ -49,7 +45,9 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
+#include FT_TRUETYPE_IDS_H
 #include FT_MULTIPLE_MASTERS_H
+#include FT_LIST_H
 
 #include "ttpload.h"
 #include "ttgxvar.h"
@@ -62,8 +60,11 @@
 
 #define FT_Stream_FTell( stream )                         \
           (FT_ULong)( (stream)->cursor - (stream)->base )
-#define FT_Stream_SeekSet( stream, off )                  \
-          ( (stream)->cursor = (stream)->base + (off) )
+#define FT_Stream_SeekSet( stream, off )                               \
+          (stream)->cursor =                                           \
+            ( (off) < (FT_ULong)( (stream)->limit - (stream)->base ) ) \
+                        ? (stream)->base + (off)                       \
+                        : (stream)->limit
 
 
   /*************************************************************************/
@@ -112,6 +113,8 @@
   /* <Input>                                                               */
   /*    stream    :: The data stream.                                      */
   /*                                                                       */
+  /*    size      :: The size of the table holding the data.               */
+  /*                                                                       */
   /* <Output>                                                              */
   /*    point_cnt :: The number of points read.  A zero value means that   */
   /*                 all points in the glyph will be affected, without     */
@@ -123,6 +126,7 @@
   /*                                                                       */
   static FT_UShort*
   ft_var_readpackedpoints( FT_Stream  stream,
+                           FT_ULong   size,
                            FT_UInt   *point_cnt )
   {
     FT_UShort *points = NULL;
@@ -149,48 +153,55 @@
       n  |= FT_GET_BYTE();
     }
 
-    if ( FT_NEW_ARRAY( points, n ) )
+    if ( n > size )
+    {
+      FT_TRACE1(( "ft_var_readpackedpoints: number of points too large\n" ));
+      return NULL;
+    }
+
+    /* in the nested loops below we increase `i' twice; */
+    /* it is faster to simply allocate one more slot    */
+    /* than to add another test within the loop         */
+    if ( FT_NEW_ARRAY( points, n + 1 ) )
       return NULL;
 
     *point_cnt = n;
 
-    i = 0;
+    first = 0;
+    i     = 0;
     while ( i < n )
     {
       runcnt = FT_GET_BYTE();
       if ( runcnt & GX_PT_POINTS_ARE_WORDS )
       {
         runcnt     &= GX_PT_POINT_RUN_COUNT_MASK;
-        first       = FT_GET_USHORT();
+        first      += FT_GET_USHORT();
         points[i++] = first;
 
-        if ( runcnt < 1 || i + runcnt > n )
-          goto Exit;
-
         /* first point not included in run count */
         for ( j = 0; j < runcnt; j++ )
         {
           first      += FT_GET_USHORT();
           points[i++] = first;
+          if ( i >= n )
+            break;
         }
       }
       else
       {
-        first       = FT_GET_BYTE();
+        first      += FT_GET_BYTE();
         points[i++] = first;
 
-        if ( runcnt < 1 || i + runcnt > n )
-          goto Exit;
-
         for ( j = 0; j < runcnt; j++ )
         {
           first      += FT_GET_BYTE();
           points[i++] = first;
+          if ( i >= n )
+            break;
         }
       }
     }
 
-  Exit:
     return points;
   }
 
@@ -212,6 +223,8 @@
   /* <Input>                                                               */
   /*    stream    :: The data stream.                                      */
   /*                                                                       */
+  /*    size      :: The size of the table holding the data.               */
+  /*                                                                       */
   /*    delta_cnt :: The number of deltas to be read.                      */
   /*                                                                       */
   /* <Return>                                                              */
@@ -222,6 +235,7 @@
   /*                                                                       */
   static FT_Short*
   ft_var_readpackeddeltas( FT_Stream  stream,
+                           FT_ULong   size,
                            FT_UInt    delta_cnt )
   {
     FT_Short  *deltas = NULL;
@@ -233,6 +247,12 @@
     FT_UNUSED( error );
 
 
+    if ( delta_cnt > size )
+    {
+      FT_TRACE1(( "ft_var_readpackeddeltas: number of points too large\n" ));
+      return NULL;
+    }
+
     if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
       return NULL;
 
@@ -303,7 +323,7 @@
 
     FT_TRACE2(( "AVAR " ));
 
-    blend->avar_checked = TRUE;
+    blend->avar_loaded = TRUE;
     error = face->goto_table( face, TTAG_avar, stream, &table_len );
     if ( error )
     {
@@ -327,7 +347,7 @@
 
     if ( axisCount != (FT_Long)blend->mmvar->num_axis )
     {
-      FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `cvar'\n"
+      FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `fvar'\n"
                   "                  table are different\n" ));
       goto Exit;
     }
@@ -341,7 +361,8 @@
       FT_TRACE5(( "  axis %d:\n", i ));
 
       segment->pairCount = FT_GET_USHORT();
-      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
+      if ( (FT_ULong)segment->pairCount * 4 > table_len                ||
+           FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
       {
         /* Failure.  Free everything we have done so far.  We must do */
         /* it right now since loading the `avar' table is optional.   */
@@ -357,10 +378,10 @@
       for ( j = 0; j < segment->pairCount; j++ )
       {
         /* convert to Fixed */
-        segment->correspondence[j].fromCoord = FT_GET_SHORT() << 2;
-        segment->correspondence[j].toCoord   = FT_GET_SHORT() << 2;
+        segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4;
+        segment->correspondence[j].toCoord   = FT_GET_SHORT() * 4;
 
-        FT_TRACE5(( "    mapping %.4f to %.4f\n",
+        FT_TRACE5(( "    mapping %.5f to %.5f\n",
                     segment->correspondence[j].fromCoord / 65536.0,
                     segment->correspondence[j].toCoord / 65536.0 ));
       }
@@ -373,6 +394,999 @@
   }
 
 
+  /* some macros we need */
+#define FT_FIXED_ONE  ( (FT_Fixed)0x10000 )
+
+#define FT_fdot14ToFixed( x )                \
+        ( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
+#define FT_intToFixed( i )                    \
+        ( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
+#define FT_fixedToInt( x )                                   \
+        ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+
+
+  static FT_Error
+  ft_var_load_item_variation_store( TT_Face          face,
+                                    FT_ULong         offset,
+                                    GX_ItemVarStore  itemStore )
+  {
+    FT_Stream  stream = FT_FACE_STREAM( face );
+    FT_Memory  memory = stream->memory;
+
+    FT_Error   error;
+    FT_UShort  format;
+    FT_ULong   region_offset;
+    FT_UInt    i, j, k;
+    FT_UInt    shortDeltaCount;
+
+    GX_Blend        blend = face->blend;
+    GX_ItemVarData  varData;
+
+    FT_ULong*  dataOffsetArray = NULL;
+
+
+    if ( FT_STREAM_SEEK( offset ) ||
+         FT_READ_USHORT( format ) )
+      goto Exit;
+
+    if ( format != 1 )
+    {
+      FT_TRACE2(( "ft_var_load_item_variation_store: bad store format %d\n",
+                  format ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    /* read top level fields */
+    if ( FT_READ_ULONG( region_offset )         ||
+         FT_READ_USHORT( itemStore->dataCount ) )
+      goto Exit;
+
+    /* we need at least one entry in `itemStore->varData' */
+    if ( !itemStore->dataCount )
+    {
+      FT_TRACE2(( "ft_var_load_item_variation_store: missing varData\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    /* make temporary copy of item variation data offsets; */
+    /* we will parse region list first, then come back     */
+    if ( FT_NEW_ARRAY( dataOffsetArray, itemStore->dataCount ) )
+      goto Exit;
+
+    for ( i = 0; i < itemStore->dataCount; i++ )
+    {
+      if ( FT_READ_ULONG( dataOffsetArray[i] ) )
+        goto Exit;
+    }
+
+    /* parse array of region records (region list) */
+    if ( FT_STREAM_SEEK( offset + region_offset ) )
+      goto Exit;
+
+    if ( FT_READ_USHORT( itemStore->axisCount )   ||
+         FT_READ_USHORT( itemStore->regionCount ) )
+      goto Exit;
+
+    if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis )
+    {
+      FT_TRACE2(( "ft_var_load_item_variation_store:"
+                  " number of axes in item variation store\n"
+                  "                                 "
+                  " and `fvar' table are different\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    if ( FT_NEW_ARRAY( itemStore->varRegionList, itemStore->regionCount ) )
+      goto Exit;
+
+    for ( i = 0; i < itemStore->regionCount; i++ )
+    {
+      GX_AxisCoords  axisCoords;
+
+
+      if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList,
+                         itemStore->axisCount ) )
+        goto Exit;
+
+      axisCoords = itemStore->varRegionList[i].axisList;
+
+      for ( j = 0; j < itemStore->axisCount; j++ )
+      {
+        FT_Short  start, peak, end;
+
+
+        if ( FT_READ_SHORT( start ) ||
+             FT_READ_SHORT( peak )  ||
+             FT_READ_SHORT( end )   )
+          goto Exit;
+
+        axisCoords[j].startCoord = FT_fdot14ToFixed( start );
+        axisCoords[j].peakCoord  = FT_fdot14ToFixed( peak );
+        axisCoords[j].endCoord   = FT_fdot14ToFixed( end );
+      }
+    }
+
+    /* end of region list parse */
+
+    /* use dataOffsetArray now to parse varData items */
+    if ( FT_NEW_ARRAY( itemStore->varData, itemStore->dataCount ) )
+      goto Exit;
+
+    for ( i = 0; i < itemStore->dataCount; i++ )
+    {
+      varData = &itemStore->varData[i];
+
+      if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) )
+        goto Exit;
+
+      if ( FT_READ_USHORT( varData->itemCount )      ||
+           FT_READ_USHORT( shortDeltaCount )         ||
+           FT_READ_USHORT( varData->regionIdxCount ) )
+        goto Exit;
+
+      /* check some data consistency */
+      if ( shortDeltaCount > varData->regionIdxCount )
+      {
+        FT_TRACE2(( "bad short count %d or region count %d\n",
+                    shortDeltaCount,
+                    varData->regionIdxCount ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      if ( varData->regionIdxCount > itemStore->regionCount )
+      {
+        FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n",
+                    varData->regionIdxCount,
+                    i ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      /* parse region indices */
+      if ( FT_NEW_ARRAY( varData->regionIndices,
+                         varData->regionIdxCount ) )
+        goto Exit;
+
+      for ( j = 0; j < varData->regionIdxCount; j++ )
+      {
+        if ( FT_READ_USHORT( varData->regionIndices[j] ) )
+          goto Exit;
+
+        if ( varData->regionIndices[j] >= itemStore->regionCount )
+        {
+          FT_TRACE2(( "bad region index %d\n",
+                      varData->regionIndices[j] ));
+          error = FT_THROW( Invalid_Table );
+          goto Exit;
+        }
+      }
+
+      /* Parse delta set.                                                */
+      /*                                                                 */
+      /* On input, deltas are (shortDeltaCount + regionIdxCount) bytes   */
+      /* each; on output, deltas are expanded to `regionIdxCount' shorts */
+      /* each.                                                           */
+      if ( FT_NEW_ARRAY( varData->deltaSet,
+                         varData->regionIdxCount * varData->itemCount ) )
+        goto Exit;
+
+      /* the delta set is stored as a 2-dimensional array of shorts; */
+      /* sign-extend signed bytes to signed shorts                   */
+      for ( j = 0; j < varData->itemCount * varData->regionIdxCount; )
+      {
+        for ( k = 0; k < shortDeltaCount; k++, j++ )
+        {
+          /* read the short deltas */
+          FT_Short  delta;
+
+
+          if ( FT_READ_SHORT( delta ) )
+            goto Exit;
+
+          varData->deltaSet[j] = delta;
+        }
+
+        for ( ; k < varData->regionIdxCount; k++, j++ )
+        {
+          /* read the (signed) byte deltas */
+          FT_Char  delta;
+
+
+          if ( FT_READ_CHAR( delta ) )
+            goto Exit;
+
+          varData->deltaSet[j] = delta;
+        }
+      }
+    }
+
+  Exit:
+    FT_FREE( dataOffsetArray );
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_var_load_delta_set_index_mapping( TT_Face            face,
+                                       FT_ULong           offset,
+                                       GX_DeltaSetIdxMap  map,
+                                       GX_ItemVarStore    itemStore )
+  {
+    FT_Stream  stream = FT_FACE_STREAM( face );
+    FT_Memory  memory = stream->memory;
+
+    FT_Error   error;
+
+    FT_UShort  format;
+    FT_UInt    entrySize;
+    FT_UInt    innerBitCount;
+    FT_UInt    innerIndexMask;
+    FT_UInt    i, j;
+
+
+    if ( FT_STREAM_SEEK( offset )        ||
+         FT_READ_USHORT( format )        ||
+         FT_READ_USHORT( map->mapCount ) )
+      goto Exit;
+
+    if ( format & 0xFFC0 )
+    {
+      FT_TRACE2(( "bad map format %d\n", format ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    /* bytes per entry: 1, 2, 3, or 4 */
+    entrySize      = ( ( format & 0x0030 ) >> 4 ) + 1;
+    innerBitCount  = ( format & 0x000F ) + 1;
+    innerIndexMask = ( 1 << innerBitCount ) - 1;
+
+    if ( FT_NEW_ARRAY( map->innerIndex, map->mapCount ) )
+      goto Exit;
+
+    if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) )
+      goto Exit;
+
+    for ( i = 0; i < map->mapCount; i++ )
+    {
+      FT_UInt  mapData = 0;
+      FT_UInt  outerIndex, innerIndex;
+
+
+      /* read map data one unsigned byte at a time, big endian */
+      for ( j = 0; j < entrySize; j++ )
+      {
+        FT_Byte  data;
+
+
+        if ( FT_READ_BYTE( data ) )
+          goto Exit;
+
+        mapData = ( mapData << 8 ) | data;
+      }
+
+      outerIndex = mapData >> innerBitCount;
+
+      if ( outerIndex >= itemStore->dataCount )
+      {
+        FT_TRACE2(( "outerIndex[%d] == %d out of range\n",
+                    i,
+                    outerIndex ));
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
+      }
+
+      map->outerIndex[i] = outerIndex;
+
+      innerIndex = mapData & innerIndexMask;
+
+      if ( innerIndex >= itemStore->varData[outerIndex].itemCount )
+      {
+        FT_TRACE2(( "innerIndex[%d] == %d out of range\n",
+                    i,
+                    innerIndex ));
+        error = FT_THROW( Invalid_Table );
+          goto Exit;
+      }
+
+      map->innerIndex[i] = innerIndex;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_hvvar                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    If `vertical' is zero, parse the `HVAR' table and set              */
+  /*    `blend->hvar_loaded' to TRUE.  On success, `blend->hvar_checked'   */
+  /*    is set to TRUE.                                                    */
+  /*                                                                       */
+  /*    If `vertical' is not zero, parse the `VVAR' table and set          */
+  /*    `blend->vvar_loaded' to TRUE.  On success, `blend->vvar_checked'   */
+  /*    is set to TRUE.                                                    */
+  /*                                                                       */
+  /*    Some memory may remain allocated on error; it is always freed in   */
+  /*    `tt_done_blend', however.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  ft_var_load_hvvar( TT_Face  face,
+                     FT_Bool  vertical )
+  {
+    FT_Stream  stream = FT_FACE_STREAM( face );
+    FT_Memory  memory = stream->memory;
+
+    GX_Blend  blend = face->blend;
+
+    GX_HVVarTable  table;
+
+    FT_Error   error;
+    FT_UShort  majorVersion;
+    FT_ULong   table_len;
+    FT_ULong   table_offset;
+    FT_ULong   store_offset;
+    FT_ULong   widthMap_offset;
+
+
+    if ( vertical )
+    {
+      blend->vvar_loaded = TRUE;
+
+      FT_TRACE2(( "VVAR " ));
+
+      error = face->goto_table( face, TTAG_VVAR, stream, &table_len );
+    }
+    else
+    {
+      blend->hvar_loaded = TRUE;
+
+      FT_TRACE2(( "HVAR " ));
+
+      error = face->goto_table( face, TTAG_HVAR, stream, &table_len );
+    }
+
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+      goto Exit;
+    }
+
+    table_offset = FT_STREAM_POS();
+
+    /* skip minor version */
+    if ( FT_READ_USHORT( majorVersion ) ||
+         FT_STREAM_SKIP( 2 )            )
+      goto Exit;
+
+    if ( majorVersion != 1 )
+    {
+      FT_TRACE2(( "bad table version %d\n", majorVersion ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    if ( FT_READ_ULONG( store_offset )    ||
+         FT_READ_ULONG( widthMap_offset ) )
+      goto Exit;
+
+    if ( vertical )
+    {
+      if ( FT_NEW( blend->vvar_table ) )
+        goto Exit;
+      table = blend->vvar_table;
+    }
+    else
+    {
+      if ( FT_NEW( blend->hvar_table ) )
+        goto Exit;
+      table = blend->hvar_table;
+    }
+
+    error = ft_var_load_item_variation_store(
+              face,
+              table_offset + store_offset,
+              &table->itemStore );
+    if ( error )
+      goto Exit;
+
+    if ( widthMap_offset )
+    {
+      error = ft_var_load_delta_set_index_mapping(
+                face,
+                table_offset + widthMap_offset,
+                &table->widthMap,
+                &table->itemStore );
+      if ( error )
+        goto Exit;
+    }
+
+    FT_TRACE2(( "loaded\n" ));
+    error = FT_Err_Ok;
+
+  Exit:
+    if ( !error )
+    {
+      if ( vertical )
+      {
+        blend->vvar_checked = TRUE;
+
+        /* FreeType doesn't provide functions to quickly retrieve    */
+        /* TSB, BSB, or VORG values; we thus don't have to implement */
+        /* support for those three item variation stores.            */
+
+        face->variation_support |= TT_FACE_FLAG_VAR_VADVANCE;
+      }
+      else
+      {
+        blend->hvar_checked = TRUE;
+
+        /* FreeType doesn't provide functions to quickly retrieve */
+        /* LSB or RSB values; we thus don't have to implement     */
+        /* support for those two item variation stores.           */
+
+        face->variation_support |= TT_FACE_FLAG_VAR_HADVANCE;
+      }
+    }
+
+    return error;
+  }
+
+
+  static FT_Int
+  ft_var_get_item_delta( TT_Face          face,
+                         GX_ItemVarStore  itemStore,
+                         FT_UInt          outerIndex,
+                         FT_UInt          innerIndex )
+  {
+    GX_ItemVarData  varData;
+    FT_Short*       deltaSet;
+
+    FT_UInt   master, j;
+    FT_Fixed  netAdjustment = 0;     /* accumulated adjustment */
+    FT_Fixed  scaledDelta;
+    FT_Fixed  delta;
+
+
+    /* See pseudo code from `Font Variations Overview' */
+    /* in the OpenType specification.                  */
+
+    varData  = &itemStore->varData[outerIndex];
+    deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex];
+
+    /* outer loop steps through master designs to be blended */
+    for ( master = 0; master < varData->regionIdxCount; master++ )
+    {
+      FT_Fixed  scalar      = FT_FIXED_ONE;
+      FT_UInt   regionIndex = varData->regionIndices[master];
+
+      GX_AxisCoords  axis = itemStore->varRegionList[regionIndex].axisList;
+
+
+      /* inner loop steps through axes in this region */
+      for ( j = 0; j < itemStore->axisCount; j++, axis++ )
+      {
+        FT_Fixed  axisScalar;
+
+
+        /* compute the scalar contribution of this axis; */
+        /* ignore invalid ranges                         */
+        if ( axis->startCoord > axis->peakCoord ||
+             axis->peakCoord > axis->endCoord   )
+          axisScalar = FT_FIXED_ONE;
+
+        else if ( axis->startCoord < 0 &&
+                  axis->endCoord > 0   &&
+                  axis->peakCoord != 0 )
+          axisScalar = FT_FIXED_ONE;
+
+        /* peak of 0 means ignore this axis */
+        else if ( axis->peakCoord == 0 )
+          axisScalar = FT_FIXED_ONE;
+
+        /* ignore this region if coords are out of range */
+        else if ( face->blend->normalizedcoords[j] < axis->startCoord ||
+                  face->blend->normalizedcoords[j] > axis->endCoord   )
+          axisScalar = 0;
+
+        /* calculate a proportional factor */
+        else
+        {
+          if ( face->blend->normalizedcoords[j] == axis->peakCoord )
+            axisScalar = FT_FIXED_ONE;
+          else if ( face->blend->normalizedcoords[j] < axis->peakCoord )
+            axisScalar =
+              FT_DivFix( face->blend->normalizedcoords[j] - axis->startCoord,
+                         axis->peakCoord - axis->startCoord );
+          else
+            axisScalar =
+              FT_DivFix( axis->endCoord - face->blend->normalizedcoords[j],
+                         axis->endCoord - axis->peakCoord );
+        }
+
+        /* take product of all the axis scalars */
+        scalar = FT_MulFix( scalar, axisScalar );
+
+      } /* per-axis loop */
+
+      /* get the scaled delta for this region */
+      delta       = FT_intToFixed( deltaSet[master] );
+      scaledDelta = FT_MulFix( scalar, delta );
+
+      /* accumulate the adjustments from each region */
+      netAdjustment = netAdjustment + scaledDelta;
+
+    } /* per-region loop */
+
+    return FT_fixedToInt( netAdjustment );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_hvadvance_adjust                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply `HVAR' advance width or `VVAR' advance height adjustment of  */
+  /*    a given glyph.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    gindex   :: The glyph index.                                       */
+  /*                                                                       */
+  /*    vertical :: If set, handle `VVAR' table.                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face     :: The font face.                                         */
+  /*                                                                       */
+  /*    adelta   :: Points to width or height value that gets modified.    */
+  /*                                                                       */
+  static FT_Error
+  tt_hvadvance_adjust( TT_Face  face,
+                       FT_UInt  gindex,
+                       FT_Int  *avalue,
+                       FT_Bool  vertical )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_UInt   innerIndex, outerIndex;
+    FT_Int    delta;
+
+    GX_HVVarTable  table;
+
+
+    if ( !face->doblend || !face->blend )
+      goto Exit;
+
+    if ( vertical )
+    {
+      if ( !face->blend->vvar_loaded )
+      {
+        /* initialize vvar table */
+        face->blend->vvar_error = ft_var_load_hvvar( face, 1 );
+      }
+
+      if ( !face->blend->vvar_checked )
+      {
+        error = face->blend->vvar_error;
+        goto Exit;
+      }
+
+      table = face->blend->vvar_table;
+    }
+    else
+    {
+      if ( !face->blend->hvar_loaded )
+      {
+        /* initialize hvar table */
+        face->blend->hvar_error = ft_var_load_hvvar( face, 0 );
+      }
+
+      if ( !face->blend->hvar_checked )
+      {
+        error = face->blend->hvar_error;
+        goto Exit;
+      }
+
+      table = face->blend->hvar_table;
+    }
+
+    /* advance width or height adjustments are always present in an */
+    /* `HVAR' or `VVAR' table; no need to test for this capability  */
+
+    if ( table->widthMap.innerIndex )
+    {
+      FT_UInt  idx = gindex;
+
+
+      if ( idx >= table->widthMap.mapCount )
+        idx = table->widthMap.mapCount - 1;
+
+      /* trust that HVAR parser has checked indices */
+      outerIndex = table->widthMap.outerIndex[idx];
+      innerIndex = table->widthMap.innerIndex[idx];
+    }
+    else
+    {
+      GX_ItemVarData  varData;
+
+
+      /* no widthMap data */
+      outerIndex = 0;
+      innerIndex = gindex;
+
+      varData = &table->itemStore.varData[outerIndex];
+      if ( gindex >= varData->itemCount )
+      {
+        FT_TRACE2(( "gindex %d out of range\n", gindex ));
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+    }
+
+    delta = ft_var_get_item_delta( face,
+                                   &table->itemStore,
+                                   outerIndex,
+                                   innerIndex );
+
+    FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
+                vertical ? "vertical height" : "horizontal width",
+                *avalue,
+                delta,
+                delta == 1 ? "" : "s",
+                vertical ? "VVAR" : "HVAR" ));
+
+    *avalue += delta;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_hadvance_adjust( TT_Face  face,
+                      FT_UInt  gindex,
+                      FT_Int  *avalue )
+  {
+    return tt_hvadvance_adjust( face, gindex, avalue, 0 );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_vadvance_adjust( TT_Face  face,
+                      FT_UInt  gindex,
+                      FT_Int  *avalue )
+  {
+    return tt_hvadvance_adjust( face, gindex, avalue, 1 );
+  }
+
+
+#define GX_VALUE_SIZE  8
+
+  /* all values are FT_Short or FT_UShort entities; */
+  /* we treat them consistently as FT_Short         */
+#define GX_VALUE_CASE( tag, dflt )      \
+          case MVAR_TAG_ ## tag :       \
+            p = (FT_Short*)&face->dflt; \
+            break
+
+#define GX_GASP_CASE( idx )                                       \
+          case MVAR_TAG_GASP_ ## idx :                            \
+            if ( idx < face->gasp.numRanges - 1 )                 \
+              p = (FT_Short*)&face->gasp.gaspRanges[idx].maxPPEM; \
+            else                                                  \
+              p = NULL;                                           \
+            break
+
+
+  static FT_Short*
+  ft_var_get_value_pointer( TT_Face   face,
+                            FT_ULong  mvar_tag )
+  {
+    FT_Short*  p;
+
+
+    switch ( mvar_tag )
+    {
+      GX_GASP_CASE( 0 );
+      GX_GASP_CASE( 1 );
+      GX_GASP_CASE( 2 );
+      GX_GASP_CASE( 3 );
+      GX_GASP_CASE( 4 );
+      GX_GASP_CASE( 5 );
+      GX_GASP_CASE( 6 );
+      GX_GASP_CASE( 7 );
+      GX_GASP_CASE( 8 );
+      GX_GASP_CASE( 9 );
+
+      GX_VALUE_CASE( CPHT, os2.sCapHeight );
+      GX_VALUE_CASE( HASC, os2.sTypoAscender );
+      GX_VALUE_CASE( HCLA, os2.usWinAscent );
+      GX_VALUE_CASE( HCLD, os2.usWinDescent );
+      GX_VALUE_CASE( HCOF, horizontal.caret_Offset );
+      GX_VALUE_CASE( HCRN, horizontal.caret_Slope_Run );
+      GX_VALUE_CASE( HCRS, horizontal.caret_Slope_Rise );
+      GX_VALUE_CASE( HDSC, os2.sTypoDescender );
+      GX_VALUE_CASE( HLGP, os2.sTypoLineGap );
+      GX_VALUE_CASE( SBXO, os2.ySubscriptXOffset);
+      GX_VALUE_CASE( SBXS, os2.ySubscriptXSize );
+      GX_VALUE_CASE( SBYO, os2.ySubscriptYOffset );
+      GX_VALUE_CASE( SBYS, os2.ySubscriptYSize );
+      GX_VALUE_CASE( SPXO, os2.ySuperscriptXOffset );
+      GX_VALUE_CASE( SPXS, os2.ySuperscriptXSize );
+      GX_VALUE_CASE( SPYO, os2.ySuperscriptYOffset );
+      GX_VALUE_CASE( SPYS, os2.ySuperscriptYSize );
+      GX_VALUE_CASE( STRO, os2.yStrikeoutPosition );
+      GX_VALUE_CASE( STRS, os2.yStrikeoutSize );
+      GX_VALUE_CASE( UNDO, postscript.underlinePosition );
+      GX_VALUE_CASE( UNDS, postscript.underlineThickness );
+      GX_VALUE_CASE( VASC, vertical.Ascender );
+      GX_VALUE_CASE( VCOF, vertical.caret_Offset );
+      GX_VALUE_CASE( VCRN, vertical.caret_Slope_Run );
+      GX_VALUE_CASE( VCRS, vertical.caret_Slope_Rise );
+      GX_VALUE_CASE( VDSC, vertical.Descender );
+      GX_VALUE_CASE( VLGP, vertical.Line_Gap );
+      GX_VALUE_CASE( XHGT, os2.sxHeight );
+
+    default:
+      /* ignore unknown tag */
+      p = NULL;
+    }
+
+    return p;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_mvar                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse the `MVAR' table.                                            */
+  /*                                                                       */
+  /*    Some memory may remain allocated on error; it is always freed in   */
+  /*    `tt_done_blend', however.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  static void
+  ft_var_load_mvar( TT_Face  face )
+  {
+    FT_Stream  stream = FT_FACE_STREAM( face );
+    FT_Memory  memory = stream->memory;
+
+    GX_Blend         blend = face->blend;
+    GX_ItemVarStore  itemStore;
+    GX_Value         value, limit;
+
+    FT_Error   error;
+    FT_UShort  majorVersion;
+    FT_ULong   table_len;
+    FT_ULong   table_offset;
+    FT_UShort  store_offset;
+    FT_ULong   records_offset;
+
+
+    FT_TRACE2(( "MVAR " ));
+
+    error = face->goto_table( face, TTAG_MVAR, stream, &table_len );
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+      return;
+    }
+
+    table_offset = FT_STREAM_POS();
+
+    /* skip minor version */
+    if ( FT_READ_USHORT( majorVersion ) ||
+         FT_STREAM_SKIP( 2 )            )
+      return;
+
+    if ( majorVersion != 1 )
+    {
+      FT_TRACE2(( "bad table version %d\n", majorVersion ));
+      return;
+    }
+
+    if ( FT_NEW( blend->mvar_table ) )
+      return;
+
+    /* skip reserved entry and value record size */
+    if ( FT_STREAM_SKIP( 4 )                             ||
+         FT_READ_USHORT( blend->mvar_table->valueCount ) ||
+         FT_READ_USHORT( store_offset )                  )
+      return;
+
+    records_offset = FT_STREAM_POS();
+
+    error = ft_var_load_item_variation_store(
+              face,
+              table_offset + store_offset,
+              &blend->mvar_table->itemStore );
+    if ( error )
+      return;
+
+    if ( FT_NEW_ARRAY( blend->mvar_table->values,
+                       blend->mvar_table->valueCount ) )
+      return;
+
+    if ( FT_STREAM_SEEK( records_offset )                                ||
+         FT_FRAME_ENTER( blend->mvar_table->valueCount * GX_VALUE_SIZE ) )
+      return;
+
+    value     = blend->mvar_table->values;
+    limit     = value + blend->mvar_table->valueCount;
+    itemStore = &blend->mvar_table->itemStore;
+
+    for ( ; value < limit; value++ )
+    {
+      value->tag        = FT_GET_ULONG();
+      value->outerIndex = FT_GET_USHORT();
+      value->innerIndex = FT_GET_USHORT();
+
+      if ( value->outerIndex >= itemStore->dataCount                  ||
+           value->innerIndex >= itemStore->varData[value->outerIndex]
+                                                  .itemCount          )
+      {
+        error = FT_THROW( Invalid_Table );
+        break;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+    if ( error )
+      return;
+
+    FT_TRACE2(( "loaded\n" ));
+
+    value = blend->mvar_table->values;
+    limit = value + blend->mvar_table->valueCount;
+
+    /* save original values of the data MVAR is going to modify */
+    for ( ; value < limit; value++ )
+    {
+      FT_Short*  p = ft_var_get_value_pointer( face, value->tag );
+
+
+      if ( p )
+        value->unmodified = *p;
+#ifdef FT_DEBUG_LEVEL_TRACE
+      else
+        FT_TRACE1(( "ft_var_load_mvar: Ignoring unknown tag `%c%c%c%c'\n",
+                    (FT_Char)( value->tag >> 24 ),
+                    (FT_Char)( value->tag >> 16 ),
+                    (FT_Char)( value->tag >> 8 ),
+                    (FT_Char)( value->tag ) ));
+#endif
+    }
+
+    face->variation_support |= TT_FACE_FLAG_VAR_MVAR;
+  }
+
+
+  static FT_Error
+  tt_size_reset_iterator( FT_ListNode  node,
+                          void*        user )
+  {
+    TT_Size  size = (TT_Size)node->data;
+
+    FT_UNUSED( user );
+
+
+    tt_size_reset( size, 1 );
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_apply_mvar                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply `MVAR' table adjustments.                                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_apply_mvar( TT_Face  face )
+  {
+    GX_Blend  blend = face->blend;
+    GX_Value  value, limit;
+
+
+    if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) )
+      return;
+
+    value = blend->mvar_table->values;
+    limit = value + blend->mvar_table->valueCount;
+
+    for ( ; value < limit; value++ )
+    {
+      FT_Short*  p = ft_var_get_value_pointer( face, value->tag );
+      FT_Int     delta;
+
+
+      delta = ft_var_get_item_delta( face,
+                                     &blend->mvar_table->itemStore,
+                                     value->outerIndex,
+                                     value->innerIndex );
+
+      if ( p )
+      {
+        FT_TRACE5(( "value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n",
+                    (FT_Char)( value->tag >> 24 ),
+                    (FT_Char)( value->tag >> 16 ),
+                    (FT_Char)( value->tag >> 8 ),
+                    (FT_Char)( value->tag ),
+                    value->unmodified,
+                    value->unmodified == 1 ? "" : "s",
+                    delta,
+                    delta == 1 ? "" : "s" ));
+
+        /* since we handle both signed and unsigned values as FT_Short, */
+        /* ensure proper overflow arithmetic                            */
+        *p = (FT_Short)( value->unmodified + (FT_Short)delta );
+      }
+    }
+
+    /* adjust all derived values */
+    {
+      FT_Face  root = &face->root;
+
+
+      if ( face->os2.version != 0xFFFFU )
+      {
+        if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+        {
+          root->ascender  = face->os2.sTypoAscender;
+          root->descender = face->os2.sTypoDescender;
+
+          root->height = root->ascender - root->descender +
+                         face->os2.sTypoLineGap;
+        }
+        else
+        {
+          root->ascender  =  (FT_Short)face->os2.usWinAscent;
+          root->descender = -(FT_Short)face->os2.usWinDescent;
+
+          root->height = root->ascender - root->descender;
+        }
+      }
+
+      root->underline_position  = face->postscript.underlinePosition -
+                                  face->postscript.underlineThickness / 2;
+      root->underline_thickness = face->postscript.underlineThickness;
+
+      /* iterate over all FT_Size objects and call `tt_size_reset' */
+      /* to propagate the metrics changes                          */
+      FT_List_Iterate( &root->sizes_list,
+                       tt_size_reset_iterator,
+                       NULL );
+    }
+  }
+
+
   typedef struct  GX_GVar_Head_
   {
     FT_Long    version;
@@ -434,10 +1448,10 @@
 
     FT_TRACE2(( "GVAR " ));
 
-    if ( ( error = face->goto_table( face,
-                                     TTAG_gvar,
-                                     stream,
-                                     &table_len ) ) != 0 )
+    if ( FT_SET_ERROR( face->goto_table( face,
+                                         TTAG_gvar,
+                                         stream,
+                                         &table_len ) ) )
     {
       FT_TRACE2(( "is missing\n" ));
       goto Exit;
@@ -447,10 +1461,6 @@
     if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
       goto Exit;
 
-    blend->tuplecount  = gvar_head.globalCoordCount;
-    blend->gv_glyphcnt = gvar_head.glyphCount;
-    offsetToData       = gvar_start + gvar_head.offsetToData;
-
     if ( gvar_head.version != 0x00010000L )
     {
       FT_TRACE1(( "bad table version\n" ));
@@ -458,8 +1468,6 @@
       goto Exit;
     }
 
-    FT_TRACE2(( "loaded\n" ));
-
     if ( gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
     {
       FT_TRACE1(( "ft_var_load_gvar: number of axes in `gvar' and `cvar'\n"
@@ -468,8 +1476,36 @@
       goto Exit;
     }
 
-    FT_TRACE5(( "gvar: there are %d shared coordinates:\n",
-                blend->tuplecount ));
+    /* rough sanity check, ignoring offsets */
+    if ( (FT_ULong)gvar_head.globalCoordCount * gvar_head.axisCount >
+           table_len / 2 )
+    {
+      FT_TRACE1(( "ft_var_load_gvar:"
+                  " invalid number of global coordinates\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    /* rough sanity check: offsets can be either 2 or 4 bytes */
+    if ( (FT_ULong)gvar_head.glyphCount *
+           ( ( gvar_head.flags & 1 ) ? 4 : 2 ) > table_len )
+    {
+      FT_TRACE1(( "ft_var_load_gvar: invalid number of glyphs\n" ));
+      error = FT_THROW( Invalid_Table );
+      goto Exit;
+    }
+
+    FT_TRACE2(( "loaded\n" ));
+
+    blend->gvar_size   = table_len;
+    blend->tuplecount  = gvar_head.globalCoordCount;
+    blend->gv_glyphcnt = gvar_head.glyphCount;
+    offsetToData       = gvar_start + gvar_head.offsetToData;
+
+    FT_TRACE5(( "gvar: there %s %d shared coordinate%s:\n",
+                blend->tuplecount == 1 ? "is" : "are",
+                blend->tuplecount,
+                blend->tuplecount == 1 ? "" : "s" ));
 
     if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
       goto Exit;
@@ -511,11 +1547,11 @@
       for ( i = 0; i < blend->tuplecount; i++ )
       {
         FT_TRACE5(( "  [ " ));
-        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; j++ )
+        for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ )
         {
           blend->tuplecoords[i * gvar_head.axisCount + j] =
-            FT_GET_SHORT() << 2;                /* convert to FT_Fixed */
-          FT_TRACE5(( "%.4f ",
+            FT_GET_SHORT() * 4;                 /* convert to FT_Fixed */
+          FT_TRACE5(( "%.5f ",
             blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 ));
         }
         FT_TRACE5(( "]\n" ));
@@ -571,8 +1607,13 @@
 
     for ( i = 0; i < blend->num_axis; i++ )
     {
-      FT_TRACE6(( "    axis coordinate %d (%.4f):\n",
+      FT_TRACE6(( "    axis coordinate %d (%.5f):\n",
                   i, blend->normalizedcoords[i] / 65536.0 ));
+      if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+        FT_TRACE6(( "      intermediate coordinates %d (%.5f, %.5f):\n",
+                    i,
+                    im_start_coords[i] / 65536.0,
+                    im_end_coords[i] / 65536.0 ));
 
       /* It's not clear why (for intermediate tuples) we don't need     */
       /* to check against start/end -- the documentation says we don't. */
@@ -585,71 +1626,257 @@
         continue;
       }
 
-      else if ( blend->normalizedcoords[i] == 0 )
+      if ( blend->normalizedcoords[i] == 0 )
       {
         FT_TRACE6(( "      axis coordinate is zero, stop\n" ));
         apply = 0;
         break;
       }
 
-      else if ( ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
-                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
+      if ( blend->normalizedcoords[i] == tuple_coords[i] )
       {
-        FT_TRACE6(( "      tuple coordinate value %.4f is exceeded, stop\n",
+        FT_TRACE6(( "      tuple coordinate value %.5f fits perfectly\n",
                     tuple_coords[i] / 65536.0 ));
-        apply = 0;
-        break;
+        /* `apply' does not change */
+        continue;
       }
 
-      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+      if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
       {
-        FT_TRACE6(( "      tuple coordinate value %.4f fits\n",
-                    tuple_coords[i] / 65536.0 ));
         /* not an intermediate tuple */
-        apply = FT_MulFix( apply,
-                           blend->normalizedcoords[i] > 0
-                             ? blend->normalizedcoords[i]
-                             : -blend->normalizedcoords[i] );
-      }
 
-      else if ( blend->normalizedcoords[i] < im_start_coords[i] ||
-                blend->normalizedcoords[i] > im_end_coords[i]   )
-      {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] is exceeded,"
-                    " stop\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
-        apply = 0;
-        break;
-      }
+        if ( blend->normalizedcoords[i] < FT_MIN( 0, tuple_coords[i] ) ||
+             blend->normalizedcoords[i] > FT_MAX( 0, tuple_coords[i] ) )
+        {
+          FT_TRACE6(( "      tuple coordinate value %.5f is exceeded, stop\n",
+                      tuple_coords[i] / 65536.0 ));
+          apply = 0;
+          break;
+        }
 
-      else if ( blend->normalizedcoords[i] < tuple_coords[i] )
-      {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] fits\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
+        FT_TRACE6(( "      tuple coordinate value %.5f fits\n",
+                    tuple_coords[i] / 65536.0 ));
         apply = FT_MulDiv( apply,
-                           blend->normalizedcoords[i] - im_start_coords[i],
-                           tuple_coords[i] - im_start_coords[i] );
+                           blend->normalizedcoords[i],
+                           tuple_coords[i] );
       }
-
       else
       {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] fits\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
-        apply = FT_MulDiv( apply,
-                           im_end_coords[i] - blend->normalizedcoords[i],
-                           im_end_coords[i] - tuple_coords[i] );
+        /* intermediate tuple */
+
+        if ( blend->normalizedcoords[i] < im_start_coords[i] ||
+             blend->normalizedcoords[i] > im_end_coords[i]   )
+        {
+          FT_TRACE6(( "      intermediate tuple range [%.5f;%.5f] is exceeded,"
+                      " stop\n",
+                      im_start_coords[i] / 65536.0,
+                      im_end_coords[i] / 65536.0 ));
+          apply = 0;
+          break;
+        }
+
+        else if ( blend->normalizedcoords[i] < tuple_coords[i] )
+        {
+          FT_TRACE6(( "      intermediate tuple range [%.5f;%.5f] fits\n",
+                      im_start_coords[i] / 65536.0,
+                      im_end_coords[i] / 65536.0 ));
+          apply = FT_MulDiv( apply,
+                             blend->normalizedcoords[i] - im_start_coords[i],
+                             tuple_coords[i] - im_start_coords[i] );
+        }
+
+        else
+        {
+          FT_TRACE6(( "      intermediate tuple range [%.5f;%.5f] fits\n",
+                      im_start_coords[i] / 65536.0,
+                      im_end_coords[i] / 65536.0 ));
+          apply = FT_MulDiv( apply,
+                             im_end_coords[i] - blend->normalizedcoords[i],
+                             im_end_coords[i] - tuple_coords[i] );
+        }
       }
     }
 
-    FT_TRACE6(( "    apply factor is %.4f\n", apply / 65536.0 ));
+    FT_TRACE6(( "    apply factor is %.5f\n", apply / 65536.0 ));
 
     return apply;
   }
 
 
+  /* convert from design coordinates to normalized coordinates */
+
+  static void
+  ft_var_to_normalized( TT_Face    face,
+                        FT_UInt    num_coords,
+                        FT_Fixed*  coords,
+                        FT_Fixed*  normalized )
+  {
+    GX_Blend        blend;
+    FT_MM_Var*      mmvar;
+    FT_UInt         i, j;
+    FT_Var_Axis*    a;
+    GX_AVarSegment  av;
+
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords > mmvar->num_axis )
+    {
+      FT_TRACE2(( "ft_var_to_normalized:"
+                  " only using first %d of %d coordinates\n",
+                  mmvar->num_axis, num_coords ));
+      num_coords = mmvar->num_axis;
+    }
+
+    /* Axis normalization is a two-stage process.  First we normalize */
+    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+    /* Then, if there's an `avar' table, we renormalize this range.   */
+
+    a = mmvar->axis;
+    for ( i = 0; i < num_coords; i++, a++ )
+    {
+      FT_Fixed  coord = coords[i];
+
+
+      FT_TRACE5(( "    %d: %.5f\n", i, coord / 65536.0 ));
+      if ( coord > a->maximum || coord < a->minimum )
+      {
+        FT_TRACE1((
+          "ft_var_to_normalized: design coordinate %.5f\n"
+          "                      is out of range [%.5f;%.5f]; clamping\n",
+          coord / 65536.0,
+          a->minimum / 65536.0,
+          a->maximum / 65536.0 ));
+
+        if ( coord > a->maximum )
+          coord = a->maximum;
+        else
+          coord = a->minimum;
+      }
+
+      if ( coord < a->def )
+        normalized[i] = -FT_DivFix( coord - a->def,
+                                    a->minimum - a->def );
+      else if ( coord > a->def )
+        normalized[i] = FT_DivFix( coord - a->def,
+                                   a->maximum - a->def );
+      else
+        normalized[i] = 0;
+    }
+
+    FT_TRACE5(( "\n" ));
+
+    for ( ; i < mmvar->num_axis; i++ )
+      normalized[i] = 0;
+
+    if ( blend->avar_segment )
+    {
+      FT_TRACE5(( "normalized design coordinates"
+                  " before applying `avar' data:\n" ));
+
+      av = blend->avar_segment;
+      for ( i = 0; i < mmvar->num_axis; i++, av++ )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
+        {
+          if ( normalized[i] < av->correspondence[j].fromCoord )
+          {
+            FT_TRACE5(( "  %.5f\n", normalized[i] / 65536.0 ));
+
+            normalized[i] =
+              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
+                         av->correspondence[j].toCoord -
+                           av->correspondence[j - 1].toCoord,
+                         av->correspondence[j].fromCoord -
+                           av->correspondence[j - 1].fromCoord ) +
+              av->correspondence[j - 1].toCoord;
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  /* convert from normalized coordinates to design coordinates */
+
+  static void
+  ft_var_to_design( TT_Face    face,
+                    FT_UInt    num_coords,
+                    FT_Fixed*  coords,
+                    FT_Fixed*  design )
+  {
+    GX_Blend      blend;
+    FT_MM_Var*    mmvar;
+    FT_Var_Axis*  a;
+
+    FT_UInt  i, j, nc;
+
+
+    blend = face->blend;
+
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
+    {
+      FT_TRACE2(( "ft_var_to_design:"
+                  " only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
+    }
+
+    for ( i = 0; i < nc; i++ )
+      design[i] = coords[i];
+
+    for ( ; i < num_coords; i++ )
+      design[i] = 0;
+
+    if ( blend->avar_segment )
+    {
+      GX_AVarSegment  av = blend->avar_segment;
+
+
+      FT_TRACE5(( "design coordinates"
+                  " after removing `avar' distortion:\n" ));
+
+      for ( i = 0; i < nc; i++, av++ )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
+        {
+          if ( design[i] < av->correspondence[j].toCoord )
+          {
+            design[i] =
+              FT_MulDiv( design[i] - av->correspondence[j - 1].toCoord,
+                         av->correspondence[j].fromCoord -
+                           av->correspondence[j - 1].fromCoord,
+                         av->correspondence[j].toCoord -
+                           av->correspondence[j - 1].toCoord ) +
+              av->correspondence[j - 1].fromCoord;
+
+            FT_TRACE5(( "  %.5f\n", design[i] / 65536.0 ));
+            break;
+          }
+        }
+      }
+    }
+
+    mmvar = blend->mmvar;
+    a     = mmvar->axis;
+
+    for ( i = 0; i < nc; i++, a++ )
+    {
+      if ( design[i] < 0 )
+        design[i] = a->def + FT_MulFix( design[i],
+                                        a->def - a->minimum );
+      else if ( design[i] > 0 )
+        design[i] = a->def + FT_MulFix( design[i],
+                                        a->maximum - a->def );
+      else
+        design[i] = a->def;
+    }
+  }
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -663,7 +1890,6 @@
   {
     FT_Long    version;
     FT_UShort  offsetToData;
-    FT_UShort  countSizePairs;
     FT_UShort  axisCount;
     FT_UShort  axisSize;
     FT_UShort  instanceCount;
@@ -691,14 +1917,16 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Check that the font's `fvar' table is valid, parse it, and return  */
-  /*    those data.                                                        */
+  /*    those data.  It also loads (and parses) the `MVAR' table, if       */
+  /*    possible.                                                          */
   /*                                                                       */
   /* <InOut>                                                               */
   /*    face   :: The font face.                                           */
   /*              TT_Get_MM_Var initializes the blend structure.           */
   /*                                                                       */
   /* <Output>                                                              */
-  /*    master :: The `fvar' data (must be freed by caller).               */
+  /*    master :: The `fvar' data (must be freed by caller).  Can be NULL, */
+  /*              which makes this function simply load MM support.        */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0 means success.                             */
@@ -707,18 +1935,33 @@
   TT_Get_MM_Var( TT_Face      face,
                  FT_MM_Var*  *master )
   {
-    FT_Stream            stream = face->root.stream;
-    FT_Memory            memory = face->root.memory;
+    FT_Stream            stream     = face->root.stream;
+    FT_Memory            memory     = face->root.memory;
     FT_ULong             table_len;
-    FT_Error             error  = FT_Err_Ok;
-    FT_ULong             fvar_start;
-    FT_Int               i, j;
+    FT_Error             error      = FT_Err_Ok;
+    FT_ULong             fvar_start = 0;
+    FT_UInt              i, j;
     FT_MM_Var*           mmvar = NULL;
     FT_Fixed*            next_coords;
+    FT_Fixed*            nsc;
     FT_String*           next_name;
     FT_Var_Axis*         a;
+    FT_Fixed*            c;
     FT_Var_Named_Style*  ns;
     GX_FVar_Head         fvar_head;
+    FT_Bool              usePsName  = 0;
+    FT_UInt              num_instances;
+    FT_UInt              num_axes;
+    FT_UShort*           axis_flags;
+
+    FT_Offset  mmvar_size;
+    FT_Offset  axis_flags_size;
+    FT_Offset  axis_size;
+    FT_Offset  namedstyle_size;
+    FT_Offset  next_coords_size;
+    FT_Offset  next_name_size;
+
+    FT_Bool  need_init;
 
     static const FT_Frame_Field  fvar_fields[] =
     {
@@ -727,13 +1970,13 @@
 #define FT_STRUCTURE  GX_FVar_Head
 
       FT_FRAME_START( 16 ),
-        FT_FRAME_LONG  ( version ),
-        FT_FRAME_USHORT( offsetToData ),
-        FT_FRAME_USHORT( countSizePairs ),
-        FT_FRAME_USHORT( axisCount ),
-        FT_FRAME_USHORT( axisSize ),
-        FT_FRAME_USHORT( instanceCount ),
-        FT_FRAME_USHORT( instanceSize ),
+        FT_FRAME_LONG      ( version ),
+        FT_FRAME_USHORT    ( offsetToData ),
+        FT_FRAME_SKIP_SHORT,
+        FT_FRAME_USHORT    ( axisCount ),
+        FT_FRAME_USHORT    ( axisSize ),
+        FT_FRAME_USHORT    ( instanceCount ),
+        FT_FRAME_USHORT    ( instanceSize ),
       FT_FRAME_END
     };
 
@@ -757,21 +2000,28 @@
     /* read the font data and set up the internal representation */
     /* if not already done                                       */
 
-    if ( face->blend == NULL )
+    need_init = !face->blend;
+
+    if ( need_init )
     {
       FT_TRACE2(( "FVAR " ));
 
       /* both `fvar' and `gvar' must be present */
-      if ( ( error = face->goto_table( face, TTAG_gvar,
-                                       stream, &table_len ) ) != 0 )
+      if ( FT_SET_ERROR( face->goto_table( face, TTAG_gvar,
+                                           stream, &table_len ) ) )
       {
-        FT_TRACE1(( "\n"
-                    "TT_Get_MM_Var: `gvar' table is missing\n" ));
-        goto Exit;
+        /* CFF2 is an alternate to gvar here */
+        if ( FT_SET_ERROR( face->goto_table( face, TTAG_CFF2,
+                                             stream, &table_len ) ) )
+        {
+          FT_TRACE1(( "\n"
+                      "TT_Get_MM_Var: `gvar' or `CFF2' table is missing\n" ));
+          goto Exit;
+        }
       }
 
-      if ( ( error = face->goto_table( face, TTAG_fvar,
-                                       stream, &table_len ) ) != 0 )
+      if ( FT_SET_ERROR( face->goto_table( face, TTAG_fvar,
+                                           stream, &table_len ) ) )
       {
         FT_TRACE1(( "is missing\n" ));
         goto Exit;
@@ -779,45 +2029,67 @@
 
       fvar_start = FT_STREAM_POS( );
 
+      /* the validity of the `fvar' header data was already checked */
+      /* in function `sfnt_init_face'                               */
       if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
         goto Exit;
 
-      if ( fvar_head.version != (FT_Long)0x00010000L                      ||
-#if 0
-           /* fonts like `JamRegular.ttf' have an incorrect value for */
-           /* `countSizePairs'; since value 2 is hard-coded in `fvar' */
-           /* version 1.0, we simply ignore it                        */
-           fvar_head.countSizePairs != 2                                  ||
-#endif
-           fvar_head.axisSize != 20                                       ||
-           /* axisCount limit implied by 16-bit instanceSize */
-           fvar_head.axisCount > 0x3FFE                                   ||
-           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||
-           /* instanceCount limit implied by limited range of name IDs */
-           fvar_head.instanceCount > 0x7EFF                               ||
-           fvar_head.offsetToData + fvar_head.axisCount * 20U +
-             fvar_head.instanceCount * fvar_head.instanceSize > table_len )
-      {
-        FT_TRACE1(( "\n"
-                    "TT_Get_MM_Var: invalid `fvar' header\n" ));
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
-      }
+      usePsName = FT_BOOL( fvar_head.instanceSize ==
+                           6 + 4 * fvar_head.axisCount );
 
       FT_TRACE2(( "loaded\n" ));
 
-      FT_TRACE5(( "number of GX style axes: %d\n", fvar_head.axisCount ));
+      FT_TRACE5(( "%d variation ax%s\n",
+                  fvar_head.axisCount,
+                  fvar_head.axisCount == 1 ? "is" : "es" ));
 
       if ( FT_NEW( face->blend ) )
         goto Exit;
 
-      /* cannot overflow 32-bit arithmetic because of limits above */
-      face->blend->mmvar_len =
-        sizeof ( FT_MM_Var ) +
-        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
-        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
-        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
-        5 * fvar_head.axisCount;
+      num_axes              = fvar_head.axisCount;
+      face->blend->num_axis = num_axes;
+    }
+    else
+      num_axes = face->blend->num_axis;
+
+    /* `num_instances' holds the number of all named instances, */
+    /* including the default instance which might be missing    */
+    /* in fvar's table of named instances                       */
+    num_instances = (FT_UInt)face->root.style_flags >> 16;
+
+    /* prepare storage area for MM data; this cannot overflow   */
+    /* 32-bit arithmetic because of the size limits used in the */
+    /* `fvar' table validity check in `sfnt_init_face'          */
+
+    /* the various `*_size' variables, which we also use as     */
+    /* offsets into the `mmlen' array, must be multiples of the */
+    /* pointer size (except the last one); without such an      */
+    /* alignment there might be runtime errors due to           */
+    /* misaligned addresses                                     */
+#undef  ALIGN_SIZE
+#define ALIGN_SIZE( n ) \
+          ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) )
+
+    mmvar_size       = ALIGN_SIZE( sizeof ( FT_MM_Var ) );
+    axis_flags_size  = ALIGN_SIZE( num_axes *
+                                   sizeof ( FT_UShort ) );
+    axis_size        = ALIGN_SIZE( num_axes *
+                                   sizeof ( FT_Var_Axis ) );
+    namedstyle_size  = ALIGN_SIZE( num_instances *
+                                   sizeof ( FT_Var_Named_Style ) );
+    next_coords_size = ALIGN_SIZE( num_instances *
+                                   num_axes *
+                                   sizeof ( FT_Fixed ) );
+    next_name_size   = num_axes * 5;
+
+    if ( need_init )
+    {
+      face->blend->mmvar_len = mmvar_size       +
+                               axis_flags_size  +
+                               axis_size        +
+                               namedstyle_size  +
+                               next_coords_size +
+                               next_name_size;
 
       if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
         goto Exit;
@@ -827,28 +2099,33 @@
       /* the data gets filled in later on                    */
 
       mmvar->num_axis =
-        fvar_head.axisCount;
+        num_axes;
       mmvar->num_designs =
         ~0U;                   /* meaningless in this context; each glyph */
                                /* may have a different number of designs  */
                                /* (or tuples, as called by Apple)         */
       mmvar->num_namedstyles =
-        fvar_head.instanceCount;
-      mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
-      mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] );
+        num_instances;
 
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[fvar_head.instanceCount] );
-      for ( i = 0; i < fvar_head.instanceCount; i++ )
+      /* alas, no public field in `FT_Var_Axis' for axis flags */
+      axis_flags =
+        (FT_UShort*)( (char*)mmvar + mmvar_size );
+      mmvar->axis =
+        (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size );
+      mmvar->namedstyle =
+        (FT_Var_Named_Style*)( (char*)mmvar->axis + axis_size );
+
+      next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle +
+                                 namedstyle_size );
+      for ( i = 0; i < num_instances; i++ )
       {
         mmvar->namedstyle[i].coords  = next_coords;
-        next_coords                 += fvar_head.axisCount;
+        next_coords                 += num_axes;
       }
 
-      next_name = (FT_String*)next_coords;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
+      next_name = (FT_String*)( (char*)mmvar->namedstyle +
+                                namedstyle_size + next_coords_size );
+      for ( i = 0; i < num_axes; i++ )
       {
         mmvar->axis[i].name  = next_name;
         next_name           += 5;
@@ -860,10 +2137,14 @@
         goto Exit;
 
       a = mmvar->axis;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
+      for ( i = 0; i < num_axes; i++ )
       {
         GX_FVar_Axis  axis_rec;
 
+#ifdef FT_DEBUG_LEVEL_TRACE
+        int  invalid = 0;
+#endif
+
 
         if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
           goto Exit;
@@ -879,36 +2160,194 @@
         a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );
         a->name[4] = '\0';
 
-        FT_TRACE5(( "  \"%s\": minimum=%.4f, default=%.4f, maximum=%.4f\n",
+        *axis_flags = axis_rec.flags;
+
+        if ( a->minimum > a->def ||
+             a->def > a->maximum )
+        {
+          a->minimum = a->def;
+          a->maximum = a->def;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          invalid = 1;
+#endif
+        }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( i == 0 )
+          FT_TRACE5(( "  idx   tag  "
+                   /* "  XXX  `XXXX'" */
+                      "    minimum     default     maximum   flags\n" ));
+                   /* "  XXXX.XXXXX  XXXX.XXXXX  XXXX.XXXXX  0xXXXX" */
+
+        FT_TRACE5(( "  %3d  `%s'"
+                    "  %10.5f  %10.5f  %10.5f  0x%04X%s\n",
+                    i,
                     a->name,
                     a->minimum / 65536.0,
                     a->def / 65536.0,
-                    a->maximum / 65536.0 ));
+                    a->maximum / 65536.0,
+                    *axis_flags,
+                    invalid ? " (invalid, disabled)" : "" ));
+#endif
 
         a++;
+        axis_flags++;
       }
 
       FT_TRACE5(( "\n" ));
 
-      ns = mmvar->namedstyle;
+      /* named instance coordinates are stored as design coordinates; */
+      /* we have to convert them to normalized coordinates also       */
+      if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords,
+                         num_axes * num_instances ) )
+        goto Exit;
+
+      if ( fvar_head.instanceCount && !face->blend->avar_loaded )
+      {
+        FT_ULong  offset = FT_STREAM_POS();
+
+
+        ft_var_load_avar( face );
+
+        if ( FT_STREAM_SEEK( offset ) )
+          goto Exit;
+      }
+
+      FT_TRACE5(( "%d instance%s\n",
+                  fvar_head.instanceCount,
+                  fvar_head.instanceCount == 1 ? "" : "s" ));
+
+      ns  = mmvar->namedstyle;
+      nsc = face->blend->normalized_stylecoords;
       for ( i = 0; i < fvar_head.instanceCount; i++, ns++ )
       {
-        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
+        /* PostScript names add 2 bytes to the instance record size */
+        if ( FT_FRAME_ENTER( ( usePsName ? 6L : 4L ) +
+                             4L * num_axes ) )
           goto Exit;
 
         ns->strid       =    FT_GET_USHORT();
         (void) /* flags = */ FT_GET_USHORT();
 
-        for ( j = 0; j < fvar_head.axisCount; j++ )
-          ns->coords[j] = FT_GET_LONG();
+        c = ns->coords;
+        for ( j = 0; j < num_axes; j++, c++ )
+          *c = FT_GET_LONG();
+
+        /* valid psid values are 6, [256;32767], and 0xFFFF */
+        if ( usePsName )
+          ns->psid = FT_GET_USHORT();
+        else
+          ns->psid = 0xFFFF;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        {
+          SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+          FT_String*  strname = NULL;
+          FT_String*  psname  = NULL;
+
+          FT_ULong  pos;
+
+
+          pos = FT_STREAM_POS();
+
+          if ( ns->strid != 0xFFFF )
+          {
+            (void)sfnt->get_name( face,
+                                  (FT_UShort)ns->strid,
+                                  &strname );
+            if ( strname && !ft_strcmp( strname, ".notdef" ) )
+              strname = NULL;
+          }
+
+          if ( ns->psid != 0xFFFF )
+          {
+            (void)sfnt->get_name( face,
+                                  (FT_UShort)ns->psid,
+                                  &psname );
+            if ( psname && !ft_strcmp( psname, ".notdef" ) )
+              psname = NULL;
+          }
+
+          (void)FT_STREAM_SEEK( pos );
+
+          FT_TRACE5(( "  instance %d (%s%s%s, %s%s%s)\n",
+                      i,
+                      strname ? "name: `" : "",
+                      strname ? strname : "unnamed",
+                      strname ? "'" : "",
+                      psname ? "PS name: `" : "",
+                      psname ? psname : "no PS name",
+                      psname ? "'" : "" ));
+
+          FT_FREE( strname );
+          FT_FREE( psname );
+        }
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        ft_var_to_normalized( face, num_axes, ns->coords, nsc );
+        nsc += num_axes;
 
         FT_FRAME_EXIT();
       }
+
+      if ( num_instances != fvar_head.instanceCount )
+      {
+        SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+        FT_Int   found, dummy1, dummy2;
+        FT_UInt  strid = ~0U;
+
+
+        /* the default instance is missing in array the   */
+        /* of named instances; try to synthesize an entry */
+        found = sfnt->get_name_id( face,
+                                   TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY,
+                                   &dummy1,
+                                   &dummy2 );
+        if ( found )
+          strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY;
+        else
+        {
+          found = sfnt->get_name_id( face,
+                                     TT_NAME_ID_FONT_SUBFAMILY,
+                                     &dummy1,
+                                     &dummy2 );
+          if ( found )
+            strid = TT_NAME_ID_FONT_SUBFAMILY;
+        }
+
+        if ( found )
+        {
+          found = sfnt->get_name_id( face,
+                                     TT_NAME_ID_PS_NAME,
+                                     &dummy1,
+                                     &dummy2 );
+          if ( found )
+          {
+            FT_TRACE5(( "TT_Get_MM_Var:"
+                        " Adding default instance to named instances\n" ));
+
+            ns = &mmvar->namedstyle[fvar_head.instanceCount];
+
+            ns->strid = strid;
+            ns->psid  = TT_NAME_ID_PS_NAME;
+
+            a = mmvar->axis;
+            c = ns->coords;
+            for ( j = 0; j < num_axes; j++, a++, c++ )
+              *c = a->def;
+          }
+        }
+      }
+
+      ft_var_load_mvar( face );
     }
 
     /* fill the output array if requested */
 
-    if ( master != NULL )
+    if ( master )
     {
       FT_UInt  n;
 
@@ -917,22 +2356,25 @@
         goto Exit;
       FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
 
+      axis_flags =
+        (FT_UShort*)( (char*)mmvar + mmvar_size );
       mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
+        (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size );
       mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] );
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] );
+        (FT_Var_Named_Style*)( (char*)mmvar->axis+ axis_size );
 
+      next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle +
+                                 namedstyle_size );
       for ( n = 0; n < mmvar->num_namedstyles; n++ )
       {
         mmvar->namedstyle[n].coords  = next_coords;
-        next_coords                 += mmvar->num_axis;
+        next_coords                 += num_axes;
       }
 
       a         = mmvar->axis;
-      next_name = (FT_String*)next_coords;
-      for ( n = 0; n < mmvar->num_axis; n++ )
+      next_name = (FT_String*)( (char*)mmvar->namedstyle +
+                                namedstyle_size + next_coords_size );
+      for ( n = 0; n < num_axes; n++ )
       {
         a->name = next_name;
 
@@ -958,6 +2400,196 @@
   }
 
 
+  static FT_Error
+  tt_set_mm_blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords,
+                   FT_Bool    set_design_coords )
+  {
+    FT_Error    error = FT_Err_Ok;
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+    FT_UInt     i;
+
+    FT_Bool     all_design_coords = FALSE;
+
+    FT_Memory   memory = face->root.memory;
+
+    enum
+    {
+      mcvt_retain,
+      mcvt_modify,
+      mcvt_load
+
+    } manageCvt;
+
+
+    face->doblend = FALSE;
+
+    if ( !face->blend )
+    {
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords > mmvar->num_axis )
+    {
+      FT_TRACE2(( "TT_Set_MM_Blend:"
+                  " only using first %d of %d coordinates\n",
+                  mmvar->num_axis, num_coords ));
+      num_coords = mmvar->num_axis;
+    }
+
+    FT_TRACE5(( "TT_Set_MM_Blend:\n"
+                "  normalized design coordinates:\n" ));
+
+    for ( i = 0; i < num_coords; i++ )
+    {
+      FT_TRACE5(( "    %.5f\n", coords[i] / 65536.0 ));
+      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
+      {
+        FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.5f\n"
+                    "                 is out of range [-1;1]\n",
+                    coords[i] / 65536.0 ));
+        error = FT_THROW( Invalid_Argument );
+        goto Exit;
+      }
+    }
+
+    FT_TRACE5(( "\n" ));
+
+    if ( !face->is_cff2 && !blend->glyphoffsets )
+      if ( FT_SET_ERROR( ft_var_load_gvar( face ) ) )
+        goto Exit;
+
+    if ( !blend->coords )
+    {
+      if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) )
+        goto Exit;
+
+      /* the first time we have to compute all design coordinates */
+      all_design_coords = TRUE;
+    }
+
+    if ( !blend->normalizedcoords )
+    {
+      if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) )
+        goto Exit;
+
+      manageCvt = mcvt_modify;
+
+      /* If we have not set the blend coordinates before this, then the  */
+      /* cvt table will still be what we read from the `cvt ' table and  */
+      /* we don't need to reload it.  We may need to change it though... */
+    }
+    else
+    {
+      FT_Bool    have_diff = 0;
+      FT_UInt    j;
+      FT_Fixed*  c;
+      FT_Fixed*  n;
+
+
+      manageCvt = mcvt_retain;
+
+      for ( i = 0; i < num_coords; i++ )
+      {
+        if ( blend->normalizedcoords[i] != coords[i] )
+        {
+          manageCvt = mcvt_load;
+          have_diff = 1;
+          break;
+        }
+      }
+
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) )
+      {
+        FT_UInt  idx = (FT_UInt)face->root.face_index >> 16;
+
+
+        c = blend->normalizedcoords + i;
+        n = blend->normalized_stylecoords + idx * mmvar->num_axis + i;
+        for ( j = i; j < mmvar->num_axis; j++, n++, c++ )
+          if ( *c != *n )
+            have_diff = 1;
+      }
+      else
+      {
+        c = blend->normalizedcoords + i;
+        for ( j = i; j < mmvar->num_axis; j++, c++ )
+          if ( *c != 0 )
+            have_diff = 1;
+      }
+
+      /* return value -1 indicates `no change' */
+      if ( !have_diff )
+        return -1;
+
+      for ( ; i < mmvar->num_axis; i++ )
+      {
+        if ( blend->normalizedcoords[i] != 0 )
+        {
+          manageCvt = mcvt_load;
+          break;
+        }
+      }
+
+      /* If we don't change the blend coords then we don't need to do  */
+      /* anything to the cvt table.  It will be correct.  Otherwise we */
+      /* no longer have the original cvt (it was modified when we set  */
+      /* the blend last time), so we must reload and then modify it.   */
+    }
+
+    blend->num_axis = mmvar->num_axis;
+    FT_MEM_COPY( blend->normalizedcoords,
+                 coords,
+                 num_coords * sizeof ( FT_Fixed ) );
+
+    if ( set_design_coords )
+      ft_var_to_design( face,
+                        all_design_coords ? blend->num_axis : num_coords,
+                        blend->normalizedcoords,
+                        blend->coords );
+
+    face->doblend = TRUE;
+
+    if ( face->cvt )
+    {
+      switch ( manageCvt )
+      {
+      case mcvt_load:
+        /* The cvt table has been loaded already; every time we change the */
+        /* blend we may need to reload and remodify the cvt table.         */
+        FT_FREE( face->cvt );
+        face->cvt = NULL;
+
+        error = tt_face_load_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_modify:
+        /* The original cvt table is in memory.  All we need to do is */
+        /* apply the `cvar' table (if any).                           */
+        error = tt_face_vary_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_retain:
+        /* The cvt table is correct for this set of coordinates. */
+        break;
+      }
+    }
+
+    /* enforce recomputation of the PostScript name; */
+    FT_FREE( face->postscript_name );
+    face->postscript_name = NULL;
+
+  Exit:
+    return error;
+  }
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -988,133 +2620,95 @@
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
   {
-    FT_Error    error = FT_Err_Ok;
-    GX_Blend    blend;
-    FT_MM_Var*  mmvar;
-    FT_UInt     i;
-    FT_Memory   memory = face->root.memory;
+    FT_Error  error;
 
-    enum
+
+    error = tt_set_mm_blend( face, num_coords, coords, 1 );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Get_MM_Blend                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the blend (normalized) coordinates for this instance of the    */
+  /*    font.                                                              */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The font.                                            */
+  /*                  Initialize the blend structure with `gvar' data.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of available coordinates.  If it is       */
+  /*                  larger than the number of axes, set the excess       */
+  /*                  values to 0.                                         */
+  /*                                                                       */
+  /*    coords     :: An array of `num_coords', each between [-1,1].       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Get_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    FT_Error  error = FT_Err_Ok;
+    GX_Blend  blend;
+    FT_UInt   i, nc;
+
+
+    if ( !face->blend )
     {
-      mcvt_retain,
-      mcvt_modify,
-      mcvt_load
-
-    } manageCvt;
-
-
-    face->doblend = FALSE;
-
-    if ( face->blend == NULL )
-    {
-      if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 )
-        goto Exit;
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
+        return error;
     }
 
     blend = face->blend;
-    mmvar = blend->mmvar;
 
-    if ( num_coords > mmvar->num_axis )
+    if ( !blend->coords )
     {
-      FT_TRACE2(( "TT_Set_MM_Blend: only using first %d of %d coordinates\n",
-                  mmvar->num_axis, num_coords ));
-      num_coords = mmvar->num_axis;
+      /* select default instance coordinates */
+      /* if no instance is selected yet      */
+      if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) )
+        return error;
     }
 
-    FT_TRACE5(( "normalized design coordinates:\n" ));
-
-    for ( i = 0; i < num_coords; i++ )
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
     {
-      FT_TRACE5(( "  %.4f\n", coords[i] / 65536.0 ));
-      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
-      {
-        FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.4f\n"
-                    "                 is out of range [-1;1]\n",
-                    coords[i] / 65536.0 ));
-        error = FT_THROW( Invalid_Argument );
-        goto Exit;
-      }
+      FT_TRACE2(( "TT_Get_MM_Blend:"
+                  " only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
     }
 
-    FT_TRACE5(( "\n" ));
-
-    if ( blend->glyphoffsets == NULL )
-      if ( ( error = ft_var_load_gvar( face ) ) != 0 )
-        goto Exit;
-
-    if ( blend->normalizedcoords == NULL )
+    if ( face->doblend )
     {
-      if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) )
-        goto Exit;
-
-      manageCvt = mcvt_modify;
-
-      /* If we have not set the blend coordinates before this, then the  */
-      /* cvt table will still be what we read from the `cvt ' table and  */
-      /* we don't need to reload it.  We may need to change it though... */
+      for ( i = 0; i < nc; i++ )
+        coords[i] = blend->normalizedcoords[i];
     }
     else
     {
-      manageCvt = mcvt_retain;
-
-      for ( i = 0; i < num_coords; i++ )
-      {
-        if ( blend->normalizedcoords[i] != coords[i] )
-        {
-          manageCvt = mcvt_load;
-          break;
-        }
-      }
-
-      for ( ; i < mmvar->num_axis; i++ )
-      {
-        if ( blend->normalizedcoords[i] != 0 )
-        {
-          manageCvt = mcvt_load;
-          break;
-        }
-      }
-
-      /* If we don't change the blend coords then we don't need to do  */
-      /* anything to the cvt table.  It will be correct.  Otherwise we */
-      /* no longer have the original cvt (it was modified when we set  */
-      /* the blend last time), so we must reload and then modify it.   */
+      for ( i = 0; i < nc; i++ )
+        coords[i] = 0;
     }
 
-    blend->num_axis = mmvar->num_axis;
-    FT_MEM_COPY( blend->normalizedcoords,
-                 coords,
-                 num_coords * sizeof ( FT_Fixed ) );
+    for ( ; i < num_coords; i++ )
+      coords[i] = 0;
 
-    face->doblend = TRUE;
-
-    if ( face->cvt != NULL )
-    {
-      switch ( manageCvt )
-      {
-      case mcvt_load:
-        /* The cvt table has been loaded already; every time we change the */
-        /* blend we may need to reload and remodify the cvt table.         */
-        FT_FREE( face->cvt );
-        face->cvt = NULL;
-
-        error = tt_face_load_cvt( face, face->root.stream );
-        break;
-
-      case mcvt_modify:
-        /* The original cvt table is in memory.  All we need to do is */
-        /* apply the `cvar' table (if any).                           */
-        error = tt_face_vary_cvt( face, face->root.stream );
-        break;
-
-      case mcvt_retain:
-        /* The cvt table is correct for this set of coordinates. */
-        break;
-      }
-    }
-
-  Exit:
-    return error;
+    return FT_Err_Ok;
   }
 
 
@@ -1148,19 +2742,22 @@
                      FT_UInt    num_coords,
                      FT_Fixed*  coords )
   {
-    FT_Error        error      = FT_Err_Ok;
-    FT_Fixed*       normalized = NULL;
-    GX_Blend        blend;
-    FT_MM_Var*      mmvar;
-    FT_UInt         i, j;
-    FT_Var_Axis*    a;
-    GX_AVarSegment  av;
-    FT_Memory       memory = face->root.memory;
+    FT_Error    error  = FT_Err_Ok;
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+    FT_UInt     i;
+    FT_Memory   memory = face->root.memory;
+
+    FT_Fixed*  c;
+    FT_Fixed*  n;
+    FT_Fixed*  normalized = NULL;
+
+    FT_Bool  have_diff = 0;
 
 
-    if ( face->blend == NULL )
+    if ( !face->blend )
     {
-      if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 )
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
         goto Exit;
     }
 
@@ -1175,75 +2772,81 @@
       num_coords = mmvar->num_axis;
     }
 
-    /* Axis normalization is a two stage process.  First we normalize */
-    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
-    /* Then, if there's an `avar' table, we renormalize this range.   */
-
-    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
-      goto Exit;
-
-    FT_TRACE5(( "design coordinates:\n" ));
-
-    a = mmvar->axis;
-    for ( i = 0; i < num_coords; i++, a++ )
+    if ( !blend->coords )
     {
-      FT_TRACE5(( "  %.4f\n", coords[i] / 65536.0 ));
-      if ( coords[i] > a->maximum || coords[i] < a->minimum )
-      {
-        FT_TRACE1(( "TT_Set_Var_Design: normalized design coordinate %.4f\n"
-                    "                   is out of range [%.4f;%.4f]\n",
-                    coords[i] / 65536.0,
-                    a->minimum / 65536.0,
-                    a->maximum / 65536.0 ));
-        error = FT_THROW( Invalid_Argument );
+      if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) )
         goto Exit;
-      }
-
-      if ( coords[i] < a->def )
-        normalized[i] = -FT_DivFix( coords[i] - a->def,
-                                    a->minimum - a->def );
-      else if ( a->maximum == a->def )
-        normalized[i] = 0;
-      else
-        normalized[i] = FT_DivFix( coords[i] - a->def,
-                                   a->maximum - a->def );
     }
 
-    FT_TRACE5(( "\n" ));
-
-    for ( ; i < mmvar->num_axis; i++ )
-      normalized[i] = 0;
-
-    if ( !blend->avar_checked )
-      ft_var_load_avar( face );
-
-    if ( blend->avar_segment != NULL )
+    c = blend->coords;
+    n = coords;
+    for ( i = 0; i < num_coords; i++, n++, c++ )
     {
-      FT_TRACE5(( "normalized design coordinates"
-                  " before applying `avar' data:\n" ));
-
-      av = blend->avar_segment;
-      for ( i = 0; i < mmvar->num_axis; i++, av++ )
+      if ( *c != *n )
       {
-        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
+        *c        = *n;
+        have_diff = 1;
+      }
+    }
+
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) )
+    {
+      FT_UInt              instance_index;
+      FT_Var_Named_Style*  named_style;
+
+
+      instance_index = (FT_UInt)face->root.face_index >> 16;
+      named_style    = mmvar->namedstyle + instance_index - 1;
+
+      n = named_style->coords + num_coords;
+      for ( ; i < mmvar->num_axis; i++, n++, c++ )
+      {
+        if ( *c != *n )
         {
-          FT_TRACE5(( "  %.4f\n", normalized[i] / 65536.0 ));
-          if ( normalized[i] < av->correspondence[j].fromCoord )
-          {
-            normalized[i] =
-              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
-                         av->correspondence[j].toCoord -
-                           av->correspondence[j - 1].toCoord,
-                         av->correspondence[j].fromCoord -
-                           av->correspondence[j - 1].fromCoord ) +
-              av->correspondence[j - 1].toCoord;
-            break;
-          }
+          *c        = *n;
+          have_diff = 1;
+        }
+      }
+    }
+    else
+    {
+      FT_Var_Axis*  a;
+
+
+      a = mmvar->axis + num_coords;
+      for ( ; i < mmvar->num_axis; i++, a++, c++ )
+      {
+        if ( *c != a->def )
+        {
+          *c        = a->def;
+          have_diff = 1;
         }
       }
     }
 
-    error = TT_Set_MM_Blend( face, mmvar->num_axis, normalized );
+    /* return value -1 indicates `no change';                      */
+    /* we can exit early if `normalizedcoords' is already computed */
+    if ( blend->normalizedcoords && !have_diff )
+      return -1;
+
+    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+      goto Exit;
+
+    if ( !face->blend->avar_loaded )
+      ft_var_load_avar( face );
+
+    FT_TRACE5(( "TT_Set_Var_Design:\n"
+                "  normalized design coordinates:\n" ));
+    ft_var_to_normalized( face, num_coords, blend->coords, normalized );
+
+    error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
 
   Exit:
     FT_FREE( normalized );
@@ -1252,6 +2855,165 @@
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Get_Var_Design                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the design coordinates of the currently selected interpolated  */
+  /*    font.                                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /*    num_coords :: The number of design coordinates to retrieve.  If it */
+  /*                  is larger than the number of axes, set the excess    */
+  /*                  values to~0.                                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    coords     :: The design coordinates array.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Get_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+    FT_Error  error = FT_Err_Ok;
+    GX_Blend  blend;
+    FT_UInt   i, nc;
+
+
+    if ( !face->blend )
+    {
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
+        return error;
+    }
+
+    blend = face->blend;
+
+    if ( !blend->coords )
+    {
+      /* select default instance coordinates */
+      /* if no instance is selected yet      */
+      if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) )
+        return error;
+    }
+
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
+    {
+      FT_TRACE2(( "TT_Get_Var_Design:"
+                  " only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
+    }
+
+    if ( face->doblend )
+    {
+      for ( i = 0; i < nc; i++ )
+        coords[i] = blend->coords[i];
+    }
+    else
+    {
+      for ( i = 0; i < nc; i++ )
+        coords[i] = 0;
+    }
+
+    for ( ; i < num_coords; i++ )
+      coords[i] = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_Named_Instance                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the given named instance, also resetting any further           */
+  /*    variation.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face           :: A handle to the source face.                     */
+  /*                                                                       */
+  /*    instance_index :: The instance index, starting with value 1.       */
+  /*                      Value 0 indicates to not use an instance.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_Named_Instance( TT_Face  face,
+                         FT_UInt  instance_index )
+  {
+    FT_Error    error = FT_ERR( Invalid_Argument );
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+
+    FT_UInt  num_instances;
+
+
+    if ( !face->blend )
+    {
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    num_instances = (FT_UInt)face->root.style_flags >> 16;
+
+    /* `instance_index' starts with value 1, thus `>' */
+    if ( instance_index > num_instances )
+      goto Exit;
+
+    if ( instance_index > 0 && mmvar->namedstyle )
+    {
+      FT_Memory     memory = face->root.memory;
+      SFNT_Service  sfnt   = (SFNT_Service)face->sfnt;
+
+      FT_Var_Named_Style*  named_style;
+      FT_String*           style_name;
+
+
+      named_style = mmvar->namedstyle + instance_index - 1;
+
+      error = sfnt->get_name( face,
+                              (FT_UShort)named_style->strid,
+                              &style_name );
+      if ( error )
+        goto Exit;
+
+      /* set (or replace) style name */
+      FT_FREE( face->root.style_name );
+      face->root.style_name = style_name;
+
+      /* finally, select the named instance */
+      error = TT_Set_Var_Design( face,
+                                 mmvar->num_axis,
+                                 named_style->coords );
+      if ( error )
+        goto Exit;
+    }
+    else
+      error = TT_Set_Var_Design( face, 0, NULL );
+
+    face->root.face_index  = ( instance_index << 16 )             |
+                             ( face->root.face_index & 0xFFFFL );
+    face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
   /*****                     GX VAR PARSING ROUTINES                   *****/
@@ -1297,14 +3059,16 @@
     FT_Fixed*   im_start_coords = NULL;
     FT_Fixed*   im_end_coords   = NULL;
     GX_Blend    blend           = face->blend;
-    FT_UInt     point_count;
-    FT_UShort*  localpoints;
+    FT_UInt     point_count, spoint_count = 0;
+    FT_UShort*  sharedpoints = NULL;
+    FT_UShort*  localpoints  = NULL;
+    FT_UShort*  points;
     FT_Short*   deltas;
 
 
     FT_TRACE2(( "CVAR " ));
 
-    if ( blend == NULL )
+    if ( !blend )
     {
       FT_TRACE2(( "\n"
                   "tt_face_vary_cvt: no blend specified\n" ));
@@ -1312,7 +3076,7 @@
       goto Exit;
     }
 
-    if ( face->cvt == NULL )
+    if ( !face->cvt )
     {
       FT_TRACE2(( "\n"
                   "tt_face_vary_cvt: no `cvt ' table\n" ));
@@ -1352,13 +3116,39 @@
       goto FExit;
 
     tupleCount   = FT_GET_USHORT();
-    offsetToData = table_start + FT_GET_USHORT();
+    offsetToData = FT_GET_USHORT();
 
-    /* The documentation implies there are flags packed into the        */
-    /* tuplecount, but John Jenkins says that shared points don't apply */
-    /* to `cvar', and no other flags are defined.                       */
+    /* rough sanity test */
+    if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 >
+           table_len )
+    {
+      FT_TRACE2(( "tt_face_vary_cvt:"
+                  " invalid CVT variation array header\n" ));
 
-    FT_TRACE5(( "cvar: there are %d tuples:\n", tupleCount ));
+      error = FT_THROW( Invalid_Table );
+      goto FExit;
+    }
+
+    offsetToData += table_start;
+
+    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+    {
+      here = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      sharedpoints = ft_var_readpackedpoints( stream,
+                                              table_len,
+                                              &spoint_count );
+      offsetToData = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+    FT_TRACE5(( "cvar: there %s %d tuple%s:\n",
+                ( tupleCount & 0xFFF ) == 1 ? "is" : "are",
+                tupleCount & 0xFFF,
+                ( tupleCount & 0xFFF ) == 1 ? "" : "s" ));
 
     for ( i = 0; i < ( tupleCount & 0xFFF ); i++ )
     {
@@ -1372,33 +3162,32 @@
       tupleDataSize = FT_GET_USHORT();
       tupleIndex    = FT_GET_USHORT();
 
-      /* There is no provision here for a global tuple coordinate section, */
-      /* so John says.  There are no tuple indices, just embedded tuples.  */
-
       if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
       {
         for ( j = 0; j < blend->num_axis; j++ )
-          tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from        */
+          tuple_coords[j] = FT_GET_SHORT() * 4;  /* convert from        */
                                                  /* short frac to fixed */
       }
-      else
+      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
       {
-        /* skip this tuple; it makes no sense */
+        FT_TRACE2(( "tt_face_vary_cvt:"
+                    " invalid tuple index\n" ));
 
-        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
-          for ( j = 0; j < 2 * blend->num_axis; j++ )
-            (void)FT_GET_SHORT();
-
-        offsetToData += tupleDataSize;
-        continue;
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
       }
+      else
+        FT_MEM_COPY(
+          tuple_coords,
+          &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis],
+          blend->num_axis * sizeof ( FT_Fixed ) );
 
       if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
       {
         for ( j = 0; j < blend->num_axis; j++ )
-          im_start_coords[j] = FT_GET_SHORT() << 2;
+          im_start_coords[j] = FT_GET_SHORT() * 4;
         for ( j = 0; j < blend->num_axis; j++ )
-          im_end_coords[j] = FT_GET_SHORT() << 2;
+          im_end_coords[j] = FT_GET_SHORT() * 4;
       }
 
       apply = ft_var_apply_tuple( blend,
@@ -1406,11 +3195,8 @@
                                   tuple_coords,
                                   im_start_coords,
                                   im_end_coords );
-      if ( /* tuple isn't active for our blend */
-           apply == 0                                    ||
-           /* global points not allowed,           */
-           /* if they aren't local, makes no sense */
-           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
+
+      if ( apply == 0 )              /* tuple isn't active for our blend */
       {
         offsetToData += tupleDataSize;
         continue;
@@ -1420,11 +3206,27 @@
 
       FT_Stream_SeekSet( stream, offsetToData );
 
-      localpoints = ft_var_readpackedpoints( stream, &point_count );
-      deltas      = ft_var_readpackeddeltas( stream,
-                                             point_count == 0 ? face->cvt_size
-                                                              : point_count );
-      if ( localpoints == NULL || deltas == NULL )
+      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+      {
+        localpoints = ft_var_readpackedpoints( stream,
+                                               table_len,
+                                               &point_count );
+        points      = localpoints;
+      }
+      else
+      {
+        points      = sharedpoints;
+        point_count = spoint_count;
+      }
+
+      deltas = ft_var_readpackeddeltas( stream,
+                                        table_len,
+                                        point_count == 0 ? face->cvt_size
+                                                         : point_count );
+
+      if ( !points                                                        ||
+           !deltas                                                        ||
+           ( localpoints == ALL_POINTS && point_count != face->cvt_size ) )
         ; /* failure, ignore it */
 
       else if ( localpoints == ALL_POINTS )
@@ -1472,10 +3274,15 @@
 
         for ( j = 0; j < point_count; j++ )
         {
-          int      pindex   = localpoints[j];
-          FT_Long  orig_cvt = face->cvt[pindex];
+          int      pindex;
+          FT_Long  orig_cvt;
 
 
+          pindex = points[j];
+          if ( (FT_ULong)pindex >= face->cvt_size )
+            continue;
+
+          orig_cvt          = face->cvt[pindex];
           face->cvt[pindex] = (FT_Short)( orig_cvt +
                                           FT_MulFix( deltas[j], apply ) );
 
@@ -1510,6 +3317,8 @@
     FT_FRAME_EXIT();
 
   Exit:
+    if ( sharedpoints != ALL_POINTS )
+      FT_FREE( sharedpoints );
     FT_FREE( tuple_coords );
     FT_FREE( im_start_coords );
     FT_FREE( im_end_coords );
@@ -1598,25 +3407,12 @@
       d1   = out1 - in1;
       d2   = out2 - in2;
 
-      if ( out1 == out2 || in1 == in2 )
+      /* If the reference points have the same coordinate but different */
+      /* delta, inferred delta is zero.  Otherwise interpolate.         */
+      if ( in1 != in2 || out1 == out2 )
       {
-        for ( p = p1; p <= p2; p++ )
-        {
-          out = in_points[p].x;
-
-          if ( out <= in1 )
-            out += d1;
-          else if ( out >= in2 )
-            out += d2;
-          else
-            out = out1;
-
-          out_points[p].x = out;
-        }
-      }
-      else
-      {
-        FT_Fixed  scale = FT_DivFix( out2 - out1, in2 - in1 );
+        FT_Fixed  scale = in1 != in2 ? FT_DivFix( out2 - out1, in2 - in1 )
+                                     : 0;
 
 
         for ( p = p1; p <= p2; p++ )
@@ -1643,19 +3439,18 @@
   /* modeled after `Ins_IUP */
 
   static void
-  tt_handle_deltas( FT_Outline*  outline,
-                    FT_Vector*   in_points,
-                    FT_Bool*     has_delta )
+  tt_interpolate_deltas( FT_Outline*  outline,
+                         FT_Vector*   out_points,
+                         FT_Vector*   in_points,
+                         FT_Bool*     has_delta )
   {
-    FT_Vector*  out_points;
+    FT_Int  first_point;
+    FT_Int  end_point;
 
-    FT_UInt  first_point;
-    FT_UInt  end_point;
+    FT_Int  first_delta;
+    FT_Int  cur_delta;
 
-    FT_UInt  first_delta;
-    FT_UInt  cur_delta;
-
-    FT_UInt   point;
+    FT_Int    point;
     FT_Short  contour;
 
 
@@ -1663,8 +3458,6 @@
     if ( !outline->n_contours )
       return;
 
-    out_points = outline->points;
-
     contour = 0;
     point   = 0;
 
@@ -1768,6 +3561,7 @@
     GX_Blend    blend  = face->blend;
 
     FT_Vector*  points_org = NULL;
+    FT_Vector*  points_out = NULL;
     FT_Bool*    has_delta  = NULL;
 
     FT_Error    error;
@@ -1786,7 +3580,7 @@
     FT_Short    *deltas_x, *deltas_y;
 
 
-    if ( !face->doblend || blend == NULL )
+    if ( !face->doblend || !blend )
       return FT_THROW( Invalid_Argument );
 
     if ( glyph_index >= blend->gv_glyphcnt      ||
@@ -1799,6 +3593,7 @@
     }
 
     if ( FT_NEW_ARRAY( points_org, n_points ) ||
+         FT_NEW_ARRAY( points_out, n_points ) ||
          FT_NEW_ARRAY( has_delta, n_points )  )
       goto Fail1;
 
@@ -1810,7 +3605,6 @@
     glyph_start = FT_Stream_FTell( stream );
 
     /* each set of glyph variation data is formatted similarly to `cvar' */
-    /* (except we get shared points and global tuples)                   */
 
     if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
          FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
@@ -1818,7 +3612,20 @@
       goto Fail2;
 
     tupleCount   = FT_GET_USHORT();
-    offsetToData = glyph_start + FT_GET_USHORT();
+    offsetToData = FT_GET_USHORT();
+
+    /* rough sanity test */
+    if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 >
+           blend->gvar_size )
+    {
+      FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+                  " invalid glyph variation array header\n" ));
+
+      error = FT_THROW( Invalid_Table );
+      goto Fail2;
+    }
+
+    offsetToData += glyph_start;
 
     if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
     {
@@ -1826,13 +3633,21 @@
 
       FT_Stream_SeekSet( stream, offsetToData );
 
-      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
+      sharedpoints = ft_var_readpackedpoints( stream,
+                                              blend->gvar_size,
+                                              &spoint_count );
       offsetToData = FT_Stream_FTell( stream );
 
       FT_Stream_SeekSet( stream, here );
     }
 
-    FT_TRACE5(( "gvar: there are %d tuples:\n", tupleCount ));
+    FT_TRACE5(( "gvar: there %s %d tuple%s:\n",
+                ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
+                tupleCount & GX_TC_TUPLE_COUNT_MASK,
+                ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
+
+    for ( j = 0; j < n_points; j++ )
+      points_org[j] = outline->points[j];
 
     for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ )
     {
@@ -1849,11 +3664,14 @@
       if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
       {
         for ( j = 0; j < blend->num_axis; j++ )
-          tuple_coords[j] = FT_GET_SHORT() << 2;  /* convert from        */
+          tuple_coords[j] = FT_GET_SHORT() * 4;   /* convert from        */
                                                   /* short frac to fixed */
       }
       else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
       {
+        FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
+                    " invalid tuple index\n" ));
+
         error = FT_THROW( Invalid_Table );
         goto Fail2;
       }
@@ -1866,9 +3684,9 @@
       if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
       {
         for ( j = 0; j < blend->num_axis; j++ )
-          im_start_coords[j] = FT_GET_SHORT() << 2;
+          im_start_coords[j] = FT_GET_SHORT() * 4;
         for ( j = 0; j < blend->num_axis; j++ )
-          im_end_coords[j] = FT_GET_SHORT() << 2;
+          im_end_coords[j] = FT_GET_SHORT() * 4;
       }
 
       apply = ft_var_apply_tuple( blend,
@@ -1885,11 +3703,13 @@
 
       here = FT_Stream_FTell( stream );
 
+      FT_Stream_SeekSet( stream, offsetToData );
+
       if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
       {
-        FT_Stream_SeekSet( stream, offsetToData );
-
-        localpoints = ft_var_readpackedpoints( stream, &point_count );
+        localpoints = ft_var_readpackedpoints( stream,
+                                               blend->gvar_size,
+                                               &point_count );
         points      = localpoints;
       }
       else
@@ -1899,13 +3719,15 @@
       }
 
       deltas_x = ft_var_readpackeddeltas( stream,
+                                          blend->gvar_size,
                                           point_count == 0 ? n_points
                                                            : point_count );
       deltas_y = ft_var_readpackeddeltas( stream,
+                                          blend->gvar_size,
                                           point_count == 0 ? n_points
                                                            : point_count );
 
-      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
+      if ( !points || !deltas_y || !deltas_x )
         ; /* failure, ignore it */
 
       else if ( points == ALL_POINTS )
@@ -1920,22 +3742,48 @@
         /* this means that there are deltas for every point in the glyph */
         for ( j = 0; j < n_points; j++ )
         {
-#ifdef FT_DEBUG_LEVEL_TRACE
-          FT_Vector  point_org = outline->points[j];
-#endif
+          FT_Pos  delta_x = FT_MulFix( deltas_x[j], apply );
+          FT_Pos  delta_y = FT_MulFix( deltas_y[j], apply );
 
 
-          outline->points[j].x += FT_MulFix( deltas_x[j], apply );
-          outline->points[j].y += FT_MulFix( deltas_y[j], apply );
+          if ( j < n_points - 4 )
+          {
+            outline->points[j].x += delta_x;
+            outline->points[j].y += delta_y;
+          }
+          else
+          {
+            /* To avoid double adjustment of advance width or height, */
+            /* adjust phantom points only if there is no HVAR or VVAR */
+            /* support, respectively.                                 */
+            if ( j == ( n_points - 4 )        &&
+                 !( face->variation_support &
+                    TT_FACE_FLAG_VAR_LSB    ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 3 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_HADVANCE ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 2 )        &&
+                      !( face->variation_support &
+                         TT_FACE_FLAG_VAR_TSB    ) )
+              outline->points[j].y += delta_y;
+
+            else if ( j == ( n_points - 1 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_VADVANCE ) )
+              outline->points[j].y += delta_y;
+          }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
-          if ( ( point_org.x != outline->points[j].x ) ||
-               ( point_org.y != outline->points[j].y ) )
+          if ( delta_x || delta_y )
           {
             FT_TRACE7(( "      %d: (%d, %d) -> (%d, %d)\n",
                         j,
-                        point_org.x,
-                        point_org.y,
+                        outline->points[j].x - delta_x,
+                        outline->points[j].y - delta_y,
                         outline->points[j].x,
                         outline->points[j].y ));
             count++;
@@ -1960,13 +3808,13 @@
         /* IUP bytecode instruction                                 */
         for ( j = 0; j < n_points; j++ )
         {
-          points_org[j] = outline->points[j];
           has_delta[j]  = FALSE;
+          points_out[j] = points_org[j];
         }
 
         for ( j = 0; j < point_count; j++ )
         {
-          FT_UShort  idx = localpoints[j];
+          FT_UShort  idx = points[j];
 
 
           if ( idx >= n_points )
@@ -1974,34 +3822,71 @@
 
           has_delta[idx] = TRUE;
 
-          outline->points[idx].x += FT_MulFix( deltas_x[j], apply );
-          outline->points[idx].y += FT_MulFix( deltas_y[j], apply );
+          points_out[idx].x += FT_MulFix( deltas_x[j], apply );
+          points_out[idx].y += FT_MulFix( deltas_y[j], apply );
         }
 
         /* no need to handle phantom points here,      */
         /* since solitary points can't be interpolated */
-        tt_handle_deltas( outline,
-                          points_org,
-                          has_delta );
+        tt_interpolate_deltas( outline,
+                               points_out,
+                               points_org,
+                               has_delta );
 
-#ifdef FT_DEBUG_LEVEL_TRACE
         FT_TRACE7(( "    point deltas:\n" ));
 
-        for ( j = 0; j < n_points; j++)
+        for ( j = 0; j < n_points; j++ )
         {
-          if ( ( points_org[j].x != outline->points[j].x ) ||
-               ( points_org[j].y != outline->points[j].y ) )
+          FT_Pos  delta_x = points_out[j].x - points_org[j].x;
+          FT_Pos  delta_y = points_out[j].y - points_org[j].y;
+
+
+          if ( j < n_points - 4 )
+          {
+            outline->points[j].x += delta_x;
+            outline->points[j].y += delta_y;
+          }
+          else
+          {
+            /* To avoid double adjustment of advance width or height, */
+            /* adjust phantom points only if there is no HVAR or VVAR */
+            /* support, respectively.                                 */
+            if ( j == ( n_points - 4 )        &&
+                 !( face->variation_support &
+                    TT_FACE_FLAG_VAR_LSB    ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 3 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_HADVANCE ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 2 )        &&
+                      !( face->variation_support &
+                         TT_FACE_FLAG_VAR_TSB    ) )
+              outline->points[j].y += delta_y;
+
+            else if ( j == ( n_points - 1 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_VADVANCE ) )
+              outline->points[j].y += delta_y;
+          }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( delta_x || delta_y )
           {
             FT_TRACE7(( "      %d: (%d, %d) -> (%d, %d)\n",
                         j,
-                        points_org[j].x,
-                        points_org[j].y,
+                        outline->points[j].x - delta_x,
+                        outline->points[j].y - delta_y,
                         outline->points[j].x,
                         outline->points[j].y ));
             count++;
           }
+#endif
         }
 
+#ifdef FT_DEBUG_LEVEL_TRACE
         if ( !count )
           FT_TRACE7(( "      none\n" ));
 #endif
@@ -2020,6 +3905,8 @@
     FT_TRACE5(( "\n" ));
 
   Fail2:
+    if ( sharedpoints != ALL_POINTS )
+      FT_FREE( sharedpoints );
     FT_FREE( tuple_coords );
     FT_FREE( im_start_coords );
     FT_FREE( im_end_coords );
@@ -2028,6 +3915,7 @@
 
   Fail1:
     FT_FREE( points_org );
+    FT_FREE( points_out );
     FT_FREE( has_delta );
 
     return error;
@@ -2037,37 +3925,150 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
+  /*    tt_get_var_blend                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An extended internal version of `TT_Get_MM_Blend' that returns     */
+  /*    pointers instead of copying data, without any initialization of    */
+  /*    the MM machinery in case it isn't loaded yet.                      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_get_var_blend( TT_Face      face,
+                    FT_UInt     *num_coords,
+                    FT_Fixed*   *coords,
+                    FT_Fixed*   *normalizedcoords,
+                    FT_MM_Var*  *mm_var )
+  {
+    if ( face->blend )
+    {
+      if ( num_coords )
+        *num_coords       = face->blend->num_axis;
+      if ( coords )
+        *coords           = face->blend->coords;
+      if ( normalizedcoords )
+        *normalizedcoords = face->blend->normalizedcoords;
+      if ( mm_var )
+        *mm_var           = face->blend->mmvar;
+    }
+    else
+    {
+      if ( num_coords )
+        *num_coords = 0;
+      if ( coords )
+        *coords     = NULL;
+      if ( mm_var )
+        *mm_var     = NULL;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  static void
+  ft_var_done_item_variation_store( TT_Face          face,
+                                    GX_ItemVarStore  itemStore )
+  {
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+    FT_UInt    i;
+
+
+    if ( itemStore->varData )
+    {
+      for ( i = 0; i < itemStore->dataCount; i++ )
+      {
+        FT_FREE( itemStore->varData[i].regionIndices );
+        FT_FREE( itemStore->varData[i].deltaSet );
+      }
+
+      FT_FREE( itemStore->varData );
+    }
+
+    if ( itemStore->varRegionList )
+    {
+      for ( i = 0; i < itemStore->regionCount; i++ )
+        FT_FREE( itemStore->varRegionList[i].axisList );
+
+      FT_FREE( itemStore->varRegionList );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
   /*    tt_done_blend                                                      */
   /*                                                                       */
   /* <Description>                                                         */
   /*    Free the blend internal data structure.                            */
   /*                                                                       */
   FT_LOCAL_DEF( void )
-  tt_done_blend( FT_Memory  memory,
-                 GX_Blend   blend )
+  tt_done_blend( TT_Face  face )
   {
-    if ( blend != NULL )
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+    GX_Blend   blend  = face->blend;
+
+
+    if ( blend )
     {
-      FT_UInt  i;
+      FT_UInt  i, num_axes;
 
 
+      /* blend->num_axis might not be set up yet */
+      num_axes = blend->mmvar->num_axis;
+
+      FT_FREE( blend->coords );
       FT_FREE( blend->normalizedcoords );
+      FT_FREE( blend->normalized_stylecoords );
       FT_FREE( blend->mmvar );
 
-      if ( blend->avar_segment != NULL )
+      if ( blend->avar_segment )
       {
-        for ( i = 0; i < blend->num_axis; i++ )
+        for ( i = 0; i < num_axes; i++ )
           FT_FREE( blend->avar_segment[i].correspondence );
         FT_FREE( blend->avar_segment );
       }
 
+      if ( blend->hvar_table )
+      {
+        ft_var_done_item_variation_store( face,
+                                          &blend->hvar_table->itemStore );
+
+        FT_FREE( blend->hvar_table->widthMap.innerIndex );
+        FT_FREE( blend->hvar_table->widthMap.outerIndex );
+        FT_FREE( blend->hvar_table );
+      }
+
+      if ( blend->vvar_table )
+      {
+        ft_var_done_item_variation_store( face,
+                                          &blend->vvar_table->itemStore );
+
+        FT_FREE( blend->vvar_table->widthMap.innerIndex );
+        FT_FREE( blend->vvar_table->widthMap.outerIndex );
+        FT_FREE( blend->vvar_table );
+      }
+
+      if ( blend->mvar_table )
+      {
+        ft_var_done_item_variation_store( face,
+                                          &blend->mvar_table->itemStore );
+
+        FT_FREE( blend->mvar_table->values );
+        FT_FREE( blend->mvar_table );
+      }
+
       FT_FREE( blend->tuplecoords );
       FT_FREE( blend->glyphoffsets );
       FT_FREE( blend );
     }
   }
 
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+#else /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_gxvar_dummy;
+
+#endif /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */
 
 
 /* END */
diff --git a/src/truetype/ttgxvar.h b/src/truetype/ttgxvar.h
index 060d4d6..a37bb90 100644
--- a/src/truetype/ttgxvar.h
+++ b/src/truetype/ttgxvar.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType GX Font Variation loader (specification)                    */
 /*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTGXVAR_H__
-#define __TTGXVAR_H__
+#ifndef TTGXVAR_H_
+#define TTGXVAR_H_
 
 
 #include <ft2build.h>
@@ -27,6 +27,8 @@
 FT_BEGIN_HEADER
 
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -61,6 +63,152 @@
   } GX_AVarSegmentRec, *GX_AVarSegment;
 
 
+  typedef struct  GX_ItemVarDataRec_
+  {
+    FT_UInt    itemCount;      /* number of delta sets per item         */
+    FT_UInt    regionIdxCount; /* number of region indices in this data */
+    FT_UInt*   regionIndices;  /* array of `regionCount' indices;       */
+                               /* these index `varRegionList'           */
+    FT_Short*  deltaSet;       /* array of `itemCount' deltas           */
+                               /* use `innerIndex' for this array       */
+
+  } GX_ItemVarDataRec, *GX_ItemVarData;
+
+
+  /* contribution of one axis to a region */
+  typedef struct  GX_AxisCoordsRec_
+  {
+    FT_Fixed  startCoord;
+    FT_Fixed  peakCoord;      /* zero means no effect (factor = 1) */
+    FT_Fixed  endCoord;
+
+  } GX_AxisCoordsRec, *GX_AxisCoords;
+
+
+  typedef struct  GX_VarRegionRec_
+  {
+    GX_AxisCoords  axisList;               /* array of axisCount records */
+
+  } GX_VarRegionRec, *GX_VarRegion;
+
+
+  /* item variation store */
+  typedef struct  GX_ItemVarStoreRec_
+  {
+    FT_UInt         dataCount;
+    GX_ItemVarData  varData;            /* array of dataCount records;     */
+                                        /* use `outerIndex' for this array */
+    FT_UShort     axisCount;
+    FT_UInt       regionCount;          /* total number of regions defined */
+    GX_VarRegion  varRegionList;
+
+  } GX_ItemVarStoreRec, *GX_ItemVarStore;
+
+
+  typedef struct  GX_DeltaSetIdxMapRec_
+  {
+    FT_UInt   mapCount;
+    FT_UInt*  outerIndex;             /* indices to item var data */
+    FT_UInt*  innerIndex;             /* indices to delta set     */
+
+  } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_HVVarTableRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data from either the `HVAR' or `VVAR' table.                       */
+  /*                                                                       */
+  typedef struct  GX_HVVarTableRec_
+  {
+    GX_ItemVarStoreRec    itemStore;        /* Item Variation Store  */
+    GX_DeltaSetIdxMapRec  widthMap;         /* Advance Width Mapping */
+
+#if 0
+    GX_DeltaSetIdxMapRec  lsbMap;           /* not implemented */
+    GX_DeltaSetIdxMapRec  rsbMap;           /* not implemented */
+
+    GX_DeltaSetIdxMapRec  tsbMap;           /* not implemented */
+    GX_DeltaSetIdxMapRec  bsbMap;           /* not implemented */
+    GX_DeltaSetIdxMapRec  vorgMap;          /* not implemented */
+#endif
+
+  } GX_HVVarTableRec, *GX_HVVarTable;
+
+
+#define MVAR_TAG_GASP_0  FT_MAKE_TAG( 'g', 's', 'p', '0' )
+#define MVAR_TAG_GASP_1  FT_MAKE_TAG( 'g', 's', 'p', '1' )
+#define MVAR_TAG_GASP_2  FT_MAKE_TAG( 'g', 's', 'p', '2' )
+#define MVAR_TAG_GASP_3  FT_MAKE_TAG( 'g', 's', 'p', '3' )
+#define MVAR_TAG_GASP_4  FT_MAKE_TAG( 'g', 's', 'p', '4' )
+#define MVAR_TAG_GASP_5  FT_MAKE_TAG( 'g', 's', 'p', '5' )
+#define MVAR_TAG_GASP_6  FT_MAKE_TAG( 'g', 's', 'p', '6' )
+#define MVAR_TAG_GASP_7  FT_MAKE_TAG( 'g', 's', 'p', '7' )
+#define MVAR_TAG_GASP_8  FT_MAKE_TAG( 'g', 's', 'p', '8' )
+#define MVAR_TAG_GASP_9  FT_MAKE_TAG( 'g', 's', 'p', '9' )
+
+#define MVAR_TAG_CPHT  FT_MAKE_TAG( 'c', 'p', 'h', 't' )
+#define MVAR_TAG_HASC  FT_MAKE_TAG( 'h', 'a', 's', 'c' )
+#define MVAR_TAG_HCLA  FT_MAKE_TAG( 'h', 'c', 'l', 'a' )
+#define MVAR_TAG_HCLD  FT_MAKE_TAG( 'h', 'c', 'l', 'd' )
+#define MVAR_TAG_HCOF  FT_MAKE_TAG( 'h', 'c', 'o', 'f' )
+#define MVAR_TAG_HCRN  FT_MAKE_TAG( 'h', 'c', 'r', 'n' )
+#define MVAR_TAG_HCRS  FT_MAKE_TAG( 'h', 'c', 'r', 's' )
+#define MVAR_TAG_HDSC  FT_MAKE_TAG( 'h', 'd', 's', 'c' )
+#define MVAR_TAG_HLGP  FT_MAKE_TAG( 'h', 'l', 'g', 'p' )
+#define MVAR_TAG_SBXO  FT_MAKE_TAG( 's', 'b', 'x', 'o' )
+#define MVAR_TAG_SBXS  FT_MAKE_TAG( 's', 'b', 'x', 's' )
+#define MVAR_TAG_SBYO  FT_MAKE_TAG( 's', 'b', 'y', 'o' )
+#define MVAR_TAG_SBYS  FT_MAKE_TAG( 's', 'b', 'y', 's' )
+#define MVAR_TAG_SPXO  FT_MAKE_TAG( 's', 'p', 'x', 'o' )
+#define MVAR_TAG_SPXS  FT_MAKE_TAG( 's', 'p', 'x', 's' )
+#define MVAR_TAG_SPYO  FT_MAKE_TAG( 's', 'p', 'y', 'o' )
+#define MVAR_TAG_SPYS  FT_MAKE_TAG( 's', 'p', 'y', 's' )
+#define MVAR_TAG_STRO  FT_MAKE_TAG( 's', 't', 'r', 'o' )
+#define MVAR_TAG_STRS  FT_MAKE_TAG( 's', 't', 'r', 's' )
+#define MVAR_TAG_UNDO  FT_MAKE_TAG( 'u', 'n', 'd', 'o' )
+#define MVAR_TAG_UNDS  FT_MAKE_TAG( 'u', 'n', 'd', 's' )
+#define MVAR_TAG_VASC  FT_MAKE_TAG( 'v', 'a', 's', 'c' )
+#define MVAR_TAG_VCOF  FT_MAKE_TAG( 'v', 'c', 'o', 'f' )
+#define MVAR_TAG_VCRN  FT_MAKE_TAG( 'v', 'c', 'r', 'n' )
+#define MVAR_TAG_VCRS  FT_MAKE_TAG( 'v', 'c', 'r', 's' )
+#define MVAR_TAG_VDSC  FT_MAKE_TAG( 'v', 'd', 's', 'c' )
+#define MVAR_TAG_VLGP  FT_MAKE_TAG( 'v', 'l', 'g', 'p' )
+#define MVAR_TAG_XHGT  FT_MAKE_TAG( 'x', 'h', 'g', 't' )
+
+
+  typedef struct  GX_ValueRec_
+  {
+    FT_ULong   tag;
+    FT_UShort  outerIndex;
+    FT_UShort  innerIndex;
+
+    FT_Short  unmodified;  /* values are either FT_Short or FT_UShort */
+
+  } GX_ValueRec, *GX_Value;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_MVarTableRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data from the `MVAR' table.                                        */
+  /*                                                                       */
+  typedef struct  GX_MVarTableRec_
+  {
+    FT_UShort  valueCount;
+
+    GX_ItemVarStoreRec  itemStore;        /* Item Variation Store  */
+    GX_Value            values;           /* Value Records         */
+
+  } GX_MVarTableRec, *GX_MVarTable;
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -68,32 +216,122 @@
   /*                                                                       */
   /* <Description>                                                         */
   /*    Data for interpolating a font from a distortable font specified    */
-  /*    by the GX *var tables ([fgca]var).                                 */
+  /*    by the GX *var tables ([fgcahvm]var).                              */
   /*                                                                       */
   /* <Fields>                                                              */
-  /*    num_axis         :: The number of axes along which interpolation   */
-  /*                         may happen                                    */
+  /*    num_axis ::                                                        */
+  /*      The number of axes along which interpolation may happen.         */
   /*                                                                       */
-  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
-  /*                        the contribution along each axis to the final  */
-  /*                        interpolated font.                             */
+  /*    coords ::                                                          */
+  /*      An array of design coordinates (in user space) indicating the    */
+  /*      contribution along each axis to the final interpolated font.     */
+  /*      `normalizedcoords' holds the same values.                        */
+  /*                                                                       */
+  /*    normalizedcoords ::                                                */
+  /*      An array of normalized values (between [-1,1]) indicating the    */
+  /*      contribution along each axis to the final interpolated font.     */
+  /*      `coords' holds the same values.                                  */
+  /*                                                                       */
+  /*    mmvar ::                                                           */
+  /*      Data from the `fvar' table.                                      */
+  /*                                                                       */
+  /*    mmvar_len ::                                                       */
+  /*      The length of the `mmvar' structure.                             */
+  /*                                                                       */
+  /*    normalized_stylecoords ::                                          */
+  /*      A two-dimensional array that holds the named instance data from  */
+  /*      `mmvar' as normalized values.                                    */
+  /*                                                                       */
+  /*    avar_loaded ::                                                     */
+  /*      A Boolean; if set, FreeType tried to load (and parse) the `avar' */
+  /*      table.                                                           */
+  /*                                                                       */
+  /*    avar_segment ::                                                    */
+  /*      Data from the `avar' table.                                      */
+  /*                                                                       */
+  /*    hvar_loaded ::                                                     */
+  /*      A Boolean; if set, FreeType tried to load (and parse) the `hvar' */
+  /*      table.                                                           */
+  /*                                                                       */
+  /*    hvar_checked ::                                                    */
+  /*      A Boolean; if set, FreeType successfully loaded and parsed the   */
+  /*      `hvar' table.                                                    */
+  /*                                                                       */
+  /*    hvar_error ::                                                      */
+  /*      If loading and parsing of the `hvar' table failed, this field    */
+  /*      holds the corresponding error code.                              */
+  /*                                                                       */
+  /*    hvar_table ::                                                      */
+  /*      Data from the `hvar' table.                                      */
+  /*                                                                       */
+  /*    vvar_loaded ::                                                     */
+  /*      A Boolean; if set, FreeType tried to load (and parse) the `vvar' */
+  /*      table.                                                           */
+  /*                                                                       */
+  /*    vvar_checked ::                                                    */
+  /*      A Boolean; if set, FreeType successfully loaded and parsed the   */
+  /*      `vvar' table.                                                    */
+  /*                                                                       */
+  /*    vvar_error ::                                                      */
+  /*      If loading and parsing of the `vvar' table failed, this field    */
+  /*      holds the corresponding error code.                              */
+  /*                                                                       */
+  /*    vvar_table ::                                                      */
+  /*      Data from the `vvar' table.                                      */
+  /*                                                                       */
+  /*    mvar_table ::                                                      */
+  /*      Data from the `mvar' table.                                      */
+  /*                                                                       */
+  /*    tuplecount ::                                                      */
+  /*      The number of shared tuples in the `gvar' table.                 */
+  /*                                                                       */
+  /*    tuplecoords ::                                                     */
+  /*      A two-dimensional array that holds the shared tuple coordinates  */
+  /*      in the `gvar' table.                                             */
+  /*                                                                       */
+  /*    gv_glyphcnt ::                                                     */
+  /*      The number of glyphs handled in the `gvar' table.                */
+  /*                                                                       */
+  /*    glyphoffsets ::                                                    */
+  /*      Offsets into the glyph variation data array.                     */
+  /*                                                                       */
+  /*    gvar_size ::                                                       */
+  /*      The size of the `gvar' table.                                    */
   /*                                                                       */
   typedef struct  GX_BlendRec_
   {
     FT_UInt         num_axis;
+    FT_Fixed*       coords;
     FT_Fixed*       normalizedcoords;
 
     FT_MM_Var*      mmvar;
     FT_Offset       mmvar_len;
 
-    FT_Bool         avar_checked;
-    GX_AVarSegment  avar_segment;
+    FT_Fixed*       normalized_stylecoords;
+                      /* normalized_stylecoords[num_namedstyles][num_axis] */
 
-    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
-    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
+    FT_Bool         avar_loaded;
+    GX_AVarSegment  avar_segment;                /* avar_segment[num_axis] */
+
+    FT_Bool         hvar_loaded;
+    FT_Bool         hvar_checked;
+    FT_Error        hvar_error;
+    GX_HVVarTable   hvar_table;
+
+    FT_Bool         vvar_loaded;
+    FT_Bool         vvar_checked;
+    FT_Error        vvar_error;
+    GX_HVVarTable   vvar_table;
+
+    GX_MVarTable    mvar_table;
+
+    FT_UInt         tuplecount;
+    FT_Fixed*       tuplecoords;      /* tuplecoords[tuplecount][num_axis] */
 
     FT_UInt         gv_glyphcnt;
-    FT_ULong*       glyphoffsets;
+    FT_ULong*       glyphoffsets;         /* glyphoffsets[gv_glyphcnt + 1] */
+
+    FT_ULong        gvar_size;
 
   } GX_BlendRec;
 
@@ -147,6 +385,11 @@
                    FT_Fixed*  coords );
 
   FT_LOCAL( FT_Error )
+  TT_Get_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
   TT_Set_Var_Design( TT_Face    face,
                      FT_UInt    num_coords,
                      FT_Fixed*  coords );
@@ -155,6 +398,14 @@
   TT_Get_MM_Var( TT_Face      face,
                  FT_MM_Var*  *master );
 
+  FT_LOCAL( FT_Error )
+  TT_Get_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  TT_Set_Named_Instance( TT_Face  face,
+                         FT_UInt  instance_index );
 
   FT_LOCAL( FT_Error )
   tt_face_vary_cvt( TT_Face    face,
@@ -167,16 +418,36 @@
                               FT_Outline*  outline,
                               FT_UInt      n_points );
 
+  FT_LOCAL( FT_Error )
+  tt_hadvance_adjust( TT_Face  face,
+                      FT_UInt  gindex,
+                      FT_Int  *adelta );
+
+  FT_LOCAL( FT_Error )
+  tt_vadvance_adjust( TT_Face  face,
+                      FT_UInt  gindex,
+                      FT_Int  *adelta );
 
   FT_LOCAL( void )
-  tt_done_blend( FT_Memory  memory,
-                 GX_Blend   blend );
+  tt_apply_mvar( TT_Face  face );
+
+  FT_LOCAL( FT_Error )
+  tt_get_var_blend( TT_Face      face,
+                    FT_UInt     *num_coords,
+                    FT_Fixed*   *coords,
+                    FT_Fixed*   *normalizedcoords,
+                    FT_MM_Var*  *mm_var );
+
+  FT_LOCAL( void )
+  tt_done_blend( TT_Face  face );
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
 
 
 FT_END_HEADER
 
 
-#endif /* __TTGXVAR_H__ */
+#endif /* TTGXVAR_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c
index 089f604..da9b595 100644
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType bytecode interpreter (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,11 +25,15 @@
 #include FT_INTERNAL_CALC_H
 #include FT_TRIGONOMETRY_H
 #include FT_SYSTEM_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
+#include FT_MULTIPLE_MASTERS_H
 
 #include "ttinterp.h"
 #include "tterrors.h"
 #include "ttsubpix.h"
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
 
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
@@ -45,25 +49,31 @@
 #define FT_COMPONENT  trace_ttinterp
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* In order to detect infinite loops in the code, we set up a counter    */
-  /* within the run loop.  A single stroke of interpretation is now        */
-  /* limited to a maximum number of opcodes defined below.                 */
-  /*                                                                       */
-#define MAX_RUNNABLE_OPCODES  1000000L
+#define NO_SUBPIXEL_HINTING                                                  \
+          ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
+            TT_INTERPRETER_VERSION_35 )
 
-
-#define SUBPIXEL_HINTING                                                     \
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+#define SUBPIXEL_HINTING_INFINALITY                                          \
           ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
             TT_INTERPRETER_VERSION_38 )
+#endif
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+#define SUBPIXEL_HINTING_MINIMAL                                             \
+          ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
+            TT_INTERPRETER_VERSION_40 )
+#endif
 
-#define PROJECT( v1, v2 )                                                \
-          exc->func_project( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+#define PROJECT( v1, v2 )                                   \
+          exc->func_project( exc,                           \
+                             SUB_LONG( (v1)->x, (v2)->x ),  \
+                             SUB_LONG( (v1)->y, (v2)->y ) )
 
-#define DUALPROJ( v1, v2 )                                                \
-          exc->func_dualproj( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+#define DUALPROJ( v1, v2 )                                   \
+          exc->func_dualproj( exc,                           \
+                              SUB_LONG( (v1)->x, (v2)->x ),  \
+                              SUB_LONG( (v1)->y, (v2)->y ) )
 
 #define FAST_PROJECT( v )                          \
           exc->func_project( exc, (v)->x, (v)->y )
@@ -74,47 +84,18 @@
 
   /*************************************************************************/
   /*                                                                       */
-  /* Instruction dispatch function, as used by the interpreter.            */
-  /*                                                                       */
-  typedef void  (*TInstruction_Function)( TT_ExecContext  exc,
-                                          FT_Long*        args );
-
-
-  /*************************************************************************/
-  /*                                                                       */
   /* Two simple bounds-checking macros.                                    */
   /*                                                                       */
 #define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )
 #define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* This macro computes (a*2^14)/b and complements TT_MulFix14.           */
-  /*                                                                       */
-#define TT_DivFix14( a, b )  FT_DivFix( a, (b) << 2 )
-
-
 #undef  SUCCESS
 #define SUCCESS  0
 
 #undef  FAILURE
 #define FAILURE  1
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-#define GUESS_VECTOR( V )                                             \
-  do                                                                  \
-  {                                                                   \
-    if ( exc->face->unpatented_hinting )                              \
-    {                                                                 \
-      exc->GS.V.x = (FT_F2Dot14)( exc->GS.both_x_axis ? 0x4000 : 0 ); \
-      exc->GS.V.y = (FT_F2Dot14)( exc->GS.both_x_axis ? 0 : 0x4000 ); \
-    }                                                                 \
-  } while (0)
-#else
-#define GUESS_VECTOR( V )  do { } while (0)
-#endif
-
 
   /*************************************************************************/
   /*                                                                       */
@@ -152,7 +133,7 @@
 
     coderange = &exec->codeRangeTable[range - 1];
 
-    FT_ASSERT( coderange->base != NULL );
+    FT_ASSERT( coderange->base );
 
     /* NOTE: Because the last instruction of a program may be a CALL */
     /*       which will return to the first byte *after* the code    */
@@ -316,8 +297,8 @@
     exec->stackSize = 0;
     exec->glyphSize = 0;
 
-    exec->stack     = NULL;
-    exec->glyphIns  = NULL;
+    exec->stack    = NULL;
+    exec->glyphIns = NULL;
 
     exec->face = NULL;
     exec->size = NULL;
@@ -423,8 +404,9 @@
       exec->maxIDefs   = size->max_instruction_defs;
       exec->FDefs      = size->function_defs;
       exec->IDefs      = size->instruction_defs;
+      exec->pointSize  = size->point_size;
       exec->tt_metrics = size->ttmetrics;
-      exec->metrics    = size->metrics;
+      exec->metrics    = *size->metrics;
 
       exec->maxFunc    = size->max_func;
       exec->maxIns     = size->max_ins;
@@ -445,7 +427,7 @@
 
       /* In case of multi-threading it can happen that the old size object */
       /* no longer exists, thus we must clear all glyph zone references.   */
-      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
+      FT_ZERO( &exec->zp0 );
       exec->zp1 = exec->zp0;
       exec->zp2 = exec->zp0;
     }
@@ -563,10 +545,6 @@
     exec->GS.freeVector = exec->GS.projVector;
     exec->GS.dualVector = exec->GS.projVector;
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    exec->GS.both_x_axis = TRUE;
-#endif
-
     exec->GS.round_state = 1;
     exec->GS.loop        = 1;
 
@@ -593,10 +571,6 @@
     { 0x4000, 0 },
     { 0x4000, 0 },
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    TRUE,
-#endif
-
     1, 64, 1,
     TRUE, 68, 0, 0, 9, 3,
     0, FALSE, 0, 1, 1, 1
@@ -716,17 +690,17 @@
 
     /*  IUP[0]    */  PACK( 0, 0 ),
     /*  IUP[1]    */  PACK( 0, 0 ),
-    /*  SHP[0]    */  PACK( 0, 0 ),
-    /*  SHP[1]    */  PACK( 0, 0 ),
+    /*  SHP[0]    */  PACK( 0, 0 ), /* loops */
+    /*  SHP[1]    */  PACK( 0, 0 ), /* loops */
     /*  SHC[0]    */  PACK( 1, 0 ),
     /*  SHC[1]    */  PACK( 1, 0 ),
     /*  SHZ[0]    */  PACK( 1, 0 ),
     /*  SHZ[1]    */  PACK( 1, 0 ),
-    /*  SHPIX     */  PACK( 1, 0 ),
-    /*  IP        */  PACK( 0, 0 ),
+    /*  SHPIX     */  PACK( 1, 0 ), /* loops */
+    /*  IP        */  PACK( 0, 0 ), /* loops */
     /*  MSIRP[0]  */  PACK( 2, 0 ),
     /*  MSIRP[1]  */  PACK( 2, 0 ),
-    /*  AlignRP   */  PACK( 0, 0 ),
+    /*  AlignRP   */  PACK( 0, 0 ), /* loops */
     /*  RTDG      */  PACK( 0, 0 ),
     /*  MIAP[0]   */  PACK( 2, 0 ),
     /*  MIAP[1]   */  PACK( 2, 0 ),
@@ -799,7 +773,7 @@
     /*  SANGW     */  PACK( 1, 0 ),
     /*  AA        */  PACK( 1, 0 ),
 
-    /*  FlipPT    */  PACK( 0, 0 ),
+    /*  FlipPT    */  PACK( 0, 0 ), /* loops */
     /*  FlipRgON  */  PACK( 2, 0 ),
     /*  FlipRgOFF */  PACK( 2, 0 ),
     /*  INS_$83   */  PACK( 0, 0 ),
@@ -817,8 +791,8 @@
     /*  INS_$8F   */  PACK( 0, 0 ),
 
     /*  INS_$90  */   PACK( 0, 0 ),
-    /*  INS_$91  */   PACK( 0, 0 ),
-    /*  INS_$92  */   PACK( 0, 0 ),
+    /*  GETVAR   */   PACK( 0, 0 ), /* will be handled specially */
+    /*  GETDATA  */   PACK( 0, 1 ),
     /*  INS_$93  */   PACK( 0, 0 ),
     /*  INS_$94  */   PACK( 0, 0 ),
     /*  INS_$95  */   PACK( 0, 0 ),
@@ -1100,8 +1074,13 @@
     "7 INS_$8F",
 
     "7 INS_$90",
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    "6 GETVAR",
+    "7 GETDATA",
+#else
     "7 INS_$91",
     "7 INS_$92",
+#endif
     "7 INS_$93",
     "7 INS_$94",
     "7 INS_$95",
@@ -1486,34 +1465,22 @@
   {
     if ( !exc->tt_metrics.ratio )
     {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-      if ( exc->face->unpatented_hinting )
-      {
-        if ( exc->GS.both_x_axis )
-          exc->tt_metrics.ratio = exc->tt_metrics.x_ratio;
-        else
-          exc->tt_metrics.ratio = exc->tt_metrics.y_ratio;
-      }
+      if ( exc->GS.projVector.y == 0 )
+        exc->tt_metrics.ratio = exc->tt_metrics.x_ratio;
+
+      else if ( exc->GS.projVector.x == 0 )
+        exc->tt_metrics.ratio = exc->tt_metrics.y_ratio;
+
       else
-#endif
       {
-        if ( exc->GS.projVector.y == 0 )
-          exc->tt_metrics.ratio = exc->tt_metrics.x_ratio;
-
-        else if ( exc->GS.projVector.x == 0 )
-          exc->tt_metrics.ratio = exc->tt_metrics.y_ratio;
-
-        else
-        {
-          FT_F26Dot6  x, y;
+        FT_F26Dot6  x, y;
 
 
-          x = TT_MulFix14( exc->tt_metrics.x_ratio,
-                           exc->GS.projVector.x );
-          y = TT_MulFix14( exc->tt_metrics.y_ratio,
-                           exc->GS.projVector.y );
-          exc->tt_metrics.ratio = FT_Hypot( x, y );
-        }
+        x = TT_MulFix14( exc->tt_metrics.x_ratio,
+                         exc->GS.projVector.x );
+        y = TT_MulFix14( exc->tt_metrics.y_ratio,
+                         exc->GS.projVector.y );
+        exc->tt_metrics.ratio = FT_Hypot( x, y );
       }
     }
     return exc->tt_metrics.ratio;
@@ -1611,7 +1578,7 @@
   static FT_Short
   GetShortIns( TT_ExecContext  exc )
   {
-    /* Reading a byte stream so there is no endianess (DaveP) */
+    /* Reading a byte stream so there is no endianness (DaveP) */
     exc->IP += 2;
     return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) +
                          exc->code[exc->IP - 1]      );
@@ -1650,7 +1617,7 @@
 
     range = &exc->codeRangeTable[aRange - 1];
 
-    if ( range->base == NULL )     /* invalid coderange */
+    if ( !range->base )     /* invalid coderange */
     {
       exc->error = FT_THROW( Invalid_CodeRange );
       return FAILURE;
@@ -1692,6 +1659,10 @@
   /* <InOut>                                                               */
   /*    zone     :: The affected glyph zone.                               */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    See `ttinterp.h' for details on backward compatibility mode.       */
+  /*    `Touches' the point.                                               */
+  /*                                                                       */
   static void
   Direct_Move( TT_ExecContext  exc,
                TT_GlyphZone    zone,
@@ -1701,20 +1672,38 @@
     FT_F26Dot6  v;
 
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    FT_ASSERT( !exc->face->unpatented_hinting );
-#endif
-
     v = exc->GS.freeVector.x;
 
     if ( v != 0 )
     {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      if ( !SUBPIXEL_HINTING                                      ||
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      if ( SUBPIXEL_HINTING_INFINALITY                            &&
            ( !exc->ignore_x_mode                                ||
              ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
+      else
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      /* Exception to the post-IUP curfew: Allow the x component of */
+      /* diagonal moves, but only post-IUP.  DejaVu tries to adjust */
+      /* diagonal stems like on `Z' and `z' post-IUP.               */
+      if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
+      else
+#endif
+
+      if ( NO_SUBPIXEL_HINTING )
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
     }
@@ -1723,7 +1712,16 @@
 
     if ( v != 0 )
     {
-      zone->cur[point].y += FT_MulDiv( distance, v, exc->F_dot_P );
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
+              exc->backward_compatibility &&
+              exc->iupx_called            &&
+              exc->iupy_called            ) )
+#endif
+        zone->cur[point].y = ADD_LONG( zone->cur[point].y,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
     }
@@ -1756,19 +1754,21 @@
     FT_F26Dot6  v;
 
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    FT_ASSERT( !exc->face->unpatented_hinting );
-#endif
-
     v = exc->GS.freeVector.x;
 
     if ( v != 0 )
-      zone->org[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+      zone->org[point].x = ADD_LONG( zone->org[point].x,
+                                     FT_MulDiv( distance,
+                                                v,
+                                                exc->F_dot_P ) );
 
     v = exc->GS.freeVector.y;
 
     if ( v != 0 )
-      zone->org[point].y += FT_MulDiv( distance, v, exc->F_dot_P );
+      zone->org[point].y = ADD_LONG( zone->org[point].y,
+                                     FT_MulDiv( distance,
+                                                v,
+                                                exc->F_dot_P ) );
   }
 
 
@@ -1778,6 +1778,7 @@
   /*                                                                       */
   /*   The following versions are used whenever both vectors are both      */
   /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*   See `ttinterp.h' for details on backward compatibility mode.        */
   /*                                                                       */
   /*************************************************************************/
 
@@ -1788,13 +1789,20 @@
                  FT_UShort       point,
                  FT_F26Dot6      distance )
   {
-    FT_UNUSED( exc );
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode )
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
+    else
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( !SUBPIXEL_HINTING   ||
-         !exc->ignore_x_mode )
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-      zone->cur[point].x += distance;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
+    else
+#endif
+
+    if ( NO_SUBPIXEL_HINTING )
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
 
     zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
   }
@@ -1808,8 +1816,14 @@
   {
     FT_UNUSED( exc );
 
-    zone->cur[point].y += distance;
-    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    if ( !( SUBPIXEL_HINTING_MINIMAL             &&
+            exc->backward_compatibility          &&
+            exc->iupx_called && exc->iupy_called ) )
+#endif
+      zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance );
+
+    zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
   }
 
 
@@ -1831,7 +1845,7 @@
   {
     FT_UNUSED( exc );
 
-    zone->org[point].x += distance;
+    zone->org[point].x = ADD_LONG( zone->org[point].x, distance );
   }
 
 
@@ -1843,7 +1857,7 @@
   {
     FT_UNUSED( exc );
 
-    zone->org[point].y += distance;
+    zone->org[point].y = ADD_LONG( zone->org[point].y, distance );
   }
 
 
@@ -1881,13 +1895,13 @@
 
     if ( distance >= 0 )
     {
-      val = distance + compensation;
+      val = ADD_LONG( distance, compensation );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = distance - compensation;
+      val = SUB_LONG( distance, compensation );
       if ( val > 0 )
         val = 0;
     }
@@ -1923,13 +1937,14 @@
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_ROUND( distance + compensation );
+      val = FT_PIX_ROUND_LONG( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_ROUND( compensation - distance );
+      val = NEG_LONG( FT_PIX_ROUND_LONG( SUB_LONG( compensation,
+                                                   distance ) ) );
       if ( val > 0 )
         val = 0;
     }
@@ -1966,13 +1981,16 @@
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_FLOOR( distance + compensation ) + 32;
+      val = ADD_LONG( FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ),
+                      32 );
       if ( val < 0 )
         val = 32;
     }
     else
     {
-      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+      val = NEG_LONG( ADD_LONG( FT_PIX_FLOOR( SUB_LONG( compensation,
+                                                        distance ) ),
+                                32 ) );
       if ( val > 0 )
         val = -32;
     }
@@ -2009,13 +2027,13 @@
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_FLOOR( distance + compensation );
+      val = FT_PIX_FLOOR( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_FLOOR( compensation - distance );
+      val = NEG_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, distance ) ) );
       if ( val > 0 )
         val = 0;
     }
@@ -2052,13 +2070,14 @@
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_CEIL( distance + compensation );
+      val = FT_PIX_CEIL_LONG( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_CEIL( compensation - distance );
+      val = NEG_LONG( FT_PIX_CEIL_LONG( SUB_LONG( compensation,
+                                                  distance ) ) );
       if ( val > 0 )
         val = 0;
     }
@@ -2088,20 +2107,21 @@
                         FT_F26Dot6      distance,
                         FT_F26Dot6      compensation )
   {
-    FT_F26Dot6 val;
+    FT_F26Dot6  val;
 
     FT_UNUSED( exc );
 
 
     if ( distance >= 0 )
     {
-      val = FT_PAD_ROUND( distance + compensation, 32 );
+      val = FT_PAD_ROUND_LONG( ADD_LONG( distance, compensation ), 32 );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PAD_ROUND( compensation - distance, 32 );
+      val = NEG_LONG( FT_PAD_ROUND_LONG( SUB_LONG( compensation, distance ),
+                                         32 ) );
       if ( val > 0 )
         val = 0;
     }
@@ -2127,7 +2147,7 @@
   /*    Rounded distance.                                                  */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    The TrueType specification says very few about the relationship    */
+  /*    The TrueType specification says very little about the relationship */
   /*    between rounding and engine compensation.  However, it seems from  */
   /*    the description of super round that we should add the compensation */
   /*    before rounding.                                                   */
@@ -2142,17 +2162,19 @@
 
     if ( distance >= 0 )
     {
-      val = ( distance - exc->phase + exc->threshold + compensation ) &
+      val = ADD_LONG( distance,
+                      exc->threshold - exc->phase + compensation ) &
               -exc->period;
-      val += exc->phase;
+      val = ADD_LONG( val, exc->phase );
       if ( val < 0 )
         val = exc->phase;
     }
     else
     {
-      val = -( ( exc->threshold - exc->phase - distance + compensation ) &
-               -exc->period );
-      val -= exc->phase;
+      val = NEG_LONG( SUB_LONG( exc->threshold - exc->phase + compensation,
+                                distance ) &
+                        -exc->period );
+      val = SUB_LONG( val, exc->phase );
       if ( val > 0 )
         val = -exc->phase;
     }
@@ -2191,17 +2213,19 @@
 
     if ( distance >= 0 )
     {
-      val = ( ( distance - exc->phase + exc->threshold + compensation ) /
+      val = ( ADD_LONG( distance,
+                        exc->threshold - exc->phase + compensation ) /
                 exc->period ) * exc->period;
-      val += exc->phase;
+      val = ADD_LONG( val, exc->phase );
       if ( val < 0 )
         val = exc->phase;
     }
     else
     {
-      val = -( ( ( exc->threshold - exc->phase - distance + compensation ) /
-                   exc->period ) * exc->period );
-      val -= exc->phase;
+      val = NEG_LONG( ( SUB_LONG( exc->threshold - exc->phase + compensation,
+                                  distance ) /
+                          exc->period ) * exc->period );
+      val = SUB_LONG( val, exc->phase );
       if ( val > 0 )
         val = -exc->phase;
     }
@@ -2352,10 +2376,6 @@
            FT_Pos          dx,
            FT_Pos          dy )
   {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    FT_ASSERT( !exc->face->unpatented_hinting );
-#endif
-
     return TT_DotFix14( dx, dy,
                         exc->GS.projVector.x,
                         exc->GS.projVector.y );
@@ -2457,51 +2477,6 @@
   static void
   Compute_Funcs( TT_ExecContext  exc )
   {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      /* If both vectors point rightwards along the x axis, set          */
-      /* `both-x-axis' true, otherwise set it false.  The x values only  */
-      /* need be tested because the vector has been normalised to a unit */
-      /* vector of length 0x4000 = unity.                                */
-      exc->GS.both_x_axis = (FT_Bool)( exc->GS.projVector.x == 0x4000 &&
-                                       exc->GS.freeVector.x == 0x4000 );
-
-      /* Throw away projection and freedom vector information */
-      /* because the patents don't allow them to be stored.   */
-      /* The relevant US Patents are 5155805 and 5325479.     */
-      exc->GS.projVector.x = 0;
-      exc->GS.projVector.y = 0;
-      exc->GS.freeVector.x = 0;
-      exc->GS.freeVector.y = 0;
-
-      if ( exc->GS.both_x_axis )
-      {
-        exc->func_project   = Project_x;
-        exc->func_move      = Direct_Move_X;
-        exc->func_move_orig = Direct_Move_Orig_X;
-      }
-      else
-      {
-        exc->func_project   = Project_y;
-        exc->func_move      = Direct_Move_Y;
-        exc->func_move_orig = Direct_Move_Orig_Y;
-      }
-
-      if ( exc->GS.dualVector.x == 0x4000 )
-        exc->func_dualproj = Project_x;
-      else if ( exc->GS.dualVector.y == 0x4000 )
-        exc->func_dualproj = Project_y;
-      else
-        exc->func_dualproj = Dual_Project;
-
-      /* Force recalculation of cached aspect ratio */
-      exc->tt_metrics.ratio = 0;
-
-      return;
-    }
-#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
-
     if ( exc->GS.freeVector.x == 0x4000 )
       exc->F_dot_P = exc->GS.projVector.x;
     else if ( exc->GS.freeVector.y == 0x4000 )
@@ -2580,26 +2555,23 @@
              FT_F26Dot6      Vy,
              FT_UnitVector*  R )
   {
-    FT_F26Dot6  W;
+    FT_Vector V;
 
 
-    if ( FT_ABS( Vx ) < 0x4000L && FT_ABS( Vy ) < 0x4000L )
+    if ( Vx == 0 && Vy == 0 )
     {
-      if ( Vx == 0 && Vy == 0 )
-      {
-        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
-        /*      to normalize the vector (0,0).  Return immediately. */
-        return SUCCESS;
-      }
-
-      Vx *= 0x4000;
-      Vy *= 0x4000;
+      /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
+      /*      to normalize the vector (0,0).  Return immediately. */
+      return SUCCESS;
     }
 
-    W = FT_Hypot( Vx, Vy );
+    V.x = Vx;
+    V.y = Vy;
 
-    R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
-    R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
+    FT_Vector_NormLen( &V );
+
+    R->x = (FT_F2Dot14)( V.x / 4 );
+    R->y = (FT_F2Dot14)( V.y / 4 );
 
     return SUCCESS;
   }
@@ -2644,13 +2616,20 @@
   Ins_MPS( TT_ExecContext  exc,
            FT_Long*        args )
   {
-    /* Note: The point size should be irrelevant in a given font program; */
-    /*       we thus decide to return only the PPEM value.                */
-#if 0
-    args[0] = exc->metrics.pointSize;
-#else
-    args[0] = exc->func_cur_ppem( exc );
-#endif
+    if ( NO_SUBPIXEL_HINTING )
+    {
+      /* Microsoft's GDI bytecode interpreter always returns value 12; */
+      /* we return the current PPEM value instead.                     */
+      args[0] = exc->func_cur_ppem( exc );
+    }
+    else
+    {
+      /* A possible practical application of the MPS instruction is to   */
+      /* implement optical scaling and similar features, which should be */
+      /* based on perceptual attributes, thus independent of the         */
+      /* resolution.                                                     */
+      args[0] = exc->pointSize;
+    }
   }
 
 
@@ -2879,7 +2858,7 @@
   static void
   Ins_ADD( FT_Long*  args )
   {
-    args[0] += args[1];
+    args[0] = ADD_LONG( args[0], args[1] );
   }
 
 
@@ -2892,7 +2871,7 @@
   static void
   Ins_SUB( FT_Long*  args )
   {
-    args[0] -= args[1];
+    args[0] = SUB_LONG( args[0], args[1] );
   }
 
 
@@ -2935,7 +2914,8 @@
   static void
   Ins_ABS( FT_Long*  args )
   {
-    args[0] = FT_ABS( args[0] );
+    if ( args[0] < 0 )
+      args[0] = NEG_LONG( args[0] );
   }
 
 
@@ -2943,12 +2923,12 @@
   /*                                                                       */
   /* NEG[]:        NEGate                                                  */
   /* Opcode range: 0x65                                                    */
-  /* Stack: f26.6 --> f26.6                                                */
+  /* Stack:        f26.6 --> f26.6                                         */
   /*                                                                       */
   static void
   Ins_NEG( FT_Long*  args )
   {
-    args[0] = -args[0];
+    args[0] = NEG_LONG( args[0] );
   }
 
 
@@ -2974,7 +2954,7 @@
   static void
   Ins_CEILING( FT_Long*  args )
   {
-    args[0] = FT_PIX_CEIL( args[0] );
+    args[0] = FT_PIX_CEIL_LONG( args[0] );
   }
 
 
@@ -2988,8 +2968,6 @@
   Ins_RS( TT_ExecContext  exc,
           FT_Long*        args )
   {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-
     FT_ULong  I = (FT_ULong)args[0];
 
 
@@ -3002,9 +2980,10 @@
     }
     else
     {
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       /* subpixel hinting - avoid Typeman Dstroke and */
       /* IStroke and Vacuform rounds                  */
-      if ( SUBPIXEL_HINTING                            &&
+      if ( SUBPIXEL_HINTING_INFINALITY                 &&
            exc->ignore_x_mode                          &&
            ( ( I == 24                             &&
                ( exc->face->sph_found_func_flags &
@@ -3019,25 +2998,9 @@
                exc->iup_called                     ) ) )
         args[0] = 0;
       else
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
         args[0] = exc->storage[I];
     }
-
-#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->storeSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-      else
-        args[0] = 0;
-    }
-    else
-      args[0] = exc->storage[I];
-
-#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
   }
 
 
@@ -3200,7 +3163,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* MAX[]:        MAXimum                                                 */
-  /* Opcode range: 0x68                                                    */
+  /* Opcode range: 0x8B                                                    */
   /* Stack:        int32? int32? --> int32                                 */
   /*                                                                       */
   static void
@@ -3214,7 +3177,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* MIN[]:        MINimum                                                 */
-  /* Opcode range: 0x69                                                    */
+  /* Opcode range: 0x8C                                                    */
   /* Stack:        int32? int32? --> int32                                 */
   /*                                                                       */
   static void
@@ -3326,7 +3289,10 @@
     if ( args[0] < 0 )
       exc->error = FT_THROW( Bad_Argument );
     else
-      exc->GS.loop = args[0];
+    {
+      /* we heuristically limit the number of loops to 16 bits */
+      exc->GS.loop = args[0] > 0xFFFFL ? 0xFFFFL : args[0];
+    }
   }
 
 
@@ -3458,13 +3424,27 @@
             FT_Long*        args )
   {
     if ( args[0] == 0 && exc->args == 0 )
+    {
       exc->error = FT_THROW( Bad_Argument );
+      return;
+    }
+
     exc->IP += args[0];
     if ( exc->IP < 0                                             ||
          ( exc->callTop > 0                                    &&
            exc->IP > exc->callStack[exc->callTop - 1].Def->end ) )
+    {
       exc->error = FT_THROW( Bad_Argument );
+      return;
+    }
+
     exc->step_ins = FALSE;
+
+    if ( args[0] < 0 )
+    {
+      if ( ++exc->neg_jump_counter > exc->neg_jump_counter_max )
+        exc->error = FT_THROW( Execution_Too_Long );
+    }
   }
 
 
@@ -3519,7 +3499,7 @@
     TT_DefRecord*  rec;
     TT_DefRecord*  limit;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /* arguments to opcodes are skipped by `SKIP_Code' */
     FT_Byte    opcode_pattern[9][12] = {
                  /* #0 inline delta function 1 */
@@ -3617,9 +3597,16 @@
     FT_UShort  opcode_pointer[9] = {  0, 0, 0, 0, 0, 0, 0, 0, 0 };
     FT_UShort  opcode_size[9]    = { 12, 8, 8, 6, 7, 4, 5, 4, 2 };
     FT_UShort  i;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 
+    /* FDEF is only allowed in `prep' or `fpgm' */
+    if ( exc->curRange == tt_coderange_glyph )
+    {
+      exc->error = FT_THROW( DEF_In_Glyf_Bytecode );
+      return;
+    }
+
     /* some font programs are broken enough to redefine functions! */
     /* We will then parse the current table.                       */
 
@@ -3662,7 +3649,7 @@
     if ( n > exc->maxFunc )
       exc->maxFunc = (FT_UInt16)n;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /* We don't know for sure these are typeman functions, */
     /* however they are only active when RS 22 is called   */
     if ( n >= 64 && n <= 66 )
@@ -3675,9 +3662,9 @@
     while ( SkipCode( exc ) == SUCCESS )
     {
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
-      if ( SUBPIXEL_HINTING )
+      if ( SUBPIXEL_HINTING_INFINALITY )
       {
         for ( i = 0; i < opcode_patterns; i++ )
         {
@@ -3784,7 +3771,7 @@
             ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
       }
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       switch ( exc->opcode )
       {
@@ -3813,9 +3800,9 @@
     TT_CallRec*  pRec;
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     exc->sph_in_func_flags = 0x0000;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     if ( exc->callTop <= 0 )     /* We encountered an ENDF without a call */
     {
@@ -3901,8 +3888,8 @@
     if ( !def->active )
       goto Fail;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                               &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                                    &&
          exc->ignore_x_mode                                             &&
          ( ( exc->iup_called                                        &&
              ( exc->sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) ||
@@ -3910,7 +3897,7 @@
       goto Fail;
     else
       exc->sph_in_func_flags = def->sph_fdef_flags;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     /* check the call stack */
     if ( exc->callTop >= exc->callSize )
@@ -3989,14 +3976,14 @@
     if ( !def->active )
       goto Fail;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                    &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                         &&
          exc->ignore_x_mode                                  &&
          ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) )
       goto Fail;
     else
       exc->sph_in_func_flags = def->sph_fdef_flags;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     /* check stack */
     if ( exc->callTop >= exc->callSize )
@@ -4019,6 +4006,10 @@
       Ins_Goto_CodeRange( exc, def->range, def->start );
 
       exc->step_ins = FALSE;
+
+      exc->loopcall_counter += (FT_ULong)args[0];
+      if ( exc->loopcall_counter > exc->loopcall_counter_max )
+        exc->error = FT_THROW( Execution_Too_Long );
     }
 
     return;
@@ -4042,6 +4033,13 @@
     TT_DefRecord*  limit;
 
 
+    /* we enable IDEF only in `prep' or `fpgm' */
+    if ( exc->curRange == tt_coderange_glyph )
+    {
+      exc->error = FT_THROW( DEF_In_Glyf_Bytecode );
+      return;
+    }
+
     /*  First of all, look for the same function in our table */
 
     def   = exc->IDefs;
@@ -4089,6 +4087,7 @@
         exc->error = FT_THROW( Nested_DEFS );
         return;
       case 0x2D:   /* ENDF */
+        def->end = exc->IP;
         return;
       }
     }
@@ -4248,8 +4247,8 @@
     p1 = exc->zp1.cur + aIdx2;
     p2 = exc->zp2.cur + aIdx1;
 
-    A = p1->x - p2->x;
-    B = p1->y - p2->y;
+    A = SUB_LONG( p1->x, p2->x );
+    B = SUB_LONG( p1->y, p2->y );
 
     /* If p1 == p2, SPvTL and SFvTL behave the same as */
     /* SPvTCA[X] and SFvTCA[X], respectively.          */
@@ -4264,9 +4263,9 @@
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, Vec );
@@ -4308,16 +4307,12 @@
       exc->GS.dualVector.x = AA;
       exc->GS.dualVector.y = BB;
     }
-    else
-      GUESS_VECTOR( projVector );
 
     if ( ( opcode & 2 ) == 0 )
     {
       exc->GS.freeVector.x = AA;
       exc->GS.freeVector.y = BB;
     }
-    else
-      GUESS_VECTOR( freeVector );
 
     Compute_Funcs( exc );
   }
@@ -4339,7 +4334,6 @@
                     &exc->GS.projVector ) == SUCCESS )
     {
       exc->GS.dualVector = exc->GS.projVector;
-      GUESS_VECTOR( freeVector );
       Compute_Funcs( exc );
     }
   }
@@ -4360,7 +4354,6 @@
                     (FT_UShort)args[0],
                     &exc->GS.freeVector ) == SUCCESS )
     {
-      GUESS_VECTOR( projVector );
       Compute_Funcs( exc );
     }
   }
@@ -4375,7 +4368,6 @@
   static void
   Ins_SFVTPV( TT_ExecContext  exc )
   {
-    GUESS_VECTOR( projVector );
     exc->GS.freeVector = exc->GS.projVector;
     Compute_Funcs( exc );
   }
@@ -4404,7 +4396,6 @@
     Normalize( X, Y, &exc->GS.projVector );
 
     exc->GS.dualVector = exc->GS.projVector;
-    GUESS_VECTOR( freeVector );
     Compute_Funcs( exc );
   }
 
@@ -4430,7 +4421,6 @@
     X = S;
 
     Normalize( X, Y, &exc->GS.freeVector );
-    GUESS_VECTOR( projVector );
     Compute_Funcs( exc );
   }
 
@@ -4445,21 +4435,8 @@
   Ins_GPV( TT_ExecContext  exc,
            FT_Long*        args )
   {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      args[0] = exc->GS.both_x_axis ? 0x4000 : 0;
-      args[1] = exc->GS.both_x_axis ? 0 : 0x4000;
-    }
-    else
-    {
-      args[0] = exc->GS.projVector.x;
-      args[1] = exc->GS.projVector.y;
-    }
-#else
     args[0] = exc->GS.projVector.x;
     args[1] = exc->GS.projVector.y;
-#endif
   }
 
 
@@ -4473,21 +4450,8 @@
   Ins_GFV( TT_ExecContext  exc,
            FT_Long*        args )
   {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      args[0] = exc->GS.both_x_axis ? 0x4000 : 0;
-      args[1] = exc->GS.both_x_axis ? 0 : 0x4000;
-    }
-    else
-    {
-      args[0] = exc->GS.freeVector.x;
-      args[1] = exc->GS.freeVector.y;
-    }
-#else
     args[0] = exc->GS.freeVector.x;
     args[1] = exc->GS.freeVector.y;
-#endif
   }
 
 
@@ -4607,7 +4571,7 @@
   /*                                                                       */
   /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
   /* Opcode range: 0x4E                                                    */
-  /* Stack: -->                                                            */
+  /* Stack:        -->                                                     */
   /*                                                                       */
   static void
   Ins_FLIPOFF( TT_ExecContext  exc )
@@ -4842,7 +4806,7 @@
 
     K = FAST_PROJECT( &exc->zp2.cur[L] );
 
-    exc->func_move( exc, &exc->zp2, L, args[1] - K );
+    exc->func_move( exc, &exc->zp2, L, SUB_LONG( args[1], K ) );
 
     /* UNDOCUMENTED!  The MS rasterizer does that with */
     /* twilight points (confirmed by Greg Hitchcock)   */
@@ -4926,13 +4890,13 @@
       }
     }
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
-    if ( SUBPIXEL_HINTING   &&
-         exc->ignore_x_mode &&
-         FT_ABS( D ) == 64  )
+    if ( SUBPIXEL_HINTING_INFINALITY &&
+         exc->ignore_x_mode          &&
+         FT_ABS( D ) == 64           )
       D += 1;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     args[0] = D;
   }
@@ -4966,12 +4930,12 @@
     }
 
     {
-      FT_Vector* v1 = exc->zp1.org + p2;
-      FT_Vector* v2 = exc->zp2.org + p1;
+      FT_Vector*  v1 = exc->zp1.org + p2;
+      FT_Vector*  v2 = exc->zp2.org + p1;
 
 
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
+      A = SUB_LONG( v1->x, v2->x );
+      B = SUB_LONG( v1->y, v2->y );
 
       /* If v1 == v2, SDPvTL behaves the same as */
       /* SVTCA[X], respectively.                 */
@@ -4987,9 +4951,9 @@
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, &exc->GS.dualVector );
@@ -4999,8 +4963,8 @@
       FT_Vector*  v2 = exc->zp2.cur + p1;
 
 
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
+      A = SUB_LONG( v1->x, v2->x );
+      B = SUB_LONG( v1->y, v2->y );
 
       if ( A == 0 && B == 0 )
       {
@@ -5011,13 +4975,12 @@
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, &exc->GS.projVector );
-    GUESS_VECTOR( freeVector );
     Compute_Funcs( exc );
   }
 
@@ -5157,11 +5120,11 @@
   Ins_INSTCTRL( TT_ExecContext  exc,
                 FT_Long*        args )
   {
-    FT_Long  K, L, Kf;
+    FT_ULong  K, L, Kf;
 
 
-    K = args[1];
-    L = args[0];
+    K = (FT_ULong)args[1];
+    L = (FT_ULong)args[0];
 
     /* selector values cannot be `OR'ed;                 */
     /* they are indices starting with index 1, not flags */
@@ -5189,12 +5152,23 @@
     exc->GS.instruct_control &= ~(FT_Byte)Kf;
     exc->GS.instruct_control |= (FT_Byte)L;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    /* INSTCTRL modifying flag 3 also has an effect */
-    /* outside of the CVT program                   */
     if ( K == 3 )
-      exc->ignore_x_mode = FT_BOOL( L == 4 );
+    {
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      /* INSTCTRL modifying flag 3 also has an effect */
+      /* outside of the CVT program                   */
+      if ( SUBPIXEL_HINTING_INFINALITY )
+        exc->ignore_x_mode = FT_BOOL( L == 4 );
 #endif
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      /* Native ClearType fonts sign a waiver that turns off all backward  */
+      /* compatibility hacks and lets them program points to the grid like */
+      /* it's 1996.  They might sign a waiver for just one glyph, though.  */
+      if ( SUBPIXEL_HINTING_MINIMAL )
+        exc->backward_compatibility = !FT_BOOL( L == 4 );
+#endif
+    }
   }
 
 
@@ -5249,14 +5223,14 @@
   /*                                                                       */
   /* SCANTYPE[]:   SCAN TYPE                                               */
   /* Opcode range: 0x8D                                                    */
-  /* Stack:        uint32? -->                                             */
+  /* Stack:        uint16 -->                                              */
   /*                                                                       */
   static void
   Ins_SCANTYPE( TT_ExecContext  exc,
                 FT_Long*        args )
   {
     if ( args[0] >= 0 )
-      exc->GS.scan_type = (FT_Int)args[0];
+      exc->GS.scan_type = (FT_Int)args[0] & 0xFFFF;
   }
 
 
@@ -5279,6 +5253,15 @@
     FT_UShort  point;
 
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* See `ttinterp.h' for details on backward compatibility mode. */
+    if ( SUBPIXEL_HINTING_MINIMAL    &&
+         exc->backward_compatibility &&
+         exc->iupx_called            &&
+         exc->iupy_called            )
+      goto Fail;
+#endif
+
     if ( exc->top < exc->GS.loop )
     {
       if ( exc->pedantic_hinting )
@@ -5325,6 +5308,15 @@
     FT_UShort  I, K, L;
 
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* See `ttinterp.h' for details on backward compatibility mode. */
+    if ( SUBPIXEL_HINTING_MINIMAL    &&
+         exc->backward_compatibility &&
+         exc->iupx_called            &&
+         exc->iupy_called            )
+      return;
+#endif
+
     K = (FT_UShort)args[1];
     L = (FT_UShort)args[0];
 
@@ -5354,6 +5346,15 @@
     FT_UShort  I, K, L;
 
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* See `ttinterp.h' for details on backward compatibility mode. */
+    if ( SUBPIXEL_HINTING_MINIMAL    &&
+         exc->backward_compatibility &&
+         exc->iupx_called            &&
+         exc->iupy_called            )
+      return;
+#endif
+
     K = (FT_UShort)args[1];
     L = (FT_UShort)args[0];
 
@@ -5406,31 +5407,14 @@
 
     d = PROJECT( zp.cur + p, zp.org + p );
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      if ( exc->GS.both_x_axis )
-      {
-        *x = d;
-        *y = 0;
-      }
-      else
-      {
-        *x = 0;
-        *y = d;
-      }
-    }
-    else
-#endif
-    {
-      *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P );
-      *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P );
-    }
+    *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P );
+    *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P );
 
     return SUCCESS;
   }
 
 
+  /* See `ttinterp.h' for details on backward compatibility mode. */
   static void
   Move_Zp2_Point( TT_ExecContext  exc,
                   FT_UShort       point,
@@ -5438,35 +5422,28 @@
                   FT_F26Dot6      dy,
                   FT_Bool         touch )
   {
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      if ( exc->GS.both_x_axis )
-      {
-        exc->zp2.cur[point].x += dx;
-        if ( touch )
-          exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
-      }
-      else
-      {
-        exc->zp2.cur[point].y += dy;
-        if ( touch )
-          exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
-      }
-      return;
-    }
-#endif
-
     if ( exc->GS.freeVector.x != 0 )
     {
-      exc->zp2.cur[point].x += dx;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
+              exc->backward_compatibility ) )
+#endif
+        exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx );
+
       if ( touch )
         exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
     }
 
     if ( exc->GS.freeVector.y != 0 )
     {
-      exc->zp2.cur[point].y += dy;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( !( SUBPIXEL_HINTING_MINIMAL    &&
+              exc->backward_compatibility &&
+              exc->iupx_called            &&
+              exc->iupy_called            ) )
+#endif
+        exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy );
+
       if ( touch )
         exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
     }
@@ -5513,13 +5490,12 @@
         }
       }
       else
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       /* doesn't follow Cleartype spec but produces better result */
-      if ( SUBPIXEL_HINTING   &&
-           exc->ignore_x_mode )
+      if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode )
         Move_Zp2_Point( exc, point, 0, dy, TRUE );
       else
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
         Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
       exc->GS.loop--;
@@ -5647,9 +5623,15 @@
   {
     FT_F26Dot6  dx, dy;
     FT_UShort   point;
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     FT_Int      B1, B2;
 #endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    FT_Bool     in_twilight = FT_BOOL( exc->GS.gep0 == 0 ||
+                                       exc->GS.gep1 == 0 ||
+                                       exc->GS.gep2 == 0 );
+#endif
+
 
 
     if ( exc->top < exc->GS.loop + 1 )
@@ -5659,26 +5641,8 @@
       goto Fail;
     }
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    if ( exc->face->unpatented_hinting )
-    {
-      if ( exc->GS.both_x_axis )
-      {
-        dx = (FT_UInt32)args[0];
-        dy = 0;
-      }
-      else
-      {
-        dx = 0;
-        dy = (FT_UInt32)args[0];
-      }
-    }
-    else
-#endif
-    {
-      dx = TT_MulFix14( args[0], exc->GS.freeVector.x );
-      dy = TT_MulFix14( args[0], exc->GS.freeVector.y );
-    }
+    dx = TT_MulFix14( args[0], exc->GS.freeVector.x );
+    dy = TT_MulFix14( args[0], exc->GS.freeVector.y );
 
     while ( exc->GS.loop > 0 )
     {
@@ -5695,7 +5659,8 @@
         }
       }
       else
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      if ( SUBPIXEL_HINTING_INFINALITY )
       {
         /*  If not using ignore_x_mode rendering, allow ZP2 move.        */
         /*  If inline deltas aren't allowed, skip ZP2 move.              */
@@ -5705,8 +5670,7 @@
         /*   - the glyph is specifically set to allow SHPIX moves        */
         /*   - the move is on a previously Y-touched point               */
 
-        if ( SUBPIXEL_HINTING   &&
-             exc->ignore_x_mode )
+        if ( exc->ignore_x_mode )
         {
           /* save point for later comparison */
           if ( exc->GS.freeVector.y != 0 )
@@ -5729,7 +5693,11 @@
                    ( B1 & 63 ) != 0                                           &&
                    ( B2 & 63 ) != 0                                           &&
                    B1 != B2                                                   )
-                Move_Zp2_Point( exc, point, -dx, -dy, TRUE );
+                Move_Zp2_Point( exc,
+                                point,
+                                NEG_LONG( dx ),
+                                NEG_LONG( dy ),
+                                TRUE );
             }
           }
           else if ( exc->face->sph_compatibility_mode )
@@ -5761,7 +5729,7 @@
               if ( ( B1 & 63 ) == 0 &&
                    ( B2 & 63 ) != 0 &&
                    B1 != B2         )
-                Move_Zp2_Point( exc, point, 0, -dy, TRUE );
+                Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE );
             }
           }
           else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
@@ -5770,15 +5738,30 @@
         else
           Move_Zp2_Point( exc, point, dx, dy, TRUE );
       }
+      else
+#endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+      if ( SUBPIXEL_HINTING_MINIMAL    &&
+           exc->backward_compatibility )
+      {
+        /* Special case: allow SHPIX to move points in the twilight zone.  */
+        /* Otherwise, treat SHPIX the same as DELTAP.  Unbreaks various    */
+        /* fonts such as older versions of Rokkitt and DTL Argo T Light    */
+        /* that would glitch severely after calling ALIGNRP after a        */
+        /* blocked SHPIX.                                                  */
+        if ( in_twilight                                                ||
+             ( !( exc->iupx_called && exc->iupy_called )              &&
+               ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
+                 ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )    ) ) )
+          Move_Zp2_Point( exc, point, 0, dy, TRUE );
+      }
+      else
+#endif
+        Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     Skip:
-
-#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-
-      Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-
+#endif
       exc->GS.loop--;
     }
 
@@ -5798,14 +5781,14 @@
   Ins_MSIRP( TT_ExecContext  exc,
              FT_Long*        args )
   {
-    FT_UShort   point;
+    FT_UShort   point = 0;
     FT_F26Dot6  distance;
-
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    FT_F26Dot6  control_value_cutin = 0; /* pacify compiler */
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    FT_F26Dot6  control_value_cutin = 0;
+    FT_F26Dot6  delta;
 
 
-    if ( SUBPIXEL_HINTING )
+    if ( SUBPIXEL_HINTING_INFINALITY )
     {
       control_value_cutin = exc->GS.control_value_cutin;
 
@@ -5814,8 +5797,7 @@
            !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
         control_value_cutin = 0;
     }
-
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     point = (FT_UShort)args[0];
 
@@ -5838,16 +5820,23 @@
 
     distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    /* subpixel hinting - make MSIRP respect CVT cut-in; */
-    if ( SUBPIXEL_HINTING                                    &&
-         exc->ignore_x_mode                                  &&
-         exc->GS.freeVector.x != 0                           &&
-         FT_ABS( distance - args[1] ) >= control_value_cutin )
-      distance = args[1];
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    delta = SUB_LONG( distance, args[1] );
+    if ( delta < 0 )
+      delta = NEG_LONG( delta );
 
-    exc->func_move( exc, &exc->zp1, point, args[1] - distance );
+    /* subpixel hinting - make MSIRP respect CVT cut-in; */
+    if ( SUBPIXEL_HINTING_INFINALITY  &&
+         exc->ignore_x_mode           &&
+         exc->GS.freeVector.x != 0    &&
+         delta >= control_value_cutin )
+      distance = args[1];
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+
+    exc->func_move( exc,
+                    &exc->zp1,
+                    point,
+                    SUB_LONG( args[1], distance ) );
 
     exc->GS.rp1 = exc->GS.rp0;
     exc->GS.rp2 = point;
@@ -5884,20 +5873,22 @@
     if ( ( exc->opcode & 1 ) != 0 )
     {
       cur_dist = FAST_PROJECT( &exc->zp0.cur[point] );
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      if ( SUBPIXEL_HINTING          &&
-           exc->ignore_x_mode        &&
-           exc->GS.freeVector.x != 0 )
-        distance = Round_None(
-                     exc,
-                     cur_dist,
-                     exc->tt_metrics.compensations[0] ) - cur_dist;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      if ( SUBPIXEL_HINTING_INFINALITY &&
+           exc->ignore_x_mode          &&
+           exc->GS.freeVector.x != 0   )
+        distance = SUB_LONG(
+                     Round_None( exc,
+                                 cur_dist,
+                                 exc->tt_metrics.compensations[0] ),
+                     cur_dist );
       else
 #endif
-        distance = exc->func_round(
-                     exc,
-                     cur_dist,
-                     exc->tt_metrics.compensations[0] ) - cur_dist;
+        distance = SUB_LONG(
+                     exc->func_round( exc,
+                                      cur_dist,
+                                      exc->tt_metrics.compensations[0] ),
+                     cur_dist );
     }
     else
       distance = 0;
@@ -5930,14 +5921,14 @@
     cvtEntry            = (FT_ULong)args[1];
     point               = (FT_UShort)args[0];
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                   &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                        &&
          exc->ignore_x_mode                                 &&
          exc->GS.freeVector.x != 0                          &&
          exc->GS.freeVector.y == 0                          &&
          !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
       control_value_cutin = 0;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     if ( BOUNDS( point,     exc->zp0.n_points ) ||
          BOUNDSL( cvtEntry, exc->cvtSize )      )
@@ -5971,39 +5962,46 @@
 
     if ( exc->GS.gep0 == 0 )   /* If in twilight zone */
     {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */
       /* Determined via experimentation and may be incorrect...         */
-      if ( !SUBPIXEL_HINTING                      ||
-           ( !exc->ignore_x_mode                ||
-             !exc->face->sph_compatibility_mode ) )
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+      if ( !( SUBPIXEL_HINTING_INFINALITY           &&
+              ( exc->ignore_x_mode                &&
+                exc->face->sph_compatibility_mode ) ) )
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
         exc->zp0.org[point].x = TT_MulFix14( distance,
                                              exc->GS.freeVector.x );
       exc->zp0.org[point].y = TT_MulFix14( distance,
                                            exc->GS.freeVector.y ),
       exc->zp0.cur[point]   = exc->zp0.org[point];
     }
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                               &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                    &&
          exc->ignore_x_mode                             &&
          ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) &&
          distance > 0                                   &&
          exc->GS.freeVector.y != 0                      )
       distance = 0;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     org_dist = FAST_PROJECT( &exc->zp0.cur[point] );
 
     if ( ( exc->opcode & 1 ) != 0 )   /* rounding and control cut-in flag */
     {
-      if ( FT_ABS( distance - org_dist ) > control_value_cutin )
+      FT_F26Dot6  delta;
+
+
+      delta = SUB_LONG( distance, org_dist );
+      if ( delta < 0 )
+        delta = NEG_LONG( delta );
+
+      if ( delta > control_value_cutin )
         distance = org_dist;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      if ( SUBPIXEL_HINTING          &&
-           exc->ignore_x_mode        &&
-           exc->GS.freeVector.x != 0 )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      if ( SUBPIXEL_HINTING_INFINALITY &&
+           exc->ignore_x_mode          &&
+           exc->GS.freeVector.x != 0   )
         distance = Round_None( exc,
                                distance,
                                exc->tt_metrics.compensations[0] );
@@ -6014,7 +6012,7 @@
                                     exc->tt_metrics.compensations[0] );
     }
 
-    exc->func_move( exc, &exc->zp0, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) );
 
   Fail:
     exc->GS.rp0 = point;
@@ -6032,19 +6030,19 @@
   Ins_MDRP( TT_ExecContext  exc,
             FT_Long*        args )
   {
-    FT_UShort   point;
+    FT_UShort   point = 0;
     FT_F26Dot6  org_dist, distance, minimum_distance;
 
 
     minimum_distance = exc->GS.minimum_distance;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                   &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                        &&
          exc->ignore_x_mode                                 &&
          exc->GS.freeVector.x != 0                          &&
          !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
       minimum_distance = 0;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     point = (FT_UShort)args[0];
 
@@ -6086,8 +6084,10 @@
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale );
-        vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale );
+        vec.x = FT_MulFix( SUB_LONG( vec1->x, vec2->x ),
+                           exc->metrics.x_scale );
+        vec.y = FT_MulFix( SUB_LONG( vec1->y, vec2->y ),
+                           exc->metrics.y_scale );
 
         org_dist = FAST_DUALPROJ( &vec );
       }
@@ -6095,8 +6095,12 @@
 
     /* single width cut-in test */
 
-    if ( FT_ABS( org_dist - exc->GS.single_width_value ) <
-         exc->GS.single_width_cutin )
+    /* |org_dist - single_width_value| < single_width_cutin */
+    if ( exc->GS.single_width_cutin > 0          &&
+         org_dist < exc->GS.single_width_value +
+                      exc->GS.single_width_cutin &&
+         org_dist > exc->GS.single_width_value -
+                      exc->GS.single_width_cutin )
     {
       if ( org_dist >= 0 )
         org_dist = exc->GS.single_width_value;
@@ -6108,10 +6112,10 @@
 
     if ( ( exc->opcode & 4 ) != 0 )
     {
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-      if ( SUBPIXEL_HINTING          &&
-           exc->ignore_x_mode        &&
-           exc->GS.freeVector.x != 0 )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+      if ( SUBPIXEL_HINTING_INFINALITY &&
+           exc->ignore_x_mode          &&
+           exc->GS.freeVector.x != 0   )
         distance = Round_None(
                      exc,
                      org_dist,
@@ -6140,8 +6144,8 @@
       }
       else
       {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
+        if ( distance > NEG_LONG( minimum_distance ) )
+          distance = NEG_LONG( minimum_distance );
       }
     }
 
@@ -6149,7 +6153,7 @@
 
     org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
-    exc->func_move( exc, &exc->zp1, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp1, point, SUB_LONG( distance, org_dist ) );
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
@@ -6179,25 +6183,25 @@
                 org_dist,
                 control_value_cutin,
                 minimum_distance;
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     FT_Int      B1           = 0; /* pacify compiler */
     FT_Int      B2           = 0;
     FT_Bool     reverse_move = FALSE;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 
     minimum_distance    = exc->GS.minimum_distance;
     control_value_cutin = exc->GS.control_value_cutin;
     point               = (FT_UShort)args[0];
-    cvtEntry            = (FT_ULong)( args[1] + 1 );
+    cvtEntry            = (FT_ULong)( ADD_LONG( args[1], 1 ) );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                   &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                        &&
          exc->ignore_x_mode                                 &&
          exc->GS.freeVector.x != 0                          &&
          !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
       control_value_cutin = minimum_distance = 0;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
 
@@ -6250,8 +6254,8 @@
         cvt_dist = -cvt_dist;
     }
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                          &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                               &&
          exc->ignore_x_mode                                        &&
          exc->GS.freeVector.y != 0                                 &&
          ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) )
@@ -6261,7 +6265,7 @@
       else if ( cur_dist > 64 && cur_dist < 84 )
         cvt_dist += 32;
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     /* control value cut-in and round */
 
@@ -6272,6 +6276,9 @@
 
       if ( exc->GS.gep0 == exc->GS.gep1 )
       {
+        FT_F26Dot6  delta;
+
+
         /* XXX: According to Greg Hitchcock, the following wording is */
         /*      the right one:                                        */
         /*                                                            */
@@ -6284,7 +6291,11 @@
         /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
         /*      it implies `>=' instead of `>'.                       */
 
-        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+        delta = SUB_LONG( cvt_dist, org_dist );
+        if ( delta < 0 )
+          delta = NEG_LONG( delta );
+
+        if ( delta > control_value_cutin )
           cvt_dist = org_dist;
       }
 
@@ -6296,16 +6307,23 @@
     else
     {
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
       /* do cvt cut-in always in MIRP for sph */
-      if ( SUBPIXEL_HINTING             &&
+      if ( SUBPIXEL_HINTING_INFINALITY  &&
            exc->ignore_x_mode           &&
            exc->GS.gep0 == exc->GS.gep1 )
       {
-        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
+        FT_F26Dot6  delta;
+
+
+        delta = SUB_LONG( cvt_dist, org_dist );
+        if ( delta < 0 )
+          delta = NEG_LONG( delta );
+
+        if ( delta > control_value_cutin )
           cvt_dist = org_dist;
       }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       distance = Round_None(
                    exc,
@@ -6324,13 +6342,13 @@
       }
       else
       {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
+        if ( distance > NEG_LONG( minimum_distance ) )
+          distance = NEG_LONG( minimum_distance );
       }
     }
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY )
     {
       B1 = exc->zp1.cur[point].y;
 
@@ -6347,12 +6365,15 @@
            ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
         distance += 64;
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-    exc->func_move( exc, &exc->zp1, point, distance - cur_dist );
+    exc->func_move( exc,
+                    &exc->zp1,
+                    point,
+                    SUB_LONG( distance, cur_dist ) );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY )
     {
       B2 = exc->zp1.cur[point].y;
 
@@ -6373,10 +6394,13 @@
       }
 
       if ( reverse_move )
-        exc->func_move( exc, &exc->zp1, point, -( distance - cur_dist ) );
+        exc->func_move( exc,
+                        &exc->zp1,
+                        point,
+                        SUB_LONG( cur_dist, distance ) );
     }
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
@@ -6401,8 +6425,8 @@
     FT_F26Dot6  distance;
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING                                          &&
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY                               &&
          exc->ignore_x_mode                                        &&
          exc->iup_called                                           &&
          ( exc->sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) )
@@ -6410,7 +6434,7 @@
       exc->error = FT_THROW( Invalid_Reference );
       goto Fail;
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     if ( exc->top < exc->GS.loop                  ||
          BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
@@ -6439,7 +6463,7 @@
         distance = PROJECT( exc->zp1.cur + point,
                             exc->zp0.cur + exc->GS.rp0 );
 
-        exc->func_move( exc, &exc->zp1, point, -distance );
+        exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) );
       }
 
       exc->GS.loop--;
@@ -6496,21 +6520,19 @@
 
     /* Cramer's rule */
 
-    dbx = exc->zp0.cur[b1].x - exc->zp0.cur[b0].x;
-    dby = exc->zp0.cur[b1].y - exc->zp0.cur[b0].y;
+    dbx = SUB_LONG( exc->zp0.cur[b1].x, exc->zp0.cur[b0].x );
+    dby = SUB_LONG( exc->zp0.cur[b1].y, exc->zp0.cur[b0].y );
 
-    dax = exc->zp1.cur[a1].x - exc->zp1.cur[a0].x;
-    day = exc->zp1.cur[a1].y - exc->zp1.cur[a0].y;
+    dax = SUB_LONG( exc->zp1.cur[a1].x, exc->zp1.cur[a0].x );
+    day = SUB_LONG( exc->zp1.cur[a1].y, exc->zp1.cur[a0].y );
 
-    dx = exc->zp0.cur[b0].x - exc->zp1.cur[a0].x;
-    dy = exc->zp0.cur[b0].y - exc->zp1.cur[a0].y;
+    dx = SUB_LONG( exc->zp0.cur[b0].x, exc->zp1.cur[a0].x );
+    dy = SUB_LONG( exc->zp0.cur[b0].y, exc->zp1.cur[a0].y );
 
-    exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
-
-    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
-                   FT_MulDiv( day, dbx, 0x40 );
-    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +
-                   FT_MulDiv( day, dby, 0x40 );
+    discriminant = ADD_LONG( FT_MulDiv( dax, NEG_LONG( dby ), 0x40 ),
+                             FT_MulDiv( day, dbx, 0x40 ) );
+    dotproduct   = ADD_LONG( FT_MulDiv( dax, dbx, 0x40 ),
+                             FT_MulDiv( day, dby, 0x40 ) );
 
     /* The discriminant above is actually a cross product of vectors     */
     /* da and db. Together with the dot product, they can be used as     */
@@ -6520,29 +6542,32 @@
     /*       discriminant = |da||db|sin(angle)     .                     */
     /* We use these equations to reject grazing intersections by         */
     /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
-    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
+    if ( MUL_LONG( 19, FT_ABS( discriminant ) ) > FT_ABS( dotproduct ) )
     {
-      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
+      val = ADD_LONG( FT_MulDiv( dx, NEG_LONG( dby ), 0x40 ),
+                      FT_MulDiv( dy, dbx, 0x40 ) );
 
       R.x = FT_MulDiv( val, dax, discriminant );
       R.y = FT_MulDiv( val, day, discriminant );
 
-      exc->zp2.cur[point].x = exc->zp1.cur[a0].x + R.x;
-      exc->zp2.cur[point].y = exc->zp1.cur[a0].y + R.y;
+      /* XXX: Block in backward_compatibility and/or post-IUP? */
+      exc->zp2.cur[point].x = ADD_LONG( exc->zp1.cur[a0].x, R.x );
+      exc->zp2.cur[point].y = ADD_LONG( exc->zp1.cur[a0].y, R.y );
     }
     else
     {
       /* else, take the middle of the middles of A and B */
 
-      exc->zp2.cur[point].x = ( exc->zp1.cur[a0].x +
-                                exc->zp1.cur[a1].x +
-                                exc->zp0.cur[b0].x +
-                                exc->zp0.cur[b1].x ) / 4;
-      exc->zp2.cur[point].y = ( exc->zp1.cur[a0].y +
-                                exc->zp1.cur[a1].y +
-                                exc->zp0.cur[b0].y +
-                                exc->zp0.cur[b1].y ) / 4;
+      /* XXX: Block in backward_compatibility and/or post-IUP? */
+      exc->zp2.cur[point].x =
+        ADD_LONG( ADD_LONG( exc->zp1.cur[a0].x, exc->zp1.cur[a1].x ),
+                  ADD_LONG( exc->zp0.cur[b0].x, exc->zp0.cur[b1].x ) ) / 4;
+      exc->zp2.cur[point].y =
+        ADD_LONG( ADD_LONG( exc->zp1.cur[a0].y, exc->zp1.cur[a1].y ),
+                  ADD_LONG( exc->zp0.cur[b0].y, exc->zp0.cur[b1].y ) ) / 4;
     }
+
+    exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
   }
 
 
@@ -6574,7 +6599,7 @@
     distance = PROJECT( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2;
 
     exc->func_move( exc, &exc->zp1, p1, distance );
-    exc->func_move( exc, &exc->zp0, p2, -distance );
+    exc->func_move( exc, &exc->zp0, p2, NEG_LONG( distance ) );
   }
 
 
@@ -6608,7 +6633,9 @@
      * Otherwise, by definition, the value of exc->twilight.orus[n] is (0,0),
      * for every n.
      */
-    twilight = exc->GS.gep0 == 0 || exc->GS.gep1 == 0 || exc->GS.gep2 == 0;
+    twilight = ( exc->GS.gep0 == 0 ||
+                 exc->GS.gep1 == 0 ||
+                 exc->GS.gep2 == 0 );
 
     if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
     {
@@ -6645,9 +6672,11 @@
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( exc->zp1.orus[exc->GS.rp2].x - orus_base->x,
+        vec.x = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].x,
+                                     orus_base->x ),
                            exc->metrics.x_scale );
-        vec.y = FT_MulFix( exc->zp1.orus[exc->GS.rp2].y - orus_base->y,
+        vec.y = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].y,
+                                     orus_base->y ),
                            exc->metrics.y_scale );
 
         old_range = FAST_DUALPROJ( &vec );
@@ -6656,7 +6685,7 @@
       cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base );
     }
 
-    for ( ; exc->GS.loop > 0; --exc->GS.loop )
+    for ( ; exc->GS.loop > 0; exc->GS.loop-- )
     {
       FT_UInt     point = (FT_UInt)exc->stack[--exc->args];
       FT_F26Dot6  org_dist, cur_dist, new_dist;
@@ -6682,9 +6711,11 @@
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( exc->zp2.orus[point].x - orus_base->x,
+        vec.x = FT_MulFix( SUB_LONG( exc->zp2.orus[point].x,
+                                     orus_base->x ),
                            exc->metrics.x_scale );
-        vec.y = FT_MulFix( exc->zp2.orus[point].y - orus_base->y,
+        vec.y = FT_MulFix( SUB_LONG( exc->zp2.orus[point].y,
+                                     orus_base->y ),
                            exc->metrics.y_scale );
 
         org_dist = FAST_DUALPROJ( &vec );
@@ -6723,7 +6754,7 @@
       exc->func_move( exc,
                       &exc->zp2,
                       (FT_UShort)point,
-                      new_dist - cur_dist );
+                      SUB_LONG( new_dist, cur_dist ) );
     }
 
   Fail:
@@ -6788,14 +6819,14 @@
     FT_F26Dot6  dx;
 
 
-    dx = worker->curs[p].x - worker->orgs[p].x;
+    dx = SUB_LONG( worker->curs[p].x, worker->orgs[p].x );
     if ( dx != 0 )
     {
       for ( i = p1; i < p; i++ )
-        worker->curs[i].x += dx;
+        worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx );
 
       for ( i = p + 1; i <= p2; i++ )
-        worker->curs[i].x += dx;
+        worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx );
     }
   }
 
@@ -6840,8 +6871,8 @@
     org2   = worker->orgs[ref2].x;
     cur1   = worker->curs[ref1].x;
     cur2   = worker->curs[ref2].x;
-    delta1 = cur1 - org1;
-    delta2 = cur2 - org2;
+    delta1 = SUB_LONG( cur1, org1 );
+    delta2 = SUB_LONG( cur2, org2 );
 
     if ( cur1 == cur2 || orus1 == orus2 )
     {
@@ -6853,10 +6884,10 @@
 
 
         if ( x <= org1 )
-          x += delta1;
+          x = ADD_LONG( x, delta1 );
 
         else if ( x >= org2 )
-          x += delta2;
+          x = ADD_LONG( x, delta2 );
 
         else
           x = cur1;
@@ -6877,20 +6908,23 @@
 
 
         if ( x <= org1 )
-          x += delta1;
+          x = ADD_LONG( x, delta1 );
 
         else if ( x >= org2 )
-          x += delta2;
+          x = ADD_LONG( x, delta2 );
 
         else
         {
           if ( !scale_valid )
           {
             scale_valid = 1;
-            scale       = FT_DivFix( cur2 - cur1, orus2 - orus1 );
+            scale       = FT_DivFix( SUB_LONG( cur2, cur1 ),
+                                     SUB_LONG( orus2, orus1 ) );
           }
 
-          x = cur1 + FT_MulFix( worker->orus[i].x - orus1, scale );
+          x = ADD_LONG( cur1,
+                        FT_MulFix( SUB_LONG( worker->orus[i].x, orus1 ),
+                                   scale ) );
         }
         worker->curs[i].x = x;
       }
@@ -6920,6 +6954,23 @@
     FT_Short  contour;       /* current contour */
 
 
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* See `ttinterp.h' for details on backward compatibility mode.  */
+    /* Allow IUP until it has been called on both axes.  Immediately */
+    /* return on subsequent ones.                                    */
+    if ( SUBPIXEL_HINTING_MINIMAL    &&
+         exc->backward_compatibility )
+    {
+      if ( exc->iupx_called && exc->iupy_called )
+        return;
+
+      if ( exc->opcode & 1 )
+        exc->iupx_called = TRUE;
+      else
+        exc->iupy_called = TRUE;
+    }
+#endif
+
     /* ignore empty outlines */
     if ( exc->pts.n_contours == 0 )
       return;
@@ -6943,15 +6994,15 @@
     contour = 0;
     point   = 0;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    if ( SUBPIXEL_HINTING   &&
-         exc->ignore_x_mode )
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    if ( SUBPIXEL_HINTING_INFINALITY &&
+         exc->ignore_x_mode          )
     {
       exc->iup_called = TRUE;
       if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP )
         return;
     }
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     do
     {
@@ -7023,37 +7074,16 @@
     FT_UShort  A;
     FT_ULong   C, P;
     FT_Long    B;
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     FT_UShort  B1, B2;
 
 
-    if ( SUBPIXEL_HINTING                                         &&
+    if ( SUBPIXEL_HINTING_INFINALITY                              &&
          exc->ignore_x_mode                                       &&
          exc->iup_called                                          &&
          ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) )
       goto Fail;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-
-
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    /* Delta hinting is covered by US Patent 5159668. */
-    if ( exc->face->unpatented_hinting )
-    {
-      FT_Long  n = args[0] * 2;
-
-
-      if ( exc->args < n )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        n = exc->args;
-      }
-
-      exc->args -= n;
-      exc->new_top = exc->args;
-      return;
-    }
-#endif
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     P    = (FT_ULong)exc->func_cur_ppem( exc );
     nump = (FT_ULong)args[0];   /* some points theoretically may occur more
@@ -7107,9 +7137,9 @@
             B++;
           B *= 1L << ( 6 - exc->GS.delta_shift );
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
-          if ( SUBPIXEL_HINTING )
+          if ( SUBPIXEL_HINTING_INFINALITY )
           {
             /*
              *  Allow delta move if
@@ -7162,13 +7192,29 @@
                          SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
                        ( B1 & 63 ) != 0                           &&
                        ( B2 & 63 ) != 0                           ) ) )
-                exc->func_move( exc, &exc->zp0, A, -B );
+                exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) );
             }
           }
           else
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-            exc->func_move( exc, &exc->zp0, A, B );
+          {
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+            /* See `ttinterp.h' for details on backward compatibility */
+            /* mode.                                                  */
+            if ( SUBPIXEL_HINTING_MINIMAL    &&
+                 exc->backward_compatibility )
+            {
+              if ( !( exc->iupx_called && exc->iupy_called )              &&
+                   ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
+                     ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y )        ) )
+                exc->func_move( exc, &exc->zp0, A, B );
+            }
+            else
+#endif
+              exc->func_move( exc, &exc->zp0, A, B );
+          }
         }
       }
       else
@@ -7196,26 +7242,6 @@
     FT_Long   B;
 
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    /* Delta hinting is covered by US Patent 5159668. */
-    if ( exc->face->unpatented_hinting )
-    {
-      FT_Long  n = args[0] * 2;
-
-
-      if ( exc->args < n )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        n = exc->args;
-      }
-
-      exc->args -= n;
-      exc->new_top = exc->args;
-      return;
-    }
-#endif
-
     P    = (FT_ULong)exc->func_cur_ppem( exc );
     nump = (FT_ULong)args[0];
 
@@ -7304,24 +7330,25 @@
   Ins_GETINFO( TT_ExecContext  exc,
                FT_Long*        args )
   {
-    FT_Long  K;
+    FT_Long    K;
+    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( exc->face );
 
 
     K = 0;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /********************************/
     /* RASTERIZER VERSION           */
     /* Selector Bit:  0             */
     /* Return Bit(s): 0-7           */
     /*                              */
-    if ( SUBPIXEL_HINTING      &&
-         ( args[0] & 1 ) != 0  &&
-         exc->subpixel_hinting )
+    if ( SUBPIXEL_HINTING_INFINALITY &&
+         ( args[0] & 1 ) != 0        &&
+         exc->subpixel_hinting       )
     {
       if ( exc->ignore_x_mode )
       {
-        /* if in ClearType backwards compatibility mode,        */
+        /* if in ClearType backward compatibility mode,         */
         /* we sometimes change the TrueType version dynamically */
         K = exc->rasterizer_version;
         FT_TRACE6(( "Setting rasterizer version %d\n",
@@ -7331,9 +7358,9 @@
         K = TT_INTERPRETER_VERSION_38;
     }
     else
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
       if ( ( args[0] & 1 ) != 0 )
-        K = TT_INTERPRETER_VERSION_35;
+        K = driver->interpreter_version;
 
     /********************************/
     /* GLYPH ROTATED                */
@@ -7341,7 +7368,7 @@
     /* Return Bit(s): 8             */
     /*                              */
     if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated )
-      K |= 0x80;
+      K |= 1 << 8;
 
     /********************************/
     /* GLYPH STRETCHED              */
@@ -7349,19 +7376,87 @@
     /* Return Bit(s): 9             */
     /*                              */
     if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched )
-      K |= 1 << 8;
+      K |= 1 << 9;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    /********************************/
+    /* VARIATION GLYPH              */
+    /* Selector Bit:  3             */
+    /* Return Bit(s): 10            */
+    /*                              */
+    /* XXX: UNDOCUMENTED!           */
+    if ( (args[0] & 8 ) != 0 && exc->face->blend )
+      K |= 1 << 10;
+#endif
 
     /********************************/
-    /* HINTING FOR GRAYSCALE        */
+    /* BI-LEVEL HINTING AND         */
+    /* GRAYSCALE RENDERING          */
     /* Selector Bit:  5             */
     /* Return Bit(s): 12            */
     /*                              */
     if ( ( args[0] & 32 ) != 0 && exc->grayscale )
       K |= 1 << 12;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /* Toggle the following flags only outside of monochrome mode.      */
+    /* Otherwise, instructions may behave weirdly and rendering results */
+    /* may differ between v35 and v40 mode, e.g., in `Times New Roman   */
+    /* Bold Italic'. */
+    if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean )
+    {
+      /********************************/
+      /* HINTING FOR SUBPIXEL         */
+      /* Selector Bit:  6             */
+      /* Return Bit(s): 13            */
+      /*                              */
+      /* v40 does subpixel hinting by default. */
+      if ( ( args[0] & 64 ) != 0 )
+        K |= 1 << 13;
 
-    if ( SUBPIXEL_HINTING                                     &&
+      /********************************/
+      /* VERTICAL LCD SUBPIXELS?      */
+      /* Selector Bit:  8             */
+      /* Return Bit(s): 15            */
+      /*                              */
+      if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd_lean )
+        K |= 1 << 15;
+
+      /********************************/
+      /* SUBPIXEL POSITIONED?         */
+      /* Selector Bit:  10            */
+      /* Return Bit(s): 17            */
+      /*                              */
+      /* XXX: FreeType supports it, dependent on what client does? */
+      if ( ( args[0] & 1024 ) != 0 )
+        K |= 1 << 17;
+
+      /********************************/
+      /* SYMMETRICAL SMOOTHING        */
+      /* Selector Bit:  11            */
+      /* Return Bit(s): 18            */
+      /*                              */
+      /* The only smoothing method FreeType supports unless someone sets */
+      /* FT_LOAD_TARGET_MONO.                                            */
+      if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean )
+        K |= 1 << 18;
+
+      /********************************/
+      /* CLEARTYPE HINTING AND        */
+      /* GRAYSCALE RENDERING          */
+      /* Selector Bit:  12            */
+      /* Return Bit(s): 19            */
+      /*                              */
+      /* Grayscale rendering is what FreeType does anyway unless someone */
+      /* sets FT_LOAD_TARGET_MONO or FT_LOAD_TARGET_LCD(_V)              */
+      if ( ( args[0] & 4096 ) != 0 && exc->grayscale_cleartype )
+        K |= 1 << 19;
+    }
+#endif
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+
+    if ( SUBPIXEL_HINTING_INFINALITY                          &&
          exc->rasterizer_version >= TT_INTERPRETER_VERSION_35 )
     {
 
@@ -7434,12 +7529,71 @@
       }
     }
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
     args[0] = K;
   }
 
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GETVARIATION[]: get normalized variation (blend) coordinates          */
+  /* Opcode range: 0x91                                                    */
+  /* Stack:        --> f2.14...                                            */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED!  There is no official documentation from Apple for */
+  /*      this bytecode instruction.  Active only if a font has GX         */
+  /*      variation axes.                                                  */
+  /*                                                                       */
+  static void
+  Ins_GETVARIATION( TT_ExecContext  exc,
+                    FT_Long*        args )
+  {
+    FT_UInt    num_axes = exc->face->blend->num_axis;
+    FT_Fixed*  coords   = exc->face->blend->normalizedcoords;
+
+    FT_UInt  i;
+
+
+    if ( BOUNDS( num_axes, exc->stackSize + 1 - exc->top ) )
+    {
+      exc->error = FT_THROW( Stack_Overflow );
+      return;
+    }
+
+    if ( coords )
+    {
+      for ( i = 0; i < num_axes; i++ )
+        args[i] = coords[i] >> 2; /* convert 16.16 to 2.14 format */
+    }
+    else
+    {
+      for ( i = 0; i < num_axes; i++ )
+        args[i] = 0;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GETDATA[]:    no idea what this is good for                           */
+  /* Opcode range: 0x92                                                    */
+  /* Stack:        --> 17                                                  */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED!  There is no documentation from Apple for this     */
+  /*      very weird bytecode instruction.                                 */
+  /*                                                                       */
+  static void
+  Ins_GETDATA( FT_Long*  args )
+  {
+    args[0] = 17;
+  }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
   static void
   Ins_UNKNOWN( TT_ExecContext  exc )
   {
@@ -7513,10 +7667,11 @@
   FT_EXPORT_DEF( FT_Error )
   TT_RunIns( TT_ExecContext  exc )
   {
-    FT_Long    ins_counter = 0;  /* executed instructions counter */
+    FT_ULong   ins_counter = 0;  /* executed instructions counter */
+    FT_ULong   num_twilight_points;
     FT_UShort  i;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     FT_Byte    opcode_pattern[1][2] = {
                   /* #8 TypeMan Talk Align */
                   {
@@ -7527,12 +7682,88 @@
     FT_UShort  opcode_patterns   = 1;
     FT_UShort  opcode_pointer[1] = { 0 };
     FT_UShort  opcode_size[1]    = { 1 };
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     exc->iup_called = FALSE;
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /*
+     *  Toggle backward compatibility according to what font wants, except
+     *  when
+     *
+     *  1) we have a `tricky' font that heavily relies on the interpreter to
+     *     render glyphs correctly, for example DFKai-SB, or
+     *  2) FT_RENDER_MODE_MONO (i.e, monochome rendering) is requested.
+     *
+     *  In those cases, backward compatibility needs to be turned off to get
+     *  correct rendering.  The rendering is then completely up to the
+     *  font's programming.
+     *
+     */
+    if ( SUBPIXEL_HINTING_MINIMAL          &&
+         exc->subpixel_hinting_lean        &&
+         !FT_IS_TRICKY( &exc->face->root ) )
+      exc->backward_compatibility = !( exc->GS.instruct_control & 4 );
+    else
+      exc->backward_compatibility = FALSE;
+
+    exc->iupx_called = FALSE;
+    exc->iupy_called = FALSE;
+#endif
+
+    /* We restrict the number of twilight points to a reasonable,     */
+    /* heuristic value to avoid slow execution of malformed bytecode. */
+    num_twilight_points = FT_MAX( 30,
+                                  2 * ( exc->pts.n_points + exc->cvtSize ) );
+    if ( exc->twilight.n_points > num_twilight_points )
+    {
+      if ( num_twilight_points > 0xFFFFU )
+        num_twilight_points = 0xFFFFU;
+
+      FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n"
+                  "           from %d to the more reasonable value %d\n",
+                  exc->twilight.n_points,
+                  num_twilight_points ));
+      exc->twilight.n_points = (FT_UShort)num_twilight_points;
+    }
+
+    /* Set up loop detectors.  We restrict the number of LOOPCALL loops */
+    /* and the number of JMPR, JROT, and JROF calls with a negative     */
+    /* argument to values that depend on various parameters like the    */
+    /* size of the CVT table or the number of points in the current     */
+    /* glyph (if applicable).                                           */
+    /*                                                                  */
+    /* The idea is that in real-world bytecode you either iterate over  */
+    /* all CVT entries (in the `prep' table), or over all points (or    */
+    /* contours, in the `glyf' table) of a glyph, and such iterations   */
+    /* don't happen very often.                                         */
+    exc->loopcall_counter = 0;
+    exc->neg_jump_counter = 0;
+
+    /* The maximum values are heuristic. */
+    if ( exc->pts.n_points )
+      exc->loopcall_counter_max = FT_MAX( 50,
+                                          10 * exc->pts.n_points ) +
+                                  FT_MAX( 50,
+                                          exc->cvtSize / 10 );
+    else
+      exc->loopcall_counter_max = 300 + 8 * exc->cvtSize;
+
+    /* as a protection against an unreasonable number of CVT entries  */
+    /* we assume at most 100 control values per glyph for the counter */
+    if ( exc->loopcall_counter_max >
+         100 * (FT_ULong)exc->face->root.num_glyphs )
+      exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs;
+
+    FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL"
+                " to %d\n", exc->loopcall_counter_max ));
+
+    exc->neg_jump_counter_max = exc->loopcall_counter_max;
+    FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps"
+                " to %d\n", exc->neg_jump_counter_max ));
 
     /* set PPEM and CVT functions */
     exc->tt_metrics.ratio = 0;
@@ -7575,7 +7806,7 @@
                               ? 2
                               : 12 - ( *opcode_name[exc->opcode] - '0' ),
                               "#" ));
-        for ( n = 0; n < cnt; n++ )
+        for ( n = 1; n <= cnt; n++ )
           FT_TRACE7(( " %d", exc->stack[exc->top - n] ));
         FT_TRACE6(( "\n" ));
       }
@@ -7611,7 +7842,21 @@
         exc->args = 0;
       }
 
-      exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      if ( exc->opcode == 0x91 )
+      {
+        /* this is very special: GETVARIATION returns */
+        /* a variable number of arguments             */
+
+        /* it is the job of the application to `activate' GX handling, */
+        /* this is, calling any of the GX API functions on the current */
+        /* font to select a variation instance                         */
+        if ( exc->face->blend )
+          exc->new_top = exc->args + exc->face->blend->num_axis;
+      }
+      else
+#endif
+        exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 );
 
       /* `new_top' is the new top of the stack, after the instruction's */
       /* execution.  `top' will be set to `new_top' after the `switch'  */
@@ -7625,9 +7870,9 @@
       exc->step_ins = TRUE;
       exc->error    = FT_Err_Ok;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
-      if ( SUBPIXEL_HINTING )
+      if ( SUBPIXEL_HINTING_INFINALITY )
       {
         for ( i = 0; i < opcode_patterns; i++ )
         {
@@ -7656,7 +7901,7 @@
         }
       }
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       {
         FT_Long*  args   = exc->stack + exc->args;
@@ -7804,7 +8049,7 @@
           Ins_ALIGNPTS( exc, args );
           break;
 
-        case 0x28:  /* ???? */
+        case 0x28:  /* RAW */
           Ins_UNKNOWN( exc );
           break;
 
@@ -8156,10 +8401,33 @@
           Ins_INSTCTRL( exc, args );
           break;
 
-        case 0x8F:
+        case 0x8F:  /* ADJUST */
+        case 0x90:  /* ADJUST */
           Ins_UNKNOWN( exc );
           break;
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+        case 0x91:
+          /* it is the job of the application to `activate' GX handling, */
+          /* this is, calling any of the GX API functions on the current */
+          /* font to select a variation instance                         */
+          if ( exc->face->blend )
+            Ins_GETVARIATION( exc, args );
+          else
+            Ins_UNKNOWN( exc );
+          break;
+
+        case 0x92:
+          /* there is at least one MS font (LaoUI.ttf version 5.01) that */
+          /* uses IDEFs for 0x91 and 0x92; for this reason we activate   */
+          /* GETDATA for GX fonts only, similar to GETVARIATION          */
+          if ( exc->face->blend )
+            Ins_GETDATA( args );
+          else
+            Ins_UNKNOWN( exc );
+          break;
+#endif
+
         default:
           if ( opcode >= 0xE0 )
             Ins_MIRP( exc, args );
@@ -8240,7 +8508,7 @@
 
       /* increment instruction counter and check if we didn't */
       /* run this program for too long (e.g. infinite loops). */
-      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+      if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES )
         return FT_THROW( Execution_Too_Long );
 
     LSuiteLabel_:
@@ -8257,29 +8525,27 @@
     } while ( !exc->instruction_trap );
 
   LNo_Error_:
+    FT_TRACE4(( "  %d instruction%s executed\n",
+                ins_counter,
+                ins_counter == 1 ? "" : "s" ));
     return FT_Err_Ok;
 
   LErrorCodeOverflow_:
     exc->error = FT_THROW( Code_Overflow );
 
   LErrorLabel_:
-    /* If any errors have occurred, function tables may be broken. */
-    /* Force a re-execution of `prep' and `fpgm' tables if no      */
-    /* bytecode debugger is run.                                   */
-    if ( exc->error                          &&
-         !exc->instruction_trap              &&
-         exc->curRange == tt_coderange_glyph )
-    {
+    if ( exc->error && !exc->instruction_trap )
       FT_TRACE1(( "  The interpreter returned error 0x%x\n", exc->error ));
-      exc->size->bytecode_ready = -1;
-      exc->size->cvt_ready      = -1;
-    }
 
     return exc->error;
   }
 
+#else /* !TT_USE_BYTECODE_INTERPRETER */
 
-#endif /* TT_USE_BYTECODE_INTERPRETER */
+  /* ANSI C doesn't like empty source files */
+  typedef int  _tt_interp_dummy;
+
+#endif /* !TT_USE_BYTECODE_INTERPRETER */
 
 
 /* END */
diff --git a/src/truetype/ttinterp.h b/src/truetype/ttinterp.h
index 32706d0..2966439 100644
--- a/src/truetype/ttinterp.h
+++ b/src/truetype/ttinterp.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType bytecode interpreter (specification).                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTINTERP_H__
-#define __TTINTERP_H__
+#ifndef TTINTERP_H_
+#define TTINTERP_H_
 
 #include <ft2build.h>
 #include "ttobjs.h"
@@ -99,7 +99,7 @@
   } TT_CallRec, *TT_CallStack;
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
   /*************************************************************************/
   /*                                                                       */
@@ -138,7 +138,7 @@
 
   } SPH_Font_Class;
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 
   /*************************************************************************/
@@ -170,6 +170,7 @@
                        pts,
                        twilight;
 
+    FT_Long            pointSize;  /* in 26.6 format */
     FT_Size_Metrics    metrics;
     TT_Size_Metrics    tt_metrics; /* size metrics */
 
@@ -247,9 +248,151 @@
     TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */
     TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */
 
-    FT_Bool            grayscale;      /* are we hinting for grayscale? */
+    FT_Bool            grayscale;      /* bi-level hinting and */
+                                       /* grayscale rendering  */
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    /*
+     * FreeType supports ClearType-like hinting of TrueType fonts through
+     * the version 40 interpreter.  This is achieved through several hacks
+     * in the base (v35) interpreter, as detailed below.
+     *
+     * ClearType is an umbrella term for several rendering techniques
+     * employed by Microsoft's various GUI and rendering toolkit
+     * implementations, most importantly: subpixel rendering for using the
+     * RGB subpixels of LCDs to approximately triple the perceived
+     * resolution on the x-axis and subpixel hinting for positioning stems
+     * on subpixel borders.  TrueType programming is explicit, i.e., fonts
+     * must be programmed to take advantage of ClearType's possibilities.
+     *
+     * When ClearType was introduced, it seemed unlikely that all fonts
+     * would be reprogrammed, so Microsoft decided to implement a backward
+     * compatibility mode.  It employs several simple to complicated
+     * assumptions and tricks, many of them font-dependent, that modify the
+     * interpretation of the bytecode contained in these fonts to retrofit
+     * them into a ClearType-y look.  The quality of the results varies.
+     * Most (web)fonts that were released since then have come to rely on
+     * these hacks to render correctly, even some of Microsoft's flagship
+     * fonts (e.g., Calibri, Cambria, Segoe UI).
+     *
+     * FreeType's minimal subpixel hinting code (interpreter version 40)
+     * employs a small list of font-agnostic hacks loosely based on the
+     * public information available on Microsoft's compatibility mode[2].
+     * The focus is on modern (web)fonts rather than legacy fonts that were
+     * made for monochrome rendering.  It will not match ClearType rendering
+     * exactly.  Unlike the `Infinality' code (interpreter version 38) that
+     * came before, it will not try to toggle hacks for specific fonts for
+     * performance and complexity reasons.  It will fall back to version 35
+     * behavior for tricky fonts[1] or when monochrome rendering is
+     * requested.
+     *
+     * Major hacks
+     *
+     * - Any point movement on the x axis is ignored (cf. `Direct_Move' and
+     *   `Direct_Move_X').  This has the smallest code footprint and single
+     *   biggest effect.  The ClearType way to increase resolution is
+     *   supersampling the x axis, the FreeType way is ignoring instructions
+     *   on the x axis, which gives the same result in the majority of
+     *   cases.
+     *
+     * - Points are not moved post-IUP (neither on the x nor on the y axis),
+     *   except the x component of diagonal moves post-IUP (cf.
+     *   `Direct_Move', `Direct_Move_Y', `Move_Zp2_Point').  Post-IUP
+     *   changes are commonly used to `fix' pixel patterns which has little
+     *   use outside monochrome rendering.
+     *
+     * - SHPIX and DELTAP don't execute unless moving a composite on the
+     *   y axis or moving a previously y touched point.  SHPIX additionally
+     *   denies movement on the x axis (cf. `Ins_SHPIX' and `Ins_DELTAP').
+     *   Both instructions are commonly used to `fix' pixel patterns for
+     *   monochrome or Windows's GDI rendering but make little sense for
+     *   FreeType rendering.  Both can distort the outline.  See [2] for
+     *   details.
+     *
+     * - The hdmx table and modifications to phantom points are ignored.
+     *   Bearings and advance widths remain unchanged (except rounding them
+     *   outside the interpreter!), cf. `compute_glyph_metrics' and
+     *   `TT_Hint_Glyph'.  Letting non-native-ClearType fonts modify spacing
+     *   might mess up spacing.
+     *
+     * Minor hacks
+     *
+     * - FLIPRGON, FLIPRGOFF, and FLIPPT don't execute post-IUP.  This
+     *   prevents dents in e.g. Arial-Regular's `D' and `G' glyphs at
+     *   various sizes.
+     *
+     * (Post-IUP is the state after both IUP[x] and IUP[y] have been
+     * executed.)
+     *
+     * The best results are achieved for fonts that were from the outset
+     * designed with ClearType in mind, meaning they leave the x axis mostly
+     * alone and don't mess with the `final' outline to produce more
+     * pleasing pixel patterns.  The harder the designer tried to produce
+     * very specific patterns (`superhinting') for pre-ClearType-displays,
+     * the worse the results.
+     *
+     * Microsoft defines a way to turn off backward compatibility and
+     * interpret instructions as before (called `native ClearType')[2][3].
+     * The font designer then regains full control and is responsible for
+     * making the font work correctly with ClearType without any
+     * hand-holding by the interpreter or rasterizer[4].  The v40
+     * interpreter assumes backward compatibility by default, which can be
+     * turned off the same way by executing the following in the control
+     * program (cf. `Ins_INSTCTRL').
+     *
+     *   #PUSH 4,3
+     *   INSTCTRL[]
+     *
+     * [1] Tricky fonts as FreeType defines them rely on the bytecode
+     *     interpreter to display correctly.  Hacks can interfere with them,
+     *     so they get treated like native ClearType fonts (v40 with
+     *     backward compatibility turned off).  Cf. `TT_RunIns'.
+     *
+     * [2] Proposed by Microsoft's Greg Hitchcock in
+     *     https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+     *
+     * [3] Beat Stamm describes it in more detail:
+     *     http://www.beatstamm.com/typography/RTRCh4.htm#Sec12
+     *
+     * [4] The list of `native ClearType' fonts is small at the time of this
+     *     writing; I found the following on a Windows 10 Update 1511
+     *     installation: Constantia, Corbel, Sitka, Malgun Gothic, Microsoft
+     *     JhengHei (Bold and UI Bold), Microsoft YaHei (Bold and UI Bold),
+     *     SimSun, NSimSun, and Yu Gothic.
+     *
+     */
+
+    /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been
+     * requested.  Used to detect interpreter */
+    /* version switches.  `_lean' to differentiate from the Infinality */
+    /* `subpixel_hinting', which is managed differently.               */
+    FT_Bool            subpixel_hinting_lean;
+
+    /* Long side of a LCD subpixel is vertical (e.g., screen is rotated). */
+    /* `_lean' to differentiate from the Infinality `vertical_lcd', which */
+    /* is managed differently.                                            */
+    FT_Bool            vertical_lcd_lean;
+
+    /* Default to backward compatibility mode in v40 interpreter.  If   */
+    /* this is false, it implies the interpreter is in v35 or in native */
+    /* ClearType mode.                                                  */
+    FT_Bool            backward_compatibility;
+
+    /* Useful for detecting and denying post-IUP trickery that is usually */
+    /* used to fix pixel patterns (`superhinting').                       */
+    FT_Bool            iupx_called;
+    FT_Bool            iupy_called;
+
+    /* ClearType hinting and grayscale rendering, as used by Universal */
+    /* Windows Platform apps (Windows 8 and above).  Like the standard */
+    /* colorful ClearType mode, it utilizes a vastly increased virtual */
+    /* resolution on the x axis.  Different from bi-level hinting and  */
+    /* grayscale rendering, the old mode from Win9x days that roughly  */
+    /* adheres to the physical pixel grid on both axes.                */
+    FT_Bool            grayscale_cleartype;
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */
+
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     TT_Round_Func      func_round_sphn;   /* subpixel rounding function */
 
     FT_Bool            subpixel_hinting;  /* Using subpixel hinting?       */
@@ -279,7 +422,15 @@
     FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */
                                               /* special functions         */
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
+
+    /* We maintain two counters (in addition to the instruction counter) */
+    /* that act as loop detectors for LOOPCALL and jump opcodes with     */
+    /* negative arguments.                                               */
+    FT_ULong           loopcall_counter;
+    FT_ULong           loopcall_counter_max;
+    FT_ULong           neg_jump_counter;
+    FT_ULong           neg_jump_counter_max;
 
   } TT_ExecContextRec;
 
@@ -382,7 +533,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTINTERP_H__ */
+#endif /* TTINTERP_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c
index 202aa04..6685dc8 100644
--- a/src/truetype/ttobjs.c
+++ b/src/truetype/ttobjs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Objects manager (body).                                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,7 +21,7 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_INTERNAL_SFNT_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttgload.h"
 #include "ttpload.h"
@@ -32,10 +32,6 @@
 #include "ttinterp.h"
 #endif
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-#include FT_TRUETYPE_UNPATENTED_H
-#endif
-
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include "ttgxvar.h"
 #endif
@@ -121,7 +117,7 @@
     FT_Error  error;
 
 
-    FT_MEM_ZERO( zone, sizeof ( *zone ) );
+    FT_ZERO( zone );
     zone->memory = memory;
 
     if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
@@ -151,20 +147,51 @@
   {
 
 #define TRICK_NAMES_MAX_CHARACTERS  19
-#define TRICK_NAMES_COUNT            9
+#define TRICK_NAMES_COUNT           26
 
     static const char trick_names[TRICK_NAMES_COUNT]
                                  [TRICK_NAMES_MAX_CHARACTERS + 1] =
     {
+      /*
+         PostScript names are given in brackets if they differ from the
+         family name.  The version numbers, together with the copyright or
+         release year data, are taken from fonts available to the
+         developers.
+
+         Note that later versions of the fonts might be no longer tricky;
+         for example, `MingLiU' version 7.00 (file `mingliu.ttc' from
+         Windows 7) is an ordinary TTC with non-tricky subfonts.
+       */
+
+      "cpop",               /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */
+      "DFGirl-W6-WIN-BF",   /* dftt-h6.ttf; version 1.00, 1993 */
+      "DFGothic-EB",        /* DynaLab Inc. 1992-1995 */
+      "DFGyoSho-Lt",        /* DynaLab Inc. 1992-1995 */
+      "DFHei-Md-HK-BF",     /* maybe DynaLab Inc. */
+      "DFHSGothic-W5",      /* DynaLab Inc. 1992-1995 */
+      "DFHSMincho-W3",      /* DynaLab Inc. 1992-1995 */
+      "DFHSMincho-W7",      /* DynaLab Inc. 1992-1995 */
       "DFKaiSho-SB",        /* dfkaisb.ttf */
       "DFKaiShu",
-      "DFKai-SB",           /* kaiu.ttf */
+      "DFKaiShu-Md-HK-BF",  /* maybe DynaLab Inc. */
+      "DFKai-SB",           /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */
+      "DFMing-Bd-HK-BF",    /* maybe DynaLab Inc. */
+      "DLC",                /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */
+                            /* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */
+      "DLCHayMedium",       /* dftt-b5.ttf; version 1.00, 1993 */
+      "DLCHayBold",         /* dftt-b7.ttf; version 1.00, 1993 */
+      "DLCKaiMedium",       /* dftt-k5.ttf; version 1.00, 1992 */
+      "DLCLiShu",           /* dftt-l5.ttf; version 1.00, 1992 */
+      "DLCRoundBold",       /* dftt-r7.ttf; version 1.00, 1993 */
       "HuaTianKaiTi?",      /* htkt2.ttf */
       "HuaTianSongTi?",     /* htst3.ttf */
-      "Ming(for ISO10646)", /* hkscsiic.ttf & iicore.ttf */
-      "MingLiU",            /* mingliu.ttf & mingliu.ttc */
-      "PMingLiU",           /* mingliu.ttc */
-      "MingLi43",           /* mingli.ttf */
+      "Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */
+                            /* iicore.ttf; version 0.07, 2007 [Ming] */
+      "MingLiU",            /* mingliu.ttf */
+                            /* mingliu.ttc; version 3.21, 2001 */
+      "MingMedium",         /* dftt-m5.ttf; version 1.00, 1993 [DLCMingMedium] */
+      "PMingLiU",           /* mingliu.ttc; version 3.21, 2001 */
+      "MingLi43",           /* mingli.ttf; version 1.00, 1992 */
     };
 
     int  nn;
@@ -191,7 +218,7 @@
   {
     FT_Error   error;
     FT_UInt32  checksum = 0;
-    int        i;
+    FT_UInt    i;
 
 
     if ( FT_FRAME_ENTER( length ) )
@@ -200,8 +227,8 @@
     for ( ; length > 3; length -= 4 )
       checksum += (FT_UInt32)FT_GET_ULONG();
 
-    for ( i = 3; length > 0; length --, i-- )
-      checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );
+    for ( i = 3; length > 0; length--, i-- )
+      checksum += (FT_UInt32)FT_GET_BYTE() << ( i * 8 );
 
     FT_FRAME_EXIT();
 
@@ -246,7 +273,7 @@
   tt_check_trickyness_sfnt_ids( TT_Face  face )
   {
 #define TRICK_SFNT_IDS_PER_FACE   3
-#define TRICK_SFNT_IDS_NUM_FACES  17
+#define TRICK_SFNT_IDS_NUM_FACES  29
 
     static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
                                        [TRICK_SFNT_IDS_PER_FACE] = {
@@ -265,11 +292,66 @@
         { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
         { 0xA344A1EBUL, 0x000001E1UL }  /* prep */
       },
+      { /* DFGothic-EB */
+        { 0x12C3EBB2UL, 0x00000350UL }, /* cvt  */
+        { 0xB680EE64UL, 0x000087A7UL }, /* fpgm */
+        { 0xCE939563UL, 0x00000758UL }  /* prep */
+      },
+      { /* DFGyoSho-Lt */
+        { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
+        { 0xCE5956E9UL, 0x0000BC85UL }, /* fpgm */
+        { 0x8272F416UL, 0x00000045UL }  /* prep */
+      },
+      { /* DFHei-Md-HK-BF */
+        { 0x1257EB46UL, 0x00000350UL }, /* cvt  */
+        { 0xF699D160UL, 0x0000715FUL }, /* fpgm */
+        { 0xD222F568UL, 0x000003BCUL }  /* prep */
+      },
+      { /* DFHSGothic-W5 */
+        { 0x1262EB4EUL, 0x00000350UL }, /* cvt  */
+        { 0xE86A5D64UL, 0x00007940UL }, /* fpgm */
+        { 0x7850F729UL, 0x000005FFUL }  /* prep */
+      },
+      { /* DFHSMincho-W3 */
+        { 0x122DEB0AUL, 0x00000350UL }, /* cvt  */
+        { 0x3D16328AUL, 0x0000859BUL }, /* fpgm */
+        { 0xA93FC33BUL, 0x000002CBUL }  /* prep */
+      },
+      { /* DFHSMincho-W7 */
+        { 0x125FEB26UL, 0x00000350UL }, /* cvt  */
+        { 0xA5ACC982UL, 0x00007EE1UL }, /* fpgm */
+        { 0x90999196UL, 0x0000041FUL }  /* prep */
+      },
       { /* DFKaiShu */
         { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
         { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */
         { 0x13A42602UL, 0x0000007EUL }  /* prep */
       },
+      { /* DFKaiShu, variant */
+        { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
+        { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */
+        { 0x13A42602UL, 0x0000007EUL }  /* prep */
+      },
+      { /* DFKaiShu-Md-HK-BF */
+        { 0x11E5EAD4UL, 0x00000360UL }, /* cvt  */
+        { 0x9DB282B2UL, 0x0000C06EUL }, /* fpgm */
+        { 0x53E6D7CAUL, 0x00000082UL }  /* prep */
+      },
+      { /* DFMing-Bd-HK-BF */
+        { 0x1243EB18UL, 0x00000350UL }, /* cvt  */
+        { 0xBA0A8C30UL, 0x000074ADUL }, /* fpgm */
+        { 0xF3D83409UL, 0x0000037BUL }  /* prep */
+      },
+      { /* DLCLiShu */
+        { 0x07DCF546UL, 0x00000308UL }, /* cvt  */
+        { 0x40FE7C90UL, 0x00008E2AUL }, /* fpgm */
+        { 0x608174B5UL, 0x0000007AUL }  /* prep */
+      },
+      { /* DLCHayBold */
+        { 0xEB891238UL, 0x00000308UL }, /* cvt  */
+        { 0xD2E4DCD4UL, 0x0000676FUL }, /* fpgm */
+        { 0x8EA5F293UL, 0x000003B8UL }  /* prep */
+      },
       { /* HuaTianKaiTi */
         { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt  */
         { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */
@@ -339,6 +421,11 @@
         { 0x00000000UL, 0x00000000UL }, /* cvt  */
         { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */
         { 0x3900DED3UL, 0x00001E18UL }  /* prep */
+      },
+        { /* MINGLI.TTF, 1992 */
+        { 0x00170003UL, 0x00000060UL }, /* cvt  */
+        { 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */
+        { 0xD643482AUL, 0x00000035UL }  /* prep */
       }
     };
 
@@ -397,11 +484,11 @@
     for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
     {
       if ( !has_cvt  && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
-        num_matched_ids[j] ++;
+        num_matched_ids[j]++;
       if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
-        num_matched_ids[j] ++;
+        num_matched_ids[j]++;
       if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
-        num_matched_ids[j] ++;
+        num_matched_ids[j]++;
       if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
         return TRUE;
     }
@@ -490,7 +577,10 @@
   /* <Input>                                                               */
   /*    stream     :: The source font stream.                              */
   /*                                                                       */
-  /*    face_index :: The index of the font face in the resource.          */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection, in bits 0-15.  The numbered instance     */
+  /*                  index~+~1 of a GX (sub)font, if applicable, in bits  */
+  /*                  16-30.                                               */
   /*                                                                       */
   /*    num_params :: Number of additional generic parameters.  Ignored.   */
   /*                                                                       */
@@ -532,6 +622,7 @@
       goto Exit;
 
     /* check that we have a valid TrueType file */
+    FT_TRACE2(( "  " ));
     error = sfnt->init_face( stream, face, face_index, num_params, params );
 
     /* Stream may have changed. */
@@ -543,9 +634,11 @@
     /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
     /* The 0x00020000 tag is completely undocumented; some fonts from   */
     /* Arphic made for Chinese Windows 3.1 have this.                   */
-    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */
-         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */
-         face->format_tag != TTAG_true   )     /* Mac fonts */
+    if ( face->format_tag != 0x00010000L  && /* MS fonts                             */
+         face->format_tag != 0x00020000L  && /* CJK fonts for Win 3.1                */
+         face->format_tag != TTAG_true    && /* Mac fonts                            */
+         face->format_tag != TTAG_0xA5kbd && /* `Keyboard.dfont' (legacy Mac OS X)   */
+         face->format_tag != TTAG_0xA5lst )  /* `LastResort.dfont' (legacy Mac OS X) */
     {
       FT_TRACE2(( "  not a TTF font\n" ));
       goto Bad_Format;
@@ -573,82 +666,70 @@
 
     if ( FT_IS_SCALABLE( ttface ) )
     {
-
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-
       if ( !ttface->internal->incremental_interface )
-        error = tt_face_load_loca( face, stream );
-      if ( !error )
-        error = tt_face_load_cvt( face, stream );
-      if ( !error )
-        error = tt_face_load_fpgm( face, stream );
-      if ( !error )
-        error = tt_face_load_prep( face, stream );
-
-      /* Check the scalable flag based on `loca'. */
-      if ( !ttface->internal->incremental_interface &&
-           ttface->num_fixed_sizes                  &&
-           face->glyph_locations                    &&
-           tt_check_single_notdef( ttface )         )
-      {
-        FT_TRACE5(( "tt_face_init:"
-                    " Only the `.notdef' glyph has an outline.\n"
-                    "             "
-                    " Resetting scalable flag to FALSE.\n" ));
-
-        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
-      }
-
-#else
-
-      if ( !error )
-        error = tt_face_load_loca( face, stream );
-      if ( !error )
-        error = tt_face_load_cvt( face, stream );
-      if ( !error )
-        error = tt_face_load_fpgm( face, stream );
-      if ( !error )
-        error = tt_face_load_prep( face, stream );
-
-      /* Check the scalable flag based on `loca'. */
-      if ( ttface->num_fixed_sizes          &&
-           face->glyph_locations            &&
-           tt_check_single_notdef( ttface ) )
-      {
-        FT_TRACE5(( "tt_face_init:"
-                    " Only the `.notdef' glyph has an outline.\n"
-                    "             "
-                    " Resetting scalable flag to FALSE.\n" ));
-
-        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
-      }
-
 #endif
+      {
+        error = tt_face_load_loca( face, stream );
 
+        /* having a (non-zero) `glyf' table without */
+        /* a `loca' table is not valid              */
+        if ( face->glyf_len && FT_ERR_EQ( error, Table_Missing ) )
+          goto Exit;
+        if ( error )
+          goto Exit;
+      }
+
+      /* `fpgm', `cvt', and `prep' are optional */
+      error = tt_face_load_cvt( face, stream );
+      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+        goto Exit;
+
+      error = tt_face_load_fpgm( face, stream );
+      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+        goto Exit;
+
+      error = tt_face_load_prep( face, stream );
+      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
+        goto Exit;
+
+      /* Check the scalable flag based on `loca'. */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      if ( !ttface->internal->incremental_interface )
+#endif
+      {
+        if ( ttface->num_fixed_sizes          &&
+             face->glyph_locations            &&
+             tt_check_single_notdef( ttface ) )
+        {
+          FT_TRACE5(( "tt_face_init:"
+                      " Only the `.notdef' glyph has an outline.\n"
+                      "             "
+                      " Resetting scalable flag to FALSE.\n" ));
+
+          ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+        }
+      }
     }
 
-#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING    ) && \
-    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
     {
-      FT_Bool  unpatented_hinting;
-      int      i;
+      FT_UInt  instance_index = (FT_UInt)face_index >> 16;
 
 
-      /* Determine whether unpatented hinting is to be used for this face. */
-      unpatented_hinting = FT_BOOL
-        ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );
+      if ( FT_HAS_MULTIPLE_MASTERS( ttface ) &&
+           instance_index > 0                )
+      {
+        error = TT_Set_Named_Instance( face, instance_index );
+        if ( error )
+          goto Exit;
 
-      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
-        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
-          unpatented_hinting = TRUE;
-
-      if ( !unpatented_hinting )
-        ttface->internal->ignore_unpatented_hinter = TRUE;
+        tt_apply_mvar( face );
+      }
     }
 
-#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&
-          !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
 
     /* initialize standard glyph loading routines */
     TT_Init_Glyph_Loading( face );
@@ -712,7 +793,7 @@
     face->cvt_program_size  = 0;
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    tt_done_blend( memory, face->blend );
+    tt_done_blend( face );
     face->blend = NULL;
 #endif
   }
@@ -770,14 +851,14 @@
     exec->pedantic_hinting = pedantic;
 
     {
-      FT_Size_Metrics*  metrics    = &exec->metrics;
-      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
+      FT_Size_Metrics*  size_metrics = &exec->metrics;
+      TT_Size_Metrics*  tt_metrics   = &exec->tt_metrics;
 
 
-      metrics->x_ppem   = 0;
-      metrics->y_ppem   = 0;
-      metrics->x_scale  = 0;
-      metrics->y_scale  = 0;
+      size_metrics->x_ppem   = 0;
+      size_metrics->y_ppem   = 0;
+      size_metrics->x_scale  = 0;
+      size_metrics->y_scale  = 0;
 
       tt_metrics->ppem  = 0;
       tt_metrics->scale = 0;
@@ -800,6 +881,11 @@
 
       FT_TRACE4(( "Executing `fpgm' table.\n" ));
       error = face->interpreter( exec );
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( error )
+        FT_TRACE4(( "  interpretation failed with error code 0x%x\n",
+                    error ));
+#endif
     }
     else
       error = FT_Err_Ok;
@@ -863,8 +949,12 @@
       TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
 
       FT_TRACE4(( "Executing `prep' table.\n" ));
-
       error = face->interpreter( exec );
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( error )
+        FT_TRACE4(( "  interpretation failed with error code 0x%x\n",
+                    error ));
+#endif
     }
     else
       error = FT_Err_Ok;
@@ -983,17 +1073,17 @@
 
     /* Set default metrics */
     {
-      TT_Size_Metrics*  metrics = &size->ttmetrics;
+      TT_Size_Metrics*  tt_metrics = &size->ttmetrics;
 
 
-      metrics->rotated   = FALSE;
-      metrics->stretched = FALSE;
+      tt_metrics->rotated   = FALSE;
+      tt_metrics->stretched = FALSE;
 
       /* set default engine compensation */
-      metrics->compensations[0] = 0;   /* gray     */
-      metrics->compensations[1] = 0;   /* black    */
-      metrics->compensations[2] = 0;   /* white    */
-      metrics->compensations[3] = 0;   /* reserved */
+      tt_metrics->compensations[0] = 0;   /* gray     */
+      tt_metrics->compensations[1] = 0;   /* black    */
+      tt_metrics->compensations[2] = 0;   /* white    */
+      tt_metrics->compensations[3] = 0;   /* reserved */
     }
 
     /* allocate function defs, instruction defs, cvt, and storage area */
@@ -1029,7 +1119,15 @@
     }
 
     /* Fine, now run the font program! */
+
+    /* In case of an error while executing `fpgm', we intentionally don't */
+    /* clean up immediately – bugs in the `fpgm' are so fundamental that  */
+    /* all following hinting calls should fail.  Additionally, `fpgm' is  */
+    /* to be executed just once; calling it again is completely useless   */
+    /* and might even lead to extremely slow behaviour if it is malformed */
+    /* (containing an infinite loop, for example).                        */
     error = tt_size_run_fpgm( size, pedantic );
+    return error;
 
   Exit:
     if ( error )
@@ -1048,8 +1146,10 @@
 
     if ( size->bytecode_ready < 0 )
       error = tt_size_init_bytecode( (FT_Size)size, pedantic );
+    else
+      error = size->bytecode_ready;
 
-    if ( error || size->bytecode_ready )
+    if ( error )
       goto Exit;
 
     /* rescale CVT when needed */
@@ -1081,6 +1181,8 @@
 
       error = tt_size_run_prep( size, pedantic );
     }
+    else
+      error = size->cvt_ready;
 
   Exit:
     return error;
@@ -1157,26 +1259,34 @@
   /*    have been changed.                                                 */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    size :: A handle to the target size object.                        */
+  /*    size        :: A handle to the target size object.                 */
+  /*                                                                       */
+  /*    only_height :: Only recompute ascender, descender, and height;     */
+  /*                   this flag is used for variation fonts where         */
+  /*                   `tt_size_reset' is used as an iterator function.    */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  tt_size_reset( TT_Size  size )
+  tt_size_reset( TT_Size  size,
+                 FT_Bool  only_height )
   {
     TT_Face           face;
-    FT_Error          error = FT_Err_Ok;
-    FT_Size_Metrics*  metrics;
+    FT_Size_Metrics*  size_metrics;
 
 
-    size->ttmetrics.valid = FALSE;
-
     face = (TT_Face)size->root.face;
 
-    metrics = &size->metrics;
+    /* nothing to do for CFF2 */
+    if ( face->is_cff2 )
+      return FT_Err_Ok;
+
+    size->ttmetrics.valid = FALSE;
+
+    size_metrics = &size->hinted_metrics;
 
     /* copy the result from base layer */
-    *metrics = size->root.metrics;
+    *size_metrics = size->root.metrics;
 
-    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
+    if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 )
       return FT_THROW( Invalid_PPem );
 
     /* This bit flag, if set, indicates that the ppems must be       */
@@ -1185,48 +1295,66 @@
     /*                                                               */
     if ( face->header.Flags & 8 )
     {
-      metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,
-                                    face->root.units_per_EM );
-      metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,
-                                    face->root.units_per_EM );
+      /* the TT spec always asks for ROUND, not FLOOR or CEIL */
+      size_metrics->ascender = FT_PIX_ROUND(
+                                 FT_MulFix( face->root.ascender,
+                                            size_metrics->y_scale ) );
+      size_metrics->descender = FT_PIX_ROUND(
+                                 FT_MulFix( face->root.descender,
+                                            size_metrics->y_scale ) );
+      size_metrics->height = FT_PIX_ROUND(
+                               FT_MulFix( face->root.height,
+                                          size_metrics->y_scale ) );
+    }
 
-      metrics->ascender =
-        FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
-      metrics->descender =
-        FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
-      metrics->height =
-        FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
-      metrics->max_advance =
-        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
-                                 metrics->x_scale ) );
+    size->ttmetrics.valid = TRUE;
+
+    if ( only_height )
+    {
+      /* we must not recompute the scaling values here since       */
+      /* `tt_size_reset' was already called (with only_height = 0) */
+      return FT_Err_Ok;
+    }
+
+    if ( face->header.Flags & 8 )
+    {
+      /* base scaling values on integer ppem values, */
+      /* as mandated by the TrueType specification   */
+      size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6,
+                                         face->root.units_per_EM );
+      size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6,
+                                         face->root.units_per_EM );
+
+      size_metrics->max_advance = FT_PIX_ROUND(
+                                    FT_MulFix( face->root.max_advance_width,
+                                               size_metrics->x_scale ) );
     }
 
     /* compute new transformation */
-    if ( metrics->x_ppem >= metrics->y_ppem )
+    if ( size_metrics->x_ppem >= size_metrics->y_ppem )
     {
-      size->ttmetrics.scale   = metrics->x_scale;
-      size->ttmetrics.ppem    = metrics->x_ppem;
+      size->ttmetrics.scale   = size_metrics->x_scale;
+      size->ttmetrics.ppem    = size_metrics->x_ppem;
       size->ttmetrics.x_ratio = 0x10000L;
-      size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,
-                                           metrics->x_ppem );
+      size->ttmetrics.y_ratio = FT_DivFix( size_metrics->y_ppem,
+                                           size_metrics->x_ppem );
     }
     else
     {
-      size->ttmetrics.scale   = metrics->y_scale;
-      size->ttmetrics.ppem    = metrics->y_ppem;
-      size->ttmetrics.x_ratio = FT_DivFix( metrics->x_ppem,
-                                           metrics->y_ppem );
+      size->ttmetrics.scale   = size_metrics->y_scale;
+      size->ttmetrics.ppem    = size_metrics->y_ppem;
+      size->ttmetrics.x_ratio = FT_DivFix( size_metrics->x_ppem,
+                                           size_metrics->y_ppem );
       size->ttmetrics.y_ratio = 0x10000L;
     }
 
+    size->metrics = size_metrics;
+
 #ifdef TT_USE_BYTECODE_INTERPRETER
     size->cvt_ready = -1;
 #endif /* TT_USE_BYTECODE_INTERPRETER */
 
-    if ( !error )
-      size->ttmetrics.valid = TRUE;
-
-    return error;
+    return FT_Err_Ok;
   }
 
 
@@ -1252,10 +1380,12 @@
 
     TT_Driver  driver = (TT_Driver)ttdriver;
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
-    driver->interpreter_version = TT_INTERPRETER_VERSION_38;
-#else
     driver->interpreter_version = TT_INTERPRETER_VERSION_35;
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
+    driver->interpreter_version = TT_INTERPRETER_VERSION_38;
+#endif
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
+    driver->interpreter_version = TT_INTERPRETER_VERSION_40;
 #endif
 
 #else /* !TT_USE_BYTECODE_INTERPRETER */
diff --git a/src/truetype/ttobjs.h b/src/truetype/ttobjs.h
index 7ac4123..38fa30e 100644
--- a/src/truetype/ttobjs.h
+++ b/src/truetype/ttobjs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Objects manager (specification).                                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTOBJS_H__
-#define __TTOBJS_H__
+#ifndef TTOBJS_H_
+#define TTOBJS_H_
 
 
 #include <ft2build.h>
@@ -42,17 +42,6 @@
   /*************************************************************************/
   /*                                                                       */
   /* <Type>                                                                */
-  /*    TT_Instance                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a TrueType size object.                                */
-  /*                                                                       */
-  typedef struct TT_SizeRec_*  TT_Size;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
   /*    TT_GlyphSlot                                                       */
   /*                                                                       */
   /* <Description>                                                         */
@@ -83,10 +72,6 @@
     FT_UnitVector  projVector;
     FT_UnitVector  freeVector;
 
-#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
-    FT_Bool        both_x_axis;
-#endif
-
     FT_Long        loop;
     FT_F26Dot6     minimum_distance;
     FT_Int         round_state;
@@ -293,7 +278,8 @@
 
     /* we have our own copy of metrics so that we can modify */
     /* it without affecting auto-hinting (when used)         */
-    FT_Size_Metrics    metrics;
+    FT_Size_Metrics*   metrics;        /* for the current rendering mode */
+    FT_Size_Metrics    hinted_metrics; /* for the hinted rendering mode  */
 
     TT_Size_Metrics    ttmetrics;
 
@@ -301,6 +287,8 @@
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
+    FT_Long            point_size;    /* for the `MPS' bytecode instruction */
+
     FT_UInt            num_function_defs; /* number of function definitions */
     FT_UInt            max_function_defs;
     TT_DefArray        function_defs;     /* table of function definitions  */
@@ -402,7 +390,8 @@
 #endif /* TT_USE_BYTECODE_INTERPRETER */
 
   FT_LOCAL( FT_Error )
-  tt_size_reset( TT_Size  size );
+  tt_size_reset( TT_Size  size,
+                 FT_Bool  only_height );
 
 
   /*************************************************************************/
@@ -430,7 +419,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTOBJS_H__ */
+#endif /* TTOBJS_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttpic.c b/src/truetype/ttpic.c
index 242a6b7..cdbb806 100644
--- a/src/truetype/ttpic.c
+++ b/src/truetype/ttpic.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for truetype module. */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/truetype/ttpic.h b/src/truetype/ttpic.h
index 48ba4aa..df878ae 100644
--- a/src/truetype/ttpic.h
+++ b/src/truetype/ttpic.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for truetype module. */
 /*                                                                         */
-/*  Copyright 2009-2015 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,35 +16,41 @@
 /***************************************************************************/
 
 
-#ifndef __TTPIC_H__
-#define __TTPIC_H__
+#ifndef TTPIC_H_
+#define TTPIC_H_
 
 
-FT_BEGIN_HEADER
+#include FT_INTERNAL_PIC_H
+
 
 #ifndef FT_CONFIG_OPTION_PIC
 
-#define TT_SERVICES_GET                  tt_services
-#define TT_SERVICE_GX_MULTI_MASTERS_GET  tt_service_gx_multi_masters
-#define TT_SERVICE_TRUETYPE_GLYF_GET     tt_service_truetype_glyf
-#define TT_SERVICE_PROPERTIES_GET        tt_service_properties
+#define TT_SERVICES_GET                    tt_services
+#define TT_SERVICE_GX_MULTI_MASTERS_GET    tt_service_gx_multi_masters
+#define TT_SERVICE_METRICS_VARIATIONS_GET  tt_service_metrics_variations
+#define TT_SERVICE_TRUETYPE_GLYF_GET       tt_service_truetype_glyf
+#define TT_SERVICE_PROPERTIES_GET          tt_service_properties
 
 #else /* FT_CONFIG_OPTION_PIC */
 
 #include FT_MULTIPLE_MASTERS_H
 #include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 #include FT_SERVICE_TRUETYPE_GLYF_H
 #include FT_SERVICE_PROPERTIES_H
 
 
+FT_BEGIN_HEADER
+
   typedef struct  TTModulePIC_
   {
-    FT_ServiceDescRec*          tt_services;
+    FT_ServiceDescRec*               tt_services;
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    FT_Service_MultiMastersRec  tt_service_gx_multi_masters;
+    FT_Service_MultiMastersRec       tt_service_gx_multi_masters;
+    FT_Service_MetricsVariationsRec  tt_service_metrics_variations;
 #endif
-    FT_Service_TTGlyfRec        tt_service_truetype_glyf;
-    FT_Service_PropertiesRec    tt_service_properties;
+    FT_Service_TTGlyfRec             tt_service_truetype_glyf;
+    FT_Service_PropertiesRec         tt_service_properties;
 
   } TTModulePIC;
 
@@ -53,6 +59,8 @@
           ( (TTModulePIC*)((lib)->pic_container.truetype) )
 #define TT_SERVICES_GET                       \
           ( GET_PIC( library )->tt_services )
+#define TT_SERVICE_METRICS_VARIATIONS_GET                       \
+          ( GET_PIC( library )->tt_service_metrics_variations )
 #define TT_SERVICE_GX_MULTI_MASTERS_GET                       \
           ( GET_PIC( library )->tt_service_gx_multi_masters )
 #define TT_SERVICE_TRUETYPE_GLYF_GET                       \
@@ -68,14 +76,13 @@
   FT_Error
   tt_driver_class_pic_init( FT_Library  library );
 
+FT_END_HEADER
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
  /* */
 
-
-FT_END_HEADER
-
-#endif /* __TTPIC_H__ */
+#endif /* TTPIC_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttpload.c b/src/truetype/ttpload.c
index fb338bd..d9526ad 100644
--- a/src/truetype/ttpload.c
+++ b/src/truetype/ttpload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType-specific tables loader (body).                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -73,9 +73,21 @@
     /* it is possible that a font doesn't have a glyf table at all */
     /* or its size is zero                                         */
     if ( FT_ERR_EQ( error, Table_Missing ) )
-      face->glyf_len = 0;
+    {
+      face->glyf_len    = 0;
+      face->glyf_offset = 0;
+    }
     else if ( error )
       goto Exit;
+    else
+    {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      if ( face->root.internal->incremental_interface )
+        face->glyf_offset = 0;
+      else
+#endif
+        face->glyf_offset = FT_STREAM_POS();
+    }
 
     FT_TRACE2(( "Locations " ));
     error = face->goto_table( face, TTAG_loca, stream, &table_len );
@@ -92,8 +104,7 @@
       if ( table_len >= 0x40000L )
       {
         FT_TRACE2(( "table too large\n" ));
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
+        table_len = 0x3FFFFL;
       }
       face->num_locations = table_len >> shift;
     }
@@ -104,8 +115,7 @@
       if ( table_len >= 0x20000L )
       {
         FT_TRACE2(( "table too large\n" ));
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
+        table_len = 0x1FFFFL;
       }
       face->num_locations = table_len >> shift;
     }
@@ -124,8 +134,9 @@
         TT_Table  entry = face->dir_tables;
         TT_Table  limit = entry + face->num_tables;
 
-        FT_Long   pos  = (FT_Long)FT_STREAM_POS();
-        FT_Long   dist = 0x7FFFFFFFL;
+        FT_Long  pos   = (FT_Long)FT_STREAM_POS();
+        FT_Long  dist  = 0x7FFFFFFFL;
+        FT_Bool  found = 0;
 
 
         /* compute the distance to next table in font file */
@@ -135,10 +146,13 @@
 
 
           if ( diff > 0 && diff < dist )
-            dist = diff;
+          {
+            dist  = diff;
+            found = 1;
+          }
         }
 
-        if ( entry == limit )
+        if ( !found )
         {
           /* `loca' is the last table */
           dist = (FT_Long)stream->size - pos;
@@ -152,6 +166,14 @@
           FT_TRACE2(( "adjusting num_locations to %d\n",
                       face->num_locations ));
         }
+        else
+        {
+          face->root.num_glyphs = face->num_locations
+                                    ? (FT_Long)face->num_locations - 1 : 0;
+
+          FT_TRACE2(( "adjusting num_glyphs to %d\n",
+                      face->root.num_glyphs ));
+        }
       }
     }
 
@@ -210,12 +232,13 @@
       }
     }
 
-    /* Check broken location data */
+    /* Check broken location data. */
     if ( pos1 > face->glyf_len )
     {
       FT_TRACE1(( "tt_face_get_location:"
-                  " too large offset=0x%08lx found for gid=0x%04lx,"
-                  " exceeding the end of glyf table (0x%08lx)\n",
+                  " too large offset (0x%08lx) found for glyph index %ld,\n"
+                  "                     "
+                  " exceeding the end of `glyf' table (0x%08lx)\n",
                   pos1, gindex, face->glyf_len ));
       *asize = 0;
       return 0;
@@ -223,11 +246,26 @@
 
     if ( pos2 > face->glyf_len )
     {
-      FT_TRACE1(( "tt_face_get_location:"
-                  " too large offset=0x%08lx found for gid=0x%04lx,"
-                  " truncate at the end of glyf table (0x%08lx)\n",
-                  pos2, gindex + 1, face->glyf_len ));
-      pos2 = face->glyf_len;
+      /* We try to sanitize the last `loca' entry. */
+      if ( gindex == face->num_locations - 2 )
+      {
+        FT_TRACE1(( "tt_face_get_location:"
+                    " too large size (%ld bytes) found for glyph index %ld,\n"
+                    "                     "
+                    " truncating at the end of `glyf' table to %ld bytes\n",
+                    pos2 - pos1, gindex, face->glyf_len - pos1 ));
+        pos2 = face->glyf_len;
+      }
+      else
+      {
+        FT_TRACE1(( "tt_face_get_location:"
+                    " too large offset (0x%08lx) found for glyph index %ld,\n"
+                    "                     "
+                    " exceeding the end of `glyf' table (0x%08lx)\n",
+                    pos2, gindex + 1, face->glyf_len ));
+        *asize = 0;
+        return 0;
+      }
     }
 
     /* The `loca' table must be ordered; it refers to the length of */
@@ -486,7 +524,7 @@
   {
     FT_Error   error;
     FT_Memory  memory = stream->memory;
-    FT_UInt    version, nn, num_records;
+    FT_UInt    nn, num_records;
     FT_ULong   table_size, record_size;
     FT_Byte*   p;
     FT_Byte*   limit;
@@ -503,7 +541,10 @@
     p     = face->hdmx_table;
     limit = p + table_size;
 
-    version     = FT_NEXT_USHORT( p );
+    /* Given that `hdmx' tables are losing its importance (for example, */
+    /* variation fonts introduced in OpenType 1.8 must not have this    */
+    /* table) we no longer test for a correct `version' field.          */
+    p          += 2;
     num_records = FT_NEXT_USHORT( p );
     record_size = FT_NEXT_ULONG( p );
 
@@ -522,10 +563,10 @@
       record_size &= 0xFFFFU;
 
     /* The limit for `num_records' is a heuristic value. */
-    if ( version != 0           ||
-         num_records > 255      ||
-         record_size > 0x10001L ||
-         record_size < 4        )
+    if ( num_records > 255              ||
+         ( num_records > 0            &&
+           ( record_size > 0x10001L ||
+             record_size < 4        ) ) )
     {
       error = FT_THROW( Invalid_File_Format );
       goto Fail;
diff --git a/src/truetype/ttpload.h b/src/truetype/ttpload.h
index bc92369..fa12527 100644
--- a/src/truetype/ttpload.h
+++ b/src/truetype/ttpload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType-specific tables loader (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTPLOAD_H__
-#define __TTPLOAD_H__
+#ifndef TTPLOAD_H_
+#define TTPLOAD_H_
 
 
 #include <ft2build.h>
@@ -69,7 +69,7 @@
 
 FT_END_HEADER
 
-#endif /* __TTPLOAD_H__ */
+#endif /* TTPLOAD_H_ */
 
 
 /* END */
diff --git a/src/truetype/ttsubpix.c b/src/truetype/ttsubpix.c
index dbda4d9..d94bcc8 100644
--- a/src/truetype/ttsubpix.c
+++ b/src/truetype/ttsubpix.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Subpixel Hinting.                                           */
 /*                                                                         */
-/*  Copyright 2010-2015 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,13 @@
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_OUTLINE_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttsubpix.h"
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#if defined( TT_USE_BYTECODE_INTERPRETER )            && \
+    defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY )
 
   /*************************************************************************/
   /*                                                                       */
@@ -752,24 +753,24 @@
 
 
     /* Does font name match rule family? */
-    if ( strcmp( detected_font_name, rule_font_name ) == 0 )
+    if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 )
       return TRUE;
 
     /* Is font name a wildcard ""? */
-    if ( strcmp( rule_font_name, "" ) == 0 )
+    if ( ft_strcmp( rule_font_name, "" ) == 0 )
       return TRUE;
 
     /* Is font name contained in a class list? */
     for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
     {
-      if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
+      if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
       {
         for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
         {
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
+          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
             continue;
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
-                       detected_font_name ) == 0 )
+          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j],
+                          detected_font_name ) == 0 )
             return TRUE;
         }
       }
@@ -787,24 +788,24 @@
 
 
     /* Does font style match rule style? */
-    if ( strcmp( detected_font_style, rule_font_style ) == 0 )
+    if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 )
       return TRUE;
 
     /* Is font style a wildcard ""? */
-    if ( strcmp( rule_font_style, "" ) == 0 )
+    if ( ft_strcmp( rule_font_style, "" ) == 0 )
       return TRUE;
 
     /* Is font style contained in a class list? */
     for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
     {
-      if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
+      if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
       {
         for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
         {
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
+          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
             continue;
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j],
-                       detected_font_style ) == 0 )
+          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j],
+                          detected_font_style ) == 0 )
             return TRUE;
         }
       }
@@ -903,9 +904,9 @@
   sph_set_tweaks( TT_Loader  loader,
                   FT_UInt    glyph_index )
   {
-    TT_Face     face   = (TT_Face)loader->face;
+    TT_Face     face   = loader->face;
     FT_String*  family = face->root.family_name;
-    FT_UInt     ppem   = loader->size->metrics.x_ppem;
+    FT_UInt     ppem   = loader->size->metrics->x_ppem;
     FT_String*  style  = face->root.style_name;
 
 
@@ -1000,12 +1001,14 @@
     }
   }
 
-#else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#else /* !(TT_USE_BYTECODE_INTERPRETER &&          */
+      /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
 
   /* ANSI C doesn't like empty source files */
   typedef int  _tt_subpix_dummy;
 
-#endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* !(TT_USE_BYTECODE_INTERPRETER &&          */
+       /*   TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */
 
 
 /* END */
diff --git a/src/truetype/ttsubpix.h b/src/truetype/ttsubpix.h
index 9151aa3..1070bb0 100644
--- a/src/truetype/ttsubpix.h
+++ b/src/truetype/ttsubpix.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Subpixel Hinting.                                           */
 /*                                                                         */
-/*  Copyright 2010-2015 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __TTSUBPIX_H__
-#define __TTSUBPIX_H__
+#ifndef TTSUBPIX_H_
+#define TTSUBPIX_H_
 
 #include <ft2build.h>
 #include "ttobjs.h"
@@ -27,7 +27,7 @@
 FT_BEGIN_HEADER
 
 
-#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
+#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
 
   /*************************************************************************/
   /*                                                                       */
@@ -100,11 +100,12 @@
 #define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE
 #define SPH_OPTION_SET_RASTERIZER_VERSION  38
 
-#endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
+#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 
 FT_END_HEADER
 
-#endif /* __TTSUBPIX_H__ */
+#endif /* TTSUBPIX_H_ */
+
 
 /* END */
diff --git a/src/type1/Jamfile b/src/type1/Jamfile
index 5d7b62c..b94b7d0 100644
--- a/src/type1/Jamfile
+++ b/src/type1/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/type1 Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,13 @@
 
   if $(FT2_MULTI)
   {
-    _sources = t1afm t1driver t1objs t1load t1gload t1parse ;
+    _sources = t1afm
+               t1driver
+               t1gload
+               t1load
+               t1objs
+               t1parse
+               ;
   }
   else
   {
diff --git a/src/type1/module.mk b/src/type1/module.mk
index feb3459..3fea5cc 100644
--- a/src/type1/module.mk
+++ b/src/type1/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/type1/rules.mk b/src/type1/rules.mk
index fbd0543..cb1a142 100644
--- a/src/type1/rules.mk
+++ b/src/type1/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/type1/t1afm.c b/src/type1/t1afm.c
index 7f32059..61053d9 100644
--- a/src/type1/t1afm.c
+++ b/src/type1/t1afm.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM support for Type 1 fonts (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,6 +24,8 @@
 #include "t1errors.h"
 
 
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
   /*************************************************************************/
   /*                                                                       */
   /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
@@ -197,7 +199,7 @@
     /*   encoding of first glyph (1 byte)     */
     /*   encoding of second glyph (1 byte)    */
     /*   offset (little-endian short)         */
-    for ( ; p < limit ; p += 4 )
+    for ( ; p < limit; p += 4 )
     {
       kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
       kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
@@ -208,7 +210,7 @@
       kp++;
     }
 
-    if ( oldcharmap != NULL )
+    if ( oldcharmap )
       error = FT_Set_Charmap( t1_face, oldcharmap );
     if ( error )
       goto Exit;
@@ -239,9 +241,19 @@
     AFM_ParserRec  parser;
     AFM_FontInfo   fi      = NULL;
     FT_Error       error   = FT_ERR( Unknown_File_Format );
-    T1_Font        t1_font = &( (T1_Face)t1_face )->type1;
+    T1_Face        face    = (T1_Face)t1_face;
+    T1_Font        t1_font = &face->type1;
 
 
+    if ( face->afm_data )
+    {
+      FT_TRACE1(( "T1_Read_Metrics:"
+                  " Freeing previously attached metrics data.\n" ));
+      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
+
+      face->afm_data = NULL;
+    }
+
     if ( FT_NEW( fi )                   ||
          FT_FRAME_ENTER( stream->size ) )
       goto Exit;
@@ -250,7 +262,7 @@
     fi->Ascender  = t1_font->font_bbox.yMax;
     fi->Descender = t1_font->font_bbox.yMin;
 
-    psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;
+    psaux = (PSAux_Service)face->psaux;
     if ( psaux->afm_parser_funcs )
     {
       error = psaux->afm_parser_funcs->init( &parser,
@@ -298,15 +310,15 @@
       if ( fi->NumKernPair )
       {
         t1_face->face_flags |= FT_FACE_FLAG_KERNING;
-        ( (T1_Face)t1_face )->afm_data = fi;
-        fi = NULL;
+        face->afm_data       = fi;
+        fi                   = NULL;
       }
     }
 
     FT_FRAME_EXIT();
 
   Exit:
-    if ( fi != NULL )
+    if ( fi )
       T1_Done_Metrics( memory, fi );
 
     return error;
@@ -392,5 +404,12 @@
     return FT_Err_Ok;
   }
 
+#else /* T1_CONFIG_OPTION_NO_AFM */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _t1_afm_dummy;
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
 
 /* END */
diff --git a/src/type1/t1afm.h b/src/type1/t1afm.h
index 0f42f3e..cb8d302 100644
--- a/src/type1/t1afm.h
+++ b/src/type1/t1afm.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM support for Type 1 fonts (specification).                        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1AFM_H__
-#define __T1AFM_H__
+#ifndef T1AFM_H_
+#define T1AFM_H_
 
 #include <ft2build.h>
 #include "t1objs.h"
@@ -48,7 +48,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1AFM_H__ */
+#endif /* T1AFM_H_ */
 
 
 /* END */
diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c
index 571f2d2..029b410 100644
--- a/src/type1/t1driver.c
+++ b/src/type1/t1driver.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 driver interface (body).                                      */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,6 +29,9 @@
 
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_HASH_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
+#include FT_DRIVER_H
 
 #include FT_SERVICE_MULTIPLE_MASTERS_H
 #include FT_SERVICE_GLYPH_DICT_H
@@ -36,6 +39,7 @@
 #include FT_SERVICE_POSTSCRIPT_NAME_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_PROPERTIES_H
 #include FT_SERVICE_KERNING_H
 
 
@@ -87,8 +91,8 @@
 
   static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
   {
-    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,
-    (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,    /* get_name   */
+    (FT_GlyphDict_NameIndexFunc)t1_get_name_index     /* name_index */
   };
 
 
@@ -106,7 +110,7 @@
 
   static const FT_Service_PsFontNameRec  t1_service_ps_name =
   {
-    (FT_PsName_GetFunc)t1_get_ps_name
+    (FT_PsName_GetFunc)t1_get_ps_name     /* get_ps_font_name */
   };
 
 
@@ -118,11 +122,17 @@
 #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
   static const FT_Service_MultiMastersRec  t1_service_multi_masters =
   {
-    (FT_Get_MM_Func)        T1_Get_Multi_Master,
-    (FT_Set_MM_Design_Func) T1_Set_MM_Design,
-    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,
-    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,
-    (FT_Set_Var_Design_Func)T1_Set_Var_Design
+    (FT_Get_MM_Func)        T1_Get_Multi_Master,   /* get_mm         */
+    (FT_Set_MM_Design_Func) T1_Set_MM_Design,      /* set_mm_design  */
+    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,       /* set_mm_blend   */
+    (FT_Get_MM_Blend_Func)  T1_Get_MM_Blend,       /* get_mm_blend   */
+    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,         /* get_mm_var     */
+    (FT_Set_Var_Design_Func)T1_Set_Var_Design,     /* set_var_design */
+    (FT_Get_Var_Design_Func)T1_Get_Var_Design,     /* get_var_design */
+    (FT_Set_Instance_Func)  T1_Reset_MM_Blend,     /* set_instance   */
+
+    (FT_Get_Var_Blend_Func) NULL,                  /* get_var_blend  */
+    (FT_Done_Blend_Func)    T1_Done_Blend          /* done_blend     */
   };
 #endif
 
@@ -329,13 +339,37 @@
       break;
 
     case PS_DICT_SUBR:
-      if ( idx < (FT_UInt)type1->num_subrs )
       {
-        retval = type1->subrs_len[idx] + 1;
-        if ( value && value_len >= retval )
+        FT_Bool  ok = 0;
+
+
+        if ( type1->subrs_hash )
         {
-          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
-          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+          /* convert subr index to array index */
+          size_t*  val = ft_hash_num_lookup( (FT_Int)idx,
+                                             type1->subrs_hash );
+
+
+          if ( val )
+          {
+            idx = *val;
+            ok  = 1;
+          }
+        }
+        else
+        {
+          if ( idx < (FT_UInt)type1->num_subrs )
+            ok = 1;
+        }
+
+        if ( ok )
+        {
+          retval = type1->subrs_len[idx] + 1;
+          if ( value && value_len >= retval )
+          {
+            ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
+            ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+          }
         }
       }
       break;
@@ -567,23 +601,35 @@
 
   static const FT_Service_PsInfoRec  t1_service_ps_info =
   {
-    (PS_GetFontInfoFunc)   t1_ps_get_font_info,
-    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,
-    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
-    (PS_GetFontPrivateFunc)t1_ps_get_font_private,
-    (PS_GetFontValueFunc)  t1_ps_get_font_value,
+    (PS_GetFontInfoFunc)   t1_ps_get_font_info,    /* ps_get_font_info    */
+    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,   /* ps_get_font_extra   */
+    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,  /* ps_has_glyph_names  */
+    (PS_GetFontPrivateFunc)t1_ps_get_font_private, /* ps_get_font_private */
+    (PS_GetFontValueFunc)  t1_ps_get_font_value,   /* ps_get_font_value   */
   };
 
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
   static const FT_Service_KerningRec  t1_service_kerning =
   {
-    T1_Get_Track_Kerning,
+    T1_Get_Track_Kerning,       /* get_track */
   };
 #endif
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    t1_service_properties,
+
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
@@ -594,6 +640,7 @@
     { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
     { FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_TYPE_1 },
     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+    { FT_SERVICE_ID_PROPERTIES,           &t1_service_properties },
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
     { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
@@ -683,42 +730,43 @@
       FT_MODULE_DRIVER_SCALABLE   |
       FT_MODULE_DRIVER_HAS_HINTER,
 
-      sizeof ( FT_DriverRec ),
+      sizeof ( PS_DriverRec ),
 
       "type1",
       0x10000L,
       0x20000L,
 
-      0,   /* format interface */
+      NULL,    /* module-specific interface */
 
-      T1_Driver_Init,
-      T1_Driver_Done,
-      Get_Interface,
+      T1_Driver_Init,           /* FT_Module_Constructor  module_init   */
+      T1_Driver_Done,           /* FT_Module_Destructor   module_done   */
+      Get_Interface,            /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( T1_FaceRec ),
     sizeof ( T1_SizeRec ),
     sizeof ( T1_GlyphSlotRec ),
 
-    T1_Face_Init,
-    T1_Face_Done,
-    T1_Size_Init,
-    T1_Size_Done,
-    T1_GlyphSlot_Init,
-    T1_GlyphSlot_Done,
+    T1_Face_Init,               /* FT_Face_InitFunc  init_face */
+    T1_Face_Done,               /* FT_Face_DoneFunc  done_face */
+    T1_Size_Init,               /* FT_Size_InitFunc  init_size */
+    T1_Size_Done,               /* FT_Size_DoneFunc  done_size */
+    T1_GlyphSlot_Init,          /* FT_Slot_InitFunc  init_slot */
+    T1_GlyphSlot_Done,          /* FT_Slot_DoneFunc  done_slot */
 
-    T1_Load_Glyph,
+    T1_Load_Glyph,              /* FT_Slot_LoadFunc  load_glyph */
 
 #ifdef T1_CONFIG_OPTION_NO_AFM
-    0,                     /* FT_Face_GetKerningFunc */
-    0,                     /* FT_Face_AttachFunc     */
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
 #else
-    Get_Kerning,
-    T1_Read_Metrics,
+    Get_Kerning,                /* FT_Face_GetKerningFunc   get_kerning  */
+    T1_Read_Metrics,            /* FT_Face_AttachFunc       attach_file  */
 #endif
-    T1_Get_Advances,
-    T1_Size_Request,
-    0                      /* FT_Size_SelectFunc     */
+    T1_Get_Advances,            /* FT_Face_GetAdvancesFunc  get_advances */
+
+    T1_Size_Request,            /* FT_Size_RequestFunc  request_size */
+    NULL                        /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/type1/t1driver.h b/src/type1/t1driver.h
index 34bcf81..2b15072 100644
--- a/src/type1/t1driver.h
+++ b/src/type1/t1driver.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 1 driver interface (specification).                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1DRIVER_H__
-#define __T1DRIVER_H__
+#ifndef T1DRIVER_H_
+#define T1DRIVER_H_
 
 
 #include <ft2build.h>
@@ -36,7 +36,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1DRIVER_H__ */
+#endif /* T1DRIVER_H_ */
 
 
 /* END */
diff --git a/src/type1/t1errors.h b/src/type1/t1errors.h
index fc7a9bd..9e0151b 100644
--- a/src/type1/t1errors.h
+++ b/src/type1/t1errors.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 error codes (specification only).                             */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __T1ERRORS_H__
-#define __T1ERRORS_H__
+#ifndef T1ERRORS_H_
+#define T1ERRORS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  T1_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __T1ERRORS_H__ */
+#endif /* T1ERRORS_H_ */
 
 
 /* END */
diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c
index 829e874..87d40e7 100644
--- a/src/type1/t1gload.c
+++ b/src/type1/t1gload.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,6 +23,8 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_OUTLINE_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_DRIVER_H
 
 #include "t1errors.h"
 
@@ -37,37 +39,28 @@
 #define FT_COMPONENT  trace_t1gload
 
 
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /**********                                                      *********/
-  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
-  /**********                                                      *********/
-  /**********    The following code is in charge of computing      *********/
-  /**********    the maximum advance width of the font.  It        *********/
-  /**********    quickly processes each glyph charstring to        *********/
-  /**********    extract the value from either a `sbw' or `seac'   *********/
-  /**********    operator.                                         *********/
-  /**********                                                      *********/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
   static FT_Error
   T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,
                                       FT_UInt     glyph_index,
-                                      FT_Data*    char_string )
+                                      FT_Data*    char_string,
+                                      FT_Bool*    force_scaling )
   {
     T1_Face   face  = (T1_Face)decoder->builder.face;
     T1_Font   type1 = &face->type1;
     FT_Error  error = FT_Err_Ok;
 
+    PSAux_Service           psaux         = (PSAux_Service)face->psaux;
+    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
+    PS_Decoder              psdecoder;
+
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     FT_Incremental_InterfaceRec *inc =
                       face->root.internal->incremental_interface;
 #endif
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
+#endif
 
     decoder->font_matrix = type1->font_matrix;
     decoder->font_offset = type1->font_offset;
@@ -90,9 +83,56 @@
     }
 
     if ( !error )
-      error = decoder->funcs.parse_charstrings(
-                decoder, (FT_Byte*)char_string->pointer,
-                (FT_UInt)char_string->length );
+    {
+      /* choose which renderer to use */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE ||
+           decoder->builder.metrics_only                 )
+        error = decoder_funcs->parse_charstrings_old(
+                  decoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_UInt)char_string->length );
+#else
+      if ( decoder->builder.metrics_only )
+        error = decoder_funcs->parse_metrics(
+                  decoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_UInt)char_string->length );
+#endif
+      else
+      {
+        CFF_SubFontRec  subfont;
+
+
+        psaux->ps_decoder_init( &psdecoder, decoder, TRUE );
+
+        psaux->t1_make_subfont( FT_FACE( face ),
+                                &face->type1.private_dict, &subfont );
+        psdecoder.current_subfont = &subfont;
+
+        error = decoder_funcs->parse_charstrings(
+                  &psdecoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_ULong)char_string->length );
+
+        /* Adobe's engine uses 16.16 numbers everywhere;              */
+        /* as a consequence, glyphs larger than 2000ppem get rejected */
+        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+        {
+          /* this time, we retry unhinted and scale up the glyph later on */
+          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+          /* 0x400 for both `x_scale' and `y_scale' in this case)         */
+          ((T1_GlyphSlot)decoder->builder.glyph)->hint = FALSE;
+
+          *force_scaling = TRUE;
+
+          error = decoder_funcs->parse_charstrings(
+                    &psdecoder,
+                    (FT_Byte*)char_string->pointer,
+                    (FT_ULong)char_string->length );
+        }
+      }
+    }
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
@@ -126,8 +166,10 @@
                   FT_UInt     glyph_index )
   {
     FT_Data   glyph_data;
-    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
-                        decoder, glyph_index, &glyph_data );
+    FT_Bool   force_scaling = FALSE;
+    FT_Error  error         = T1_Parse_Glyph_And_Get_Char_String(
+                                decoder, glyph_index, &glyph_data,
+                                &force_scaling );
 
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
@@ -149,6 +191,23 @@
   }
 
 
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
   FT_LOCAL_DEF( FT_Error )
   T1_Compute_Max_Advance( T1_Face  face,
                           FT_Pos*  max_advance )
@@ -183,6 +242,7 @@
     decoder.num_subrs     = type1->num_subrs;
     decoder.subrs         = type1->subrs;
     decoder.subrs_len     = type1->subrs_len;
+    decoder.subrs_hash    = type1->subrs_hash;
 
     decoder.buildchar     = face->buildchar;
     decoder.len_buildchar = face->len_buildchar;
@@ -245,9 +305,10 @@
     decoder.builder.metrics_only = 1;
     decoder.builder.load_points  = 0;
 
-    decoder.num_subrs = type1->num_subrs;
-    decoder.subrs     = type1->subrs;
-    decoder.subrs_len = type1->subrs_len;
+    decoder.num_subrs  = type1->num_subrs;
+    decoder.subrs      = type1->subrs;
+    decoder.subrs_len  = type1->subrs_len;
+    decoder.subrs_hash = type1->subrs_hash;
 
     decoder.buildchar     = face->buildchar;
     decoder.len_buildchar = face->len_buildchar;
@@ -276,6 +337,8 @@
     T1_DecoderRec           decoder;
     T1_Face                 face = (T1_Face)t1glyph->face;
     FT_Bool                 hinting;
+    FT_Bool                 scaled;
+    FT_Bool                 force_scaling = FALSE;
     T1_Font                 type1         = &face->type1;
     PSAux_Service           psaux         = (PSAux_Service)face->psaux;
     const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
@@ -323,7 +386,10 @@
 
     hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
                        ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
 
+    glyph->hint     = hinting;
+    glyph->scaled   = scaled;
     t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = decoder_funcs->init( &decoder,
@@ -346,19 +412,22 @@
     decoder.num_subrs     = type1->num_subrs;
     decoder.subrs         = type1->subrs;
     decoder.subrs_len     = type1->subrs_len;
+    decoder.subrs_hash    = type1->subrs_hash;
 
     decoder.buildchar     = face->buildchar;
     decoder.len_buildchar = face->len_buildchar;
 
     /* now load the unscaled outline */
     error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
-                                                &glyph_data );
+                                                &glyph_data,
+                                                &force_scaling );
     if ( error )
       goto Exit;
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     glyph_data_loaded = 1;
 #endif
 
+    hinting     = glyph->hint;
     font_matrix = decoder.font_matrix;
     font_offset = decoder.font_offset;
 
@@ -395,7 +464,6 @@
       {
         FT_BBox            cbox;
         FT_Glyph_Metrics*  metrics = &t1glyph->metrics;
-        FT_Vector          advance;
 
 
         /* copy the _unscaled_ advance width */
@@ -427,26 +495,29 @@
 
 #if 1
         /* apply the font matrix, if any */
-        if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||
-             font_matrix.xy != 0        || font_matrix.yx != 0              )
+        if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L ||
+             font_matrix.xy != 0        || font_matrix.yx != 0        )
+        {
           FT_Outline_Transform( &t1glyph->outline, &font_matrix );
 
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance,
+                                            font_matrix.xx );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance,
+                                            font_matrix.yy );
+        }
+
         if ( font_offset.x || font_offset.y )
+        {
           FT_Outline_Translate( &t1glyph->outline,
                                 font_offset.x,
                                 font_offset.y );
 
-        advance.x = metrics->horiAdvance;
-        advance.y = 0;
-        FT_Vector_Transform( &advance, &font_matrix );
-        metrics->horiAdvance = advance.x + font_offset.x;
-        advance.x = 0;
-        advance.y = metrics->vertAdvance;
-        FT_Vector_Transform( &advance, &font_matrix );
-        metrics->vertAdvance = advance.y + font_offset.y;
+          metrics->horiAdvance += font_offset.x;
+          metrics->vertAdvance += font_offset.y;
+        }
 #endif
 
-        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
         {
           /* scale the outline and the metrics */
           FT_Int       n;
diff --git a/src/type1/t1gload.h b/src/type1/t1gload.h
index 05f60d5..72ef76f 100644
--- a/src/type1/t1gload.h
+++ b/src/type1/t1gload.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (specification).                                 */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1GLOAD_H__
-#define __T1GLOAD_H__
+#ifndef T1GLOAD_H_
+#define T1GLOAD_H_
 
 
 #include <ft2build.h>
@@ -47,7 +47,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1GLOAD_H__ */
+#endif /* T1GLOAD_H_ */
 
 
 /* END */
diff --git a/src/type1/t1load.c b/src/type1/t1load.c
index 376c90c..9dfa637 100644
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (body).                                           */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -66,6 +66,7 @@
 #include FT_MULTIPLE_MASTERS_H
 #include FT_INTERNAL_TYPE1_TYPES_H
 #include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_HASH_H
 
 #include "t1load.h"
 #include "t1errors.h"
@@ -236,7 +237,7 @@
     if ( ncv <= axismap->blend_points[0] )
       return INT_TO_FIXED( axismap->design_points[0] );
 
-    for ( j = 1; j < axismap->num_points; ++j )
+    for ( j = 1; j < axismap->num_points; j++ )
     {
       if ( ncv <= axismap->blend_points[j] )
         return INT_TO_FIXED( axismap->design_points[j - 1] ) +
@@ -320,22 +321,25 @@
 
     mmvar->num_axis        = mmaster.num_axis;
     mmvar->num_designs     = mmaster.num_designs;
-    mmvar->num_namedstyles = ~0U;                        /* Does not apply */
+    mmvar->num_namedstyles = 0;                           /* Not supported */
     mmvar->axis            = (FT_Var_Axis*)&mmvar[1];
                                       /* Point to axes after MM_Var struct */
     mmvar->namedstyle      = NULL;
 
-    for ( i = 0 ; i < mmaster.num_axis; ++i )
+    for ( i = 0; i < mmaster.num_axis; i++ )
     {
       mmvar->axis[i].name    = mmaster.axis[i].name;
-      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);
-      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);
+      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum );
+      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum );
       mmvar->axis[i].def     = ( mmvar->axis[i].minimum +
                                    mmvar->axis[i].maximum ) / 2;
                             /* Does not apply.  But this value is in range */
       mmvar->axis[i].strid   = ~0U;                      /* Does not apply */
       mmvar->axis[i].tag     = ~0U;                      /* Does not apply */
 
+      if ( !mmvar->axis[i].name )
+        continue;
+
       if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 )
         mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );
       else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 )
@@ -350,7 +354,7 @@
                         axiscoords,
                         blend->num_axis );
 
-      for ( i = 0; i < mmaster.num_axis; ++i )
+      for ( i = 0; i < mmaster.num_axis; i++ )
         mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
                                             axiscoords[i] );
     }
@@ -362,14 +366,16 @@
   }
 
 
-  FT_LOCAL_DEF( FT_Error )
-  T1_Set_MM_Blend( T1_Face    face,
+  static FT_Error
+  t1_set_mm_blend( T1_Face    face,
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
   {
     PS_Blend  blend = face->blend;
     FT_UInt   n, m;
 
+    FT_Bool  have_diff = 0;
+
 
     if ( !blend )
       return FT_THROW( Invalid_Argument );
@@ -401,9 +407,71 @@
 
         result = FT_MulFix( result, factor );
       }
-      blend->weight_vector[n] = result;
+
+      if ( blend->weight_vector[n] != result )
+      {
+        blend->weight_vector[n] = result;
+        have_diff               = 1;
+      }
     }
 
+    /* return value -1 indicates `no change' */
+    return have_diff ? FT_Err_Ok : -1;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    FT_Error  error;
+
+
+    error = t1_set_mm_blend( face, num_coords, coords );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    PS_Blend  blend = face->blend;
+
+    FT_Fixed  axiscoords[4];
+    FT_UInt   i, nc;
+
+
+    if ( !blend )
+      return FT_THROW( Invalid_Argument );
+
+    mm_weights_unmap( blend->weight_vector,
+                      axiscoords,
+                      blend->num_axis );
+
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
+    {
+      FT_TRACE2(( "T1_Get_MM_Blend: only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
+    }
+
+    for ( i = 0; i < nc; i++ )
+      coords[i] = axiscoords[i];
+    for ( ; i < num_coords; i++ )
+      coords[i] = 0x8000;
+
     return FT_Err_Ok;
   }
 
@@ -413,6 +481,7 @@
                     FT_UInt   num_coords,
                     FT_Long*  coords )
   {
+    FT_Error  error;
     PS_Blend  blend = face->blend;
     FT_UInt   n, p;
     FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];
@@ -479,7 +548,28 @@
       final_blends[n] = the_blend;
     }
 
-    return T1_Set_MM_Blend( face, blend->num_axis, final_blends );
+    error = t1_set_mm_blend( face, blend->num_axis, final_blends );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* MM fonts don't have named instances, so only the design is reset */
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Reset_MM_Blend( T1_Face  face,
+                     FT_UInt  instance_index )
+  {
+    FT_UNUSED( instance_index );
+
+    return T1_Set_MM_Blend( face, 0, NULL );
   }
 
 
@@ -500,13 +590,49 @@
      if ( num_coords > T1_MAX_MM_AXIS )
        num_coords = T1_MAX_MM_AXIS;
 
-     for ( i = 0; i < num_coords; ++i )
+     for ( i = 0; i < num_coords; i++ )
        lcoords[i] = FIXED_TO_INT( coords[i] );
 
      return T1_Set_MM_Design( face, num_coords, lcoords );
   }
 
 
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+    PS_Blend  blend = face->blend;
+
+    FT_Fixed  axiscoords[4];
+    FT_UInt   i, nc;
+
+
+    if ( !blend )
+      return FT_THROW( Invalid_Argument );
+
+    mm_weights_unmap( blend->weight_vector,
+                      axiscoords,
+                      blend->num_axis );
+
+    nc = num_coords;
+    if ( num_coords > blend->num_axis )
+    {
+      FT_TRACE2(( "T1_Get_Var_Design:"
+                  " only using first %d of %d coordinates\n",
+                  blend->num_axis, num_coords ));
+      nc = blend->num_axis;
+    }
+
+    for ( i = 0; i < nc; i++ )
+      coords[i] = mm_axis_unmap( &blend->design_map[i], axiscoords[i] );
+    for ( ; i < num_coords; i++ )
+      coords[i] = 0;
+
+    return FT_Err_Ok;
+  }
+
+
   FT_LOCAL_DEF( void )
   T1_Done_Blend( T1_Face  face )
   {
@@ -615,6 +741,15 @@
         goto Exit;
       }
 
+      name = (FT_Byte*)blend->axis_names[n];
+      if ( name )
+      {
+        FT_TRACE0(( "parse_blend_axis_types:"
+                    " overwriting axis name `%s' with `%*.s'\n",
+                    name, len, token->start ));
+        FT_FREE( name );
+      }
+
       if ( FT_ALLOC( blend->axis_names[n], len + 1 ) )
         goto Exit;
 
@@ -787,6 +922,13 @@
         goto Exit;
       }
 
+      if ( map->design_points )
+      {
+        FT_ERROR(( "parse_blend_design_map: duplicate table\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
       /* allocate design map data */
       if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
         goto Exit;
@@ -1107,6 +1249,7 @@
     FT_Int      result;
 
 
+    /* input is scaled by 1000 to accommodate default FontMatrix */
     result = T1_ToFixedArray( parser, 6, temp, 3 );
 
     if ( result < 6 )
@@ -1124,15 +1267,12 @@
       return;
     }
 
-    /* Set Units per EM based on FontMatrix values.  We set the value to */
-    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
-    /* 1000 (in t1_tofixed, from psobjs.c).                              */
-
-    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
-
-    /* we need to scale the values by 1.0/temp_scale */
+    /* atypical case */
     if ( temp_scale != 0x10000L )
     {
+      /* set units per EM based on FontMatrix values */
+      root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
+
       temp[0] = FT_DivFix( temp[0], temp_scale );
       temp[1] = FT_DivFix( temp[1], temp_scale );
       temp[2] = FT_DivFix( temp[2], temp_scale );
@@ -1177,7 +1317,7 @@
     if ( ft_isdigit( *cur ) || *cur == '[' )
     {
       T1_Encoding  encode          = &face->type1.encoding;
-      FT_Int       count, n;
+      FT_Int       count, array_size, n;
       PS_Table     char_table      = &loader->encoding_table;
       FT_Memory    memory          = parser->root.memory;
       FT_Error     error;
@@ -1194,23 +1334,39 @@
       else
         count = (FT_Int)T1_ToInt( parser );
 
+      array_size = count;
+      if ( count > 256 )
+      {
+        FT_TRACE2(( "parse_encoding:"
+                    " only using first 256 encoding array entries\n" ));
+        array_size = 256;
+      }
+
       T1_Skip_Spaces( parser );
       if ( parser->root.cursor >= limit )
         return;
 
+      /* PostScript happily allows overwriting of encoding arrays */
+      if ( encode->char_index )
+      {
+        FT_FREE( encode->char_index );
+        FT_FREE( encode->char_name );
+        T1_Release_Table( char_table );
+      }
+
       /* we use a T1_Table to store our charnames */
-      loader->num_chars = encode->num_chars = count;
-      if ( FT_NEW_ARRAY( encode->char_index, count )     ||
-           FT_NEW_ARRAY( encode->char_name,  count )     ||
+      loader->num_chars = encode->num_chars = array_size;
+      if ( FT_NEW_ARRAY( encode->char_index, array_size )     ||
+           FT_NEW_ARRAY( encode->char_name,  array_size )     ||
            FT_SET_ERROR( psaux->ps_table_funcs->init(
-                           char_table, count, memory ) ) )
+                           char_table, array_size, memory ) ) )
       {
         parser->root.error = error;
         return;
       }
 
       /* We need to `zero' out encoding_table.elements */
-      for ( n = 0; n < count; n++ )
+      for ( n = 0; n < array_size; n++ )
       {
         char*  notdef = (char *)".notdef";
 
@@ -1303,11 +1459,14 @@
 
             len = (FT_UInt)( parser->root.cursor - cur );
 
-            parser->root.error = T1_Add_Table( char_table, charcode,
-                                               cur, len + 1 );
-            if ( parser->root.error )
-              return;
-            char_table->elements[charcode][len] = '\0';
+            if ( n < array_size )
+            {
+              parser->root.error = T1_Add_Table( char_table, charcode,
+                                                 cur, len + 1 );
+              if ( parser->root.error )
+                return;
+              char_table->elements[charcode][len] = '\0';
+            }
 
             n++;
           }
@@ -1370,6 +1529,7 @@
     FT_Memory  memory = parser->root.memory;
     FT_Error   error;
     FT_Int     num_subrs;
+    FT_UInt    count;
 
     PSAux_Service  psaux = (PSAux_Service)face->psaux;
 
@@ -1389,6 +1549,47 @@
     }
 
     num_subrs = (FT_Int)T1_ToInt( parser );
+    if ( num_subrs < 0 )
+    {
+      parser->root.error = FT_THROW( Invalid_File_Format );
+      return;
+    }
+
+    /* we certainly need more than 8 bytes per subroutine */
+    if ( parser->root.limit >= parser->root.cursor                     &&
+         num_subrs > ( parser->root.limit - parser->root.cursor ) >> 3 )
+    {
+      /*
+       * There are two possibilities.  Either the font contains an invalid
+       * value for `num_subrs', or we have a subsetted font where the
+       * subroutine indices are not adjusted, e.g.
+       *
+       *   /Subrs 812 array
+       *     dup 0 { ... } NP
+       *     dup 51 { ... } NP
+       *     dup 681 { ... } NP
+       *   ND
+       *
+       * In both cases, we use a number hash that maps from subr indices to
+       * actual array elements.
+       */
+
+      FT_TRACE0(( "parse_subrs: adjusting number of subroutines"
+                  " (from %d to %d)\n",
+                  num_subrs,
+                  ( parser->root.limit - parser->root.cursor ) >> 3 ));
+      num_subrs = ( parser->root.limit - parser->root.cursor ) >> 3;
+
+      if ( !loader->subrs_hash )
+      {
+        if ( FT_NEW( loader->subrs_hash ) )
+          goto Fail;
+
+        error = ft_hash_num_init( loader->subrs_hash, memory );
+        if ( error )
+          goto Fail;
+      }
+    }
 
     /* position the parser right before the `dup' of the first subr */
     T1_Skip_PS_Token( parser );         /* `array' */
@@ -1409,7 +1610,7 @@
     /*                         */
     /*   `index' + binary data */
     /*                         */
-    for (;;)
+    for ( count = 0; ; count++ )
     {
       FT_Long   idx;
       FT_ULong  size;
@@ -1445,6 +1646,14 @@
         T1_Skip_Spaces  ( parser );
       }
 
+      /* if we use a hash, the subrs index is the key, and a running */
+      /* counter specified for `T1_Add_Table' acts as the value      */
+      if ( loader->subrs_hash )
+      {
+        ft_hash_num_insert( idx, count, loader->subrs_hash, memory );
+        idx = count;
+      }
+
       /* with synthetic fonts it is possible we get here twice */
       if ( loader->num_subrs )
         continue;
@@ -1456,7 +1665,7 @@
       /*                                                         */
       if ( face->type1.private_dict.lenIV >= 0 )
       {
-        FT_Byte*  temp;
+        FT_Byte*  temp = NULL;
 
 
         /* some fonts define empty subr records -- this is not totally */
@@ -1510,7 +1719,7 @@
 
     PSAux_Service  psaux        = (PSAux_Service)face->psaux;
 
-    FT_Byte*       cur;
+    FT_Byte*       cur          = parser->root.cursor;
     FT_Byte*       limit        = parser->root.limit;
     FT_Int         n, num_glyphs;
     FT_Int         notdef_index = 0;
@@ -1524,6 +1733,15 @@
       goto Fail;
     }
 
+    /* we certainly need more than 8 bytes per glyph */
+    if ( num_glyphs > ( limit - cur ) >> 3 )
+    {
+      FT_TRACE0(( "parse_charstrings: adjusting number of glyphs"
+                  " (from %d to %d)\n",
+                  num_glyphs, ( limit - cur ) >> 3 ));
+      num_glyphs = ( limit - cur ) >> 3;
+    }
+
     /* some fonts like Optima-Oblique not only define the /CharStrings */
     /* array but access it also                                        */
     if ( num_glyphs == 0 || parser->root.error )
@@ -1651,7 +1869,7 @@
         if ( face->type1.private_dict.lenIV >= 0 &&
              n < num_glyphs + TABLE_EXTEND       )
         {
-          FT_Byte*  temp;
+          FT_Byte*  temp = NULL;
 
 
           if ( size <= (FT_ULong)face->type1.private_dict.lenIV )
@@ -1679,6 +1897,12 @@
       }
     }
 
+    if ( !n )
+    {
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
     loader->num_glyphs = n;
 
     /* if /.notdef is found but does not occupy index 0, do our magic. */
@@ -2007,7 +2231,7 @@
                 parser->root.error = t1_load_keyword( face,
                                                       loader,
                                                       keyword );
-                if ( parser->root.error != FT_Err_Ok )
+                if ( parser->root.error )
                 {
                   if ( FT_ERR_EQ( parser->root.error, Ignore ) )
                     parser->root.error = FT_Err_Ok;
@@ -2046,18 +2270,7 @@
   {
     FT_UNUSED( face );
 
-    FT_MEM_ZERO( loader, sizeof ( *loader ) );
-    loader->num_glyphs = 0;
-    loader->num_chars  = 0;
-
-    /* initialize the tables -- simply set their `init' field to 0 */
-    loader->encoding_table.init  = 0;
-    loader->charstrings.init     = 0;
-    loader->glyph_names.init     = 0;
-    loader->subrs.init           = 0;
-    loader->swap_table.init      = 0;
-    loader->fontdata             = 0;
-    loader->keywords_encountered = 0;
+    FT_ZERO( loader );
   }
 
 
@@ -2065,6 +2278,7 @@
   t1_done_loader( T1_Loader  loader )
   {
     T1_Parser  parser = &loader->parser;
+    FT_Memory  memory = parser->root.memory;
 
 
     /* finalize tables */
@@ -2074,6 +2288,10 @@
     T1_Release_Table( &loader->swap_table );
     T1_Release_Table( &loader->subrs );
 
+    /* finalize hash */
+    ft_hash_num_free( loader->subrs_hash, memory );
+    FT_FREE( loader->subrs_hash );
+
     /* finalize parser */
     T1_Finalize_Parser( parser );
   }
@@ -2190,11 +2408,15 @@
 
     if ( loader.subrs.init )
     {
-      loader.subrs.init  = 0;
       type1->num_subrs   = loader.num_subrs;
       type1->subrs_block = loader.subrs.block;
       type1->subrs       = loader.subrs.elements;
       type1->subrs_len   = loader.subrs.lengths;
+      type1->subrs_hash  = loader.subrs_hash;
+
+      /* prevent `t1_done_loader' from freeing the propagated data */
+      loader.subrs.init = 0;
+      loader.subrs_hash = NULL;
     }
 
     if ( !IS_INCREMENTAL )
@@ -2271,6 +2493,24 @@
       type1->encoding.num_chars  = loader.num_chars;
     }
 
+    /* some sanitizing to avoid overflows later on; */
+    /* the upper limits are ad-hoc values           */
+    if ( priv->blue_shift > 1000 || priv->blue_shift < 0 )
+    {
+      FT_TRACE2(( "T1_Open_Face:"
+                  " setting unlikely BlueShift value %d to default (7)\n",
+                  priv->blue_shift ));
+      priv->blue_shift = 7;
+    }
+
+    if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 )
+    {
+      FT_TRACE2(( "T1_Open_Face:"
+                  " setting unlikely BlueFuzz value %d to default (1)\n",
+                  priv->blue_fuzz ));
+      priv->blue_fuzz = 1;
+    }
+
   Exit:
     t1_done_loader( &loader );
     return error;
diff --git a/src/type1/t1load.h b/src/type1/t1load.h
index de422e7..03be3f7 100644
--- a/src/type1/t1load.h
+++ b/src/type1/t1load.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (specification).                                  */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1LOAD_H__
-#define __T1LOAD_H__
+#ifndef T1LOAD_H_
+#define T1LOAD_H_
 
 
 #include <ft2build.h>
@@ -46,6 +46,7 @@
 
     FT_Int        num_subrs;
     PS_TableRec   subrs;
+    FT_Hash       subrs_hash;
     FT_Bool       fontdata;
 
     FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
@@ -69,7 +70,7 @@
   T1_Get_Multi_Master( T1_Face           face,
                        FT_Multi_Master*  master );
 
-  FT_LOCAL_DEF( FT_Error )
+  FT_LOCAL( FT_Error )
   T1_Get_MM_Var( T1_Face      face,
                  FT_MM_Var*  *master );
 
@@ -79,11 +80,25 @@
                    FT_Fixed*  coords );
 
   FT_LOCAL( FT_Error )
+  T1_Get_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
   T1_Set_MM_Design( T1_Face   face,
                     FT_UInt   num_coords,
                     FT_Long*  coords );
 
-  FT_LOCAL_DEF( FT_Error )
+  FT_LOCAL( FT_Error )
+  T1_Reset_MM_Blend( T1_Face  face,
+                     FT_UInt  instance_index );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
   T1_Set_Var_Design( T1_Face    face,
                      FT_UInt    num_coords,
                      FT_Fixed*  coords );
@@ -96,7 +111,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1LOAD_H__ */
+#endif /* T1LOAD_H_ */
 
 
 /* END */
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
index af89888..7333c4c 100644
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,7 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_IDS_H
+#include FT_DRIVER_H
 
 #include "t1gload.h"
 #include "t1load.h"
@@ -49,9 +50,6 @@
   /*                                                                       */
   /*                            SIZE FUNCTIONS                             */
   /*                                                                       */
-  /*  note that we store the global hints in the size's "internal" root    */
-  /*  field                                                                */
-  /*                                                                       */
   /*************************************************************************/
 
 
@@ -67,7 +65,7 @@
                             "pshinter" );
     return ( module && pshinter && pshinter->get_globals_funcs )
            ? pshinter->get_globals_funcs( module )
-           : 0 ;
+           : 0;
   }
 
 
@@ -77,16 +75,16 @@
     T1_Size  size = (T1_Size)t1size;
 
 
-    if ( size->root.internal )
+    if ( t1size->internal->module_data )
     {
       PSH_Globals_Funcs  funcs;
 
 
       funcs = T1_Size_Get_Globals_Funcs( size );
       if ( funcs )
-        funcs->destroy( (PSH_Globals)size->root.internal );
+        funcs->destroy( (PSH_Globals)t1size->internal->module_data );
 
-      size->root.internal = NULL;
+      t1size->internal->module_data = NULL;
     }
   }
 
@@ -108,7 +106,7 @@
       error = funcs->create( size->root.face->memory,
                              &face->type1.private_dict, &globals );
       if ( !error )
-        size->root.internal = (FT_Size_Internal)(void*)globals;
+        t1size->internal->module_data = globals;
     }
 
     return error;
@@ -126,7 +124,7 @@
     FT_Request_Metrics( size->root.face, req );
 
     if ( funcs )
-      funcs->set_scale( (PSH_Globals)size->root.internal,
+      funcs->set_scale( (PSH_Globals)t1size->internal->module_data,
                         size->root.metrics.x_scale,
                         size->root.metrics.y_scale,
                         0, 0 );
@@ -247,6 +245,9 @@
     FT_FREE( type1->subrs );
     FT_FREE( type1->subrs_len );
 
+    ft_hash_num_free( type1->subrs_hash, memory );
+    FT_FREE( type1->subrs_hash );
+
     FT_FREE( type1->subrs_block );
     FT_FREE( type1->charstrings_block );
     FT_FREE( type1->glyph_names_block );
@@ -345,7 +346,7 @@
       goto Exit;
 
     /* check the face index */
-    if ( face_index > 0 )
+    if ( ( face_index & 0xFFFF ) > 0 )
     {
       FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
       error = FT_THROW( Invalid_Argument );
@@ -375,14 +376,11 @@
       if ( face->blend )
         root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
 
-      /* XXX: TODO -- add kerning with .afm support */
-
-
       /* The following code to extract the family and the style is very   */
       /* simplistic and might get some things wrong.  For a full-featured */
       /* algorithm you might have a look at the whitepaper given at       */
       /*                                                                  */
-      /*   http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
+      /*   https://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
 
       /* get style name -- be careful, some broken fonts only */
       /* have a `/FontName' dictionary entry!                 */
@@ -558,12 +556,6 @@
 
         if ( clazz )
           error = FT_CMap_New( clazz, NULL, &charmap, NULL );
-
-#if 0
-        /* Select default charmap */
-        if (root->num_charmaps)
-          root->charmap = root->charmaps[0];
-#endif
       }
     }
 
@@ -587,9 +579,42 @@
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  T1_Driver_Init( FT_Module  driver )
+  T1_Driver_Init( FT_Module  module )
   {
-    FT_UNUSED( driver );
+    PS_Driver  driver = (PS_Driver)module;
+
+    FT_UInt32  seed;
+
+
+    /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_HINTING_FREETYPE;
+#else
+    driver->hinting_engine = FT_HINTING_ADOBE;
+#endif
+
+    driver->no_stem_darkening = TRUE;
+
+    driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
+    driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
+    driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
+    driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
+    driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
+    driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
+    driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
+    driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+
+    /* compute random seed from some memory addresses */
+    seed = (FT_UInt32)( (FT_Offset)(char*)&seed          ^
+                        (FT_Offset)(char*)&module        ^
+                        (FT_Offset)(char*)module->memory );
+    seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+    driver->random_seed = (FT_Int32)seed;
+    if ( driver->random_seed < 0 )
+      driver->random_seed = -driver->random_seed;
+    else if ( driver->random_seed == 0 )
+      driver->random_seed = 123456789;
 
     return FT_Err_Ok;
   }
diff --git a/src/type1/t1objs.h b/src/type1/t1objs.h
index 6b4f3cb..8298e03 100644
--- a/src/type1/t1objs.h
+++ b/src/type1/t1objs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1OBJS_H__
-#define __T1OBJS_H__
+#ifndef T1OBJS_H_
+#define T1OBJS_H_
 
 
 #include <ft2build.h>
@@ -120,12 +120,12 @@
     FT_Bool          hint;
     FT_Bool          scaled;
 
-    FT_Int           max_points;
-    FT_Int           max_contours;
-
     FT_Fixed         x_scale;
     FT_Fixed         y_scale;
 
+    FT_Int           max_points;
+    FT_Int           max_contours;
+
   } T1_GlyphSlotRec;
 
 
@@ -154,7 +154,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1OBJS_H__ */
+#endif /* T1OBJS_H_ */
 
 
 /* END */
diff --git a/src/type1/t1parse.c b/src/type1/t1parse.c
index c73b2b2..8e201e5 100644
--- a/src/type1/t1parse.c
+++ b/src/type1/t1parse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (body).                                                */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -334,7 +334,6 @@
       /* first of all, look at the `eexec' keyword */
       FT_Byte*    cur   = parser->base_dict;
       FT_Byte*    limit = cur + parser->base_len;
-      FT_Byte     c;
       FT_Pointer  pos_lf;
       FT_Bool     test_cr;
 
@@ -342,9 +341,9 @@
     Again:
       for (;;)
       {
-        c = cur[0];
-        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */
-                                            /* whitespace + 4 chars        */
+        if ( cur[0] == 'e'   &&
+             cur + 9 < limit )      /* 9 = 5 letters for `eexec' + */
+                                    /* whitespace + 4 chars        */
         {
           if ( cur[1] == 'e' &&
                cur[2] == 'x' &&
@@ -374,8 +373,15 @@
 
       while ( cur < limit )
       {
-        if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
-          goto Found;
+        if ( cur[0] == 'e'   &&
+             cur + 5 < limit )
+        {
+          if ( cur[1] == 'e' &&
+               cur[2] == 'x' &&
+               cur[3] == 'e' &&
+               cur[4] == 'c' )
+            goto Found;
+        }
 
         T1_Skip_PS_Token( parser );
         if ( parser->root.error )
@@ -389,6 +395,15 @@
 
       cur   = limit;
       limit = parser->base_dict + parser->base_len;
+
+      if ( cur >= limit )
+      {
+        FT_ERROR(( "T1_Get_Private_Dict:"
+                   " premature end in private dictionary\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
       goto Again;
 
       /* now determine where to write the _encrypted_ binary private  */
@@ -422,7 +437,7 @@
                 *cur == '\t'               ||
                 (test_cr && *cur == '\r' ) ||
                 *cur == '\n'               ) )
-        ++cur;
+        cur++;
       if ( cur >= limit )
       {
         FT_ERROR(( "T1_Get_Private_Dict:"
diff --git a/src/type1/t1parse.h b/src/type1/t1parse.h
index 93b02e3..4ac82ae 100644
--- a/src/type1/t1parse.h
+++ b/src/type1/t1parse.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (specification).                                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T1PARSE_H__
-#define __T1PARSE_H__
+#ifndef T1PARSE_H_
+#define T1PARSE_H_
 
 
 #include <ft2build.h>
@@ -123,7 +123,7 @@
 
 FT_END_HEADER
 
-#endif /* __T1PARSE_H__ */
+#endif /* T1PARSE_H_ */
 
 
 /* END */
diff --git a/src/type1/t1tokens.h b/src/type1/t1tokens.h
index 3992652..43a65d8 100644
--- a/src/type1/t1tokens.h
+++ b/src/type1/t1tokens.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 tokenizer (specification).                                    */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/type1/type1.c b/src/type1/type1.c
index 4c70ea7..72eff59 100644
--- a/src/type1/type1.c
+++ b/src/type1/type1.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Type 1 driver component (body only).                        */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -17,17 +17,14 @@
 
 
 #define FT_MAKE_OPTION_SINGLE_OBJECT
-
 #include <ft2build.h>
-#include "t1parse.c"
-#include "t1load.c"
-#include "t1objs.c"
+
+#include "t1afm.c"
 #include "t1driver.c"
 #include "t1gload.c"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "t1afm.c"
-#endif
+#include "t1load.c"
+#include "t1objs.c"
+#include "t1parse.c"
 
 
 /* END */
diff --git a/src/type42/Jamfile b/src/type42/Jamfile
index e0db3cc..b98de05 100644
--- a/src/type42/Jamfile
+++ b/src/type42/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/type42 Jamfile
 #
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -16,7 +16,10 @@
 
   if $(FT2_MULTI)
   {
-    _sources = t42objs t42parse t42drivr ;
+    _sources = t42drivr
+               t42objs
+               t42parse
+               ;
   }
   else
   {
diff --git a/src/type42/module.mk b/src/type42/module.mk
index af7e651..3d4732b 100644
--- a/src/type42/module.mk
+++ b/src/type42/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/type42/rules.mk b/src/type42/rules.mk
index 4a8efca..9325d38 100644
--- a/src/type42/rules.mk
+++ b/src/type42/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2015 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/type42/t42drivr.c b/src/type42/t42drivr.c
index 2907096..f579b27 100644
--- a/src/type42/t42drivr.c
+++ b/src/type42/t42drivr.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 42 driver interface (body).                          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -81,7 +81,8 @@
 
 
       if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) )
-        return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
+        return (FT_UInt)ft_strtol( (const char *)face->type1.charstrings[i],
+                                   NULL, 10 );
     }
 
     return 0;
@@ -90,8 +91,8 @@
 
   static const FT_Service_GlyphDictRec  t42_service_glyph_dict =
   {
-    (FT_GlyphDict_GetNameFunc)  t42_get_glyph_name,
-    (FT_GlyphDict_NameIndexFunc)t42_get_name_index
+    (FT_GlyphDict_GetNameFunc)  t42_get_glyph_name,    /* get_name   */
+    (FT_GlyphDict_NameIndexFunc)t42_get_name_index     /* name_index */
   };
 
 
@@ -110,7 +111,7 @@
 
   static const FT_Service_PsFontNameRec  t42_service_ps_font_name =
   {
-    (FT_PsName_GetFunc)t42_get_ps_font_name
+    (FT_PsName_GetFunc)t42_get_ps_font_name   /* get_ps_font_name */
   };
 
 
@@ -161,11 +162,12 @@
 
   static const FT_Service_PsInfoRec  t42_service_ps_info =
   {
-    (PS_GetFontInfoFunc)   t42_ps_get_font_info,
-    (PS_GetFontExtraFunc)  t42_ps_get_font_extra,
-    (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,
-    (PS_GetFontPrivateFunc)t42_ps_get_font_private,
-    (PS_GetFontValueFunc)  NULL             /* not implemented */
+    (PS_GetFontInfoFunc)   t42_ps_get_font_info,    /* ps_get_font_info    */
+    (PS_GetFontExtraFunc)  t42_ps_get_font_extra,   /* ps_get_font_extra   */
+    (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,  /* ps_has_glyph_names  */
+    (PS_GetFontPrivateFunc)t42_ps_get_font_private, /* ps_get_font_private */
+    /* not implemented */
+    (PS_GetFontValueFunc)  NULL                     /* ps_get_font_value   */
   };
 
 
@@ -212,32 +214,32 @@
       0x10000L,
       0x20000L,
 
-      0,    /* format interface */
+      NULL,    /* module-specific interface */
 
-      T42_Driver_Init,
-      T42_Driver_Done,
-      T42_Get_Interface,
+      T42_Driver_Init,          /* FT_Module_Constructor  module_init   */
+      T42_Driver_Done,          /* FT_Module_Destructor   module_done   */
+      T42_Get_Interface,        /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( T42_FaceRec ),
     sizeof ( T42_SizeRec ),
     sizeof ( T42_GlyphSlotRec ),
 
-    T42_Face_Init,
-    T42_Face_Done,
-    T42_Size_Init,
-    T42_Size_Done,
-    T42_GlyphSlot_Init,
-    T42_GlyphSlot_Done,
+    T42_Face_Init,              /* FT_Face_InitFunc  init_face */
+    T42_Face_Done,              /* FT_Face_DoneFunc  done_face */
+    T42_Size_Init,              /* FT_Size_InitFunc  init_size */
+    T42_Size_Done,              /* FT_Size_DoneFunc  done_size */
+    T42_GlyphSlot_Init,         /* FT_Slot_InitFunc  init_slot */
+    T42_GlyphSlot_Done,         /* FT_Slot_DoneFunc  done_slot */
 
-    T42_GlyphSlot_Load,
+    T42_GlyphSlot_Load,         /* FT_Slot_LoadFunc  load_glyph */
 
-    0,                 /* FT_Face_GetKerningFunc  */
-    0,                 /* FT_Face_AttachFunc      */
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
 
-    0,                 /* FT_Face_GetAdvancesFunc */
-    T42_Size_Request,
-    T42_Size_Select
+    T42_Size_Request,           /* FT_Size_RequestFunc  request_size */
+    T42_Size_Select             /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/type42/t42drivr.h b/src/type42/t42drivr.h
index b4d1753..3667f3e 100644
--- a/src/type42/t42drivr.h
+++ b/src/type42/t42drivr.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 42 driver interface (specification).                 */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T42DRIVR_H__
-#define __T42DRIVR_H__
+#ifndef T42DRIVR_H_
+#define T42DRIVR_H_
 
 
 #include <ft2build.h>
@@ -37,7 +37,7 @@
 FT_END_HEADER
 
 
-#endif /* __T42DRIVR_H__ */
+#endif /* T42DRIVR_H_ */
 
 
 /* END */
diff --git a/src/type42/t42error.h b/src/type42/t42error.h
index cddaf9e..e3978a7 100644
--- a/src/type42/t42error.h
+++ b/src/type42/t42error.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 error codes (specification only).                            */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,12 +22,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __T42ERROR_H__
-#define __T42ERROR_H__
+#ifndef T42ERROR_H_
+#define T42ERROR_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  T42_Err_
@@ -35,7 +35,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __T42ERROR_H__ */
+#endif /* T42ERROR_H_ */
 
 
 /* END */
diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c
index 2756adf..66e5c40 100644
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 objects manager (body).                                      */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -208,7 +208,7 @@
       goto Exit;
 
     /* check the face index */
-    if ( face_index > 0 )
+    if ( ( face_index & 0xFFFF ) > 0 )
     {
       FT_ERROR(( "T42_Face_Init: invalid face index\n" ));
       error = FT_THROW( Invalid_Argument );
@@ -231,9 +231,6 @@
     if ( info->is_fixed_pitch )
       root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
 
-    /* We only set this flag if we have the patented bytecode interpreter. */
-    /* There are no known `tricky' Type42 fonts that could be loaded with  */
-    /* the unpatented interpreter.                                         */
 #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
     root->face_flags |= FT_FACE_FLAG_HINTER;
 #endif
@@ -397,12 +394,6 @@
 
         if ( clazz )
           error = FT_CMap_New( clazz, NULL, &charmap, NULL );
-
-#if 0
-        /* Select default charmap */
-        if ( root->num_charmaps )
-          root->charmap = root->charmaps[0];
-#endif
       }
     }
   Exit:
@@ -593,7 +584,7 @@
     FT_Error       error   = FT_Err_Ok;
 
 
-    if ( face->glyph == NULL )
+    if ( !face->glyph )
     {
       /* First glyph slot for this face */
       slot->ttslot = t42face->ttf_face->glyph;
@@ -652,11 +643,17 @@
     FT_Error         error;
     T42_GlyphSlot    t42slot = (T42_GlyphSlot)glyph;
     T42_Size         t42size = (T42_Size)size;
+    T42_Face         t42face = (T42_Face)size->face;
     FT_Driver_Class  ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz;
 
 
     FT_TRACE1(( "T42_GlyphSlot_Load: glyph index %d\n", glyph_index ));
 
+    /* map T42 glyph index to embedded TTF's glyph index */
+    glyph_index = (FT_UInt)ft_strtol(
+                    (const char *)t42face->type1.charstrings[glyph_index],
+                    NULL, 10 );
+
     t42_glyphslot_clear( t42slot->ttslot );
     error = ttclazz->load_glyph( t42slot->ttslot,
                                  t42size->ttsize,
diff --git a/src/type42/t42objs.h b/src/type42/t42objs.h
index 3722c67..3bad513 100644
--- a/src/type42/t42objs.h
+++ b/src/type42/t42objs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 objects manager (specification).                             */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T42OBJS_H__
-#define __T42OBJS_H__
+#ifndef T42OBJS_H_
+#define T42OBJS_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -118,7 +118,7 @@
 FT_END_HEADER
 
 
-#endif /* __T42OBJS_H__ */
+#endif /* T42OBJS_H_ */
 
 
 /* END */
diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c
index 109e996..4813d1f 100644
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font parser (body).                                          */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -246,13 +246,12 @@
     T42_Parser  parser = &loader->parser;
     FT_Matrix*  matrix = &face->type1.font_matrix;
     FT_Vector*  offset = &face->type1.font_offset;
-    FT_Face     root   = (FT_Face)&face->root;
     FT_Fixed    temp[6];
     FT_Fixed    temp_scale;
     FT_Int      result;
 
 
-    result = T1_ToFixedArray( parser, 6, temp, 3 );
+    result = T1_ToFixedArray( parser, 6, temp, 0 );
 
     if ( result < 6 )
     {
@@ -264,18 +263,12 @@
 
     if ( temp_scale == 0 )
     {
-      FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
+      FT_ERROR(( "t42_parse_font_matrix: invalid font matrix\n" ));
       parser->root.error = FT_THROW( Invalid_File_Format );
       return;
     }
 
-    /* Set Units per EM based on FontMatrix values.  We set the value to */
-    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
-    /* 1000 (in t1_tofixed, from psobjs.c).                              */
-
-    root->units_per_EM = (FT_UShort)FT_DivFix( 1000, temp_scale );
-
-    /* we need to scale the values by 1.0/temp_scale */
+    /* atypical case */
     if ( temp_scale != 0x10000L )
     {
       temp[0] = FT_DivFix( temp[0], temp_scale );
@@ -339,10 +332,27 @@
       else
         count = (FT_Int)T1_ToInt( parser );
 
+      /* only composite fonts (which we don't support) */
+      /* can have larger values                        */
+      if ( count > 256 )
+      {
+        FT_ERROR(( "t42_parse_encoding: invalid encoding array size\n" ));
+        parser->root.error = FT_THROW( Invalid_File_Format );
+        return;
+      }
+
       T1_Skip_Spaces( parser );
       if ( parser->root.cursor >= limit )
         return;
 
+      /* PostScript happily allows overwriting of encoding arrays */
+      if ( encode->char_index )
+      {
+        FT_FREE( encode->char_index );
+        FT_FREE( encode->char_name );
+        T1_Release_Table( char_table );
+      }
+
       /* we use a T1_Table to store our charnames */
       loader->num_chars = encode->num_chars = count;
       if ( FT_NEW_ARRAY( encode->char_index, count )     ||
@@ -421,6 +431,13 @@
           {
             charcode = (FT_Int)T1_ToInt( parser );
             T1_Skip_Spaces( parser );
+
+            /* protect against invalid charcode */
+            if ( cur == parser->root.cursor )
+            {
+              parser->root.error = FT_THROW( Unknown_File_Format );
+              return;
+            }
           }
 
           cur = parser->root.cursor;
@@ -455,10 +472,10 @@
             /* immediates-only mode we would get an infinite loop if   */
             /* we don't do anything here.                              */
             /*                                                         */
-            /* This encoding array is not valid according to the type1 */
-            /* specification (it might be an encoding for a CID type1  */
-            /* font, however), so we conclude that this font is NOT a  */
-            /* type1 font.                                             */
+            /* This encoding array is not valid according to the       */
+            /* type42 specification (it might be an encoding for a CID */
+            /* type42 font, however), so we conclude that this font is */
+            /* NOT a type42 font.                                      */
             parser->root.error = FT_THROW( Unknown_File_Format );
             return;
           }
@@ -494,7 +511,7 @@
         face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
 
       else
-        parser->root.error = FT_THROW( Ignore );
+        parser->root.error = FT_ERR( Ignore );
     }
   }
 
@@ -558,6 +575,9 @@
 
     while ( parser->root.cursor < limit )
     {
+      FT_ULong  size;
+
+
       cur = parser->root.cursor;
 
       if ( *cur == ']' )
@@ -620,7 +640,7 @@
 
         string_buf = parser->root.cursor + 1;   /* one space after `RD' */
 
-        if ( (FT_ULong)( limit - parser->root.cursor ) < string_size )
+        if ( (FT_ULong)( limit - parser->root.cursor ) <= string_size )
         {
           FT_ERROR(( "t42_parse_sfnts: too much binary data\n" ));
           error = FT_THROW( Invalid_File_Format );
@@ -649,6 +669,11 @@
         goto Fail;
       }
 
+      /* The whole TTF is now loaded into `string_buf'.  We are */
+      /* checking its contents while copying it to `ttf_data'.  */
+
+      size = (FT_ULong)( limit - parser->root.cursor );
+
       for ( n = 0; n < string_size; n++ )
       {
         switch ( status )
@@ -666,7 +691,7 @@
             status         = BEFORE_TABLE_DIR;
             face->ttf_size = 12 + 16 * num_tables;
 
-            if ( (FT_Long)( limit - parser->root.cursor ) < face->ttf_size )
+            if ( (FT_Long)size < face->ttf_size )
             {
               FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" ));
               error = FT_THROW( Invalid_File_Format );
@@ -697,6 +722,14 @@
 
 
               len = FT_PEEK_ULONG( p );
+              if ( len > size                               ||
+                   face->ttf_size > (FT_Long)( size - len ) )
+              {
+                FT_ERROR(( "t42_parse_sfnts:"
+                           " invalid data in sfnts array\n" ));
+                error = FT_THROW( Invalid_File_Format );
+                goto Fail;
+              }
 
               /* Pad to a 4-byte boundary length */
               face->ttf_size += (FT_Long)( ( len + 3 ) & ~3U );
@@ -704,7 +737,6 @@
 
             status = OTHER_TABLES;
 
-            /* there are no more than 256 tables, so no size check here */
             if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables,
                              face->ttf_size + 1 ) )
               goto Fail;
@@ -778,6 +810,17 @@
         error = FT_THROW( Invalid_File_Format );
         goto Fail;
       }
+
+      /* we certainly need more than 4 bytes per glyph */
+      if ( loader->num_glyphs > ( limit - parser->root.cursor ) >> 2 )
+      {
+        FT_TRACE0(( "t42_parse_charstrings: adjusting number of glyphs"
+                    " (from %d to %d)\n",
+                    loader->num_glyphs,
+                    ( limit - parser->root.cursor ) >> 2 ));
+        loader->num_glyphs = ( limit - parser->root.cursor ) >> 2;
+      }
+
     }
     else if ( *parser->root.cursor == '<' )
     {
@@ -824,6 +867,15 @@
 
     /* initialize tables */
 
+    /* contrary to Type1, we disallow multiple CharStrings arrays */
+    if ( swap_table->init )
+    {
+      FT_ERROR(( "t42_parse_charstrings:"
+                 " only one CharStrings array allowed\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
     error = psaux->ps_table_funcs->init( code_table,
                                          loader->num_glyphs,
                                          memory );
@@ -847,8 +899,13 @@
 
     for (;;)
     {
-      /* The format is simple:                   */
-      /*   `/glyphname' + index [+ def]          */
+      /* We support two formats.                     */
+      /*                                             */
+      /*   `/glyphname' + index [+ `def']            */
+      /*   `(glyphname)' [+ `cvn'] + index [+ `def'] */
+      /*                                             */
+      /* The latter format gets created by the       */
+      /* LilyPond typesetting program.               */
 
       T1_Skip_Spaces( parser );
 
@@ -876,12 +933,13 @@
       if ( parser->root.error )
         return;
 
-      if ( *cur == '/' )
+      if ( *cur == '/' || *cur == '(' )
       {
         FT_UInt  len;
+        FT_Bool  have_literal = FT_BOOL( *cur == '(' );
 
 
-        if ( cur + 2 >= limit )
+        if ( cur + ( have_literal ? 3 : 2 ) >= limit )
         {
           FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
           error = FT_THROW( Invalid_File_Format );
@@ -890,6 +948,8 @@
 
         cur++;                              /* skip `/' */
         len = (FT_UInt)( parser->root.cursor - cur );
+        if ( have_literal )
+          len--;
 
         error = T1_Add_Table( name_table, n, cur, len + 1 );
         if ( error )
@@ -909,6 +969,9 @@
 
         T1_Skip_Spaces( parser );
 
+        if ( have_literal )
+          T1_Skip_PS_Token( parser );
+
         cur = parser->root.cursor;
 
         (void)T1_ToInt( parser );
@@ -1205,7 +1268,7 @@
   {
     FT_UNUSED( face );
 
-    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+    FT_ZERO( loader );
     loader->num_glyphs = 0;
     loader->num_chars  = 0;
 
diff --git a/src/type42/t42parse.h b/src/type42/t42parse.h
index 8ed2fde..f35d23d 100644
--- a/src/type42/t42parse.h
+++ b/src/type42/t42parse.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font parser (specification).                                 */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T42PARSE_H__
-#define __T42PARSE_H__
+#ifndef T42PARSE_H_
+#define T42PARSE_H_
 
 
 #include "t42objs.h"
@@ -85,7 +85,7 @@
 FT_END_HEADER
 
 
-#endif /* __T42PARSE_H__ */
+#endif /* T42PARSE_H_ */
 
 
 /* END */
diff --git a/src/type42/t42types.h b/src/type42/t42types.h
index 01286af..d0aa2de 100644
--- a/src/type42/t42types.h
+++ b/src/type42/t42types.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font data types (specification only).                        */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef __T42TYPES_H__
-#define __T42TYPES_H__
+#ifndef T42TYPES_H_
+#define T42TYPES_H_
 
 
 #include <ft2build.h>
@@ -51,7 +51,7 @@
 
 FT_END_HEADER
 
-#endif /* __T42TYPES_H__ */
+#endif /* T42TYPES_H_ */
 
 
 /* END */
diff --git a/src/type42/type42.c b/src/type42/type42.c
index 3332b7b..6a89cfb 100644
--- a/src/type42/type42.c
+++ b/src/type42/type42.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Type 42 driver component.                                   */
 /*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -15,11 +15,13 @@
 /*                                                                         */
 /***************************************************************************/
 
-#define FT_MAKE_OPTION_SINGLE_OBJECT
 
+#define FT_MAKE_OPTION_SINGLE_OBJECT
 #include <ft2build.h>
+
+#include "t42drivr.c"
 #include "t42objs.c"
 #include "t42parse.c"
-#include "t42drivr.c"
+
 
 /* END */
diff --git a/src/winfonts/Jamfile b/src/winfonts/Jamfile
index 86ee668..4385e3b 100644
--- a/src/winfonts/Jamfile
+++ b/src/winfonts/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 src/winfonts Jamfile
 #
-# Copyright 2001-2015 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/winfonts/fnterrs.h b/src/winfonts/fnterrs.h
index 0bf4d09..3a86af5 100644
--- a/src/winfonts/fnterrs.h
+++ b/src/winfonts/fnterrs.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Win FNT/FON error codes (specification only).                        */
 /*                                                                         */
-/*  Copyright 2001-2015 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,12 +23,12 @@
   /*                                                                       */
   /*************************************************************************/
 
-#ifndef __FNTERRS_H__
-#define __FNTERRS_H__
+#ifndef FNTERRS_H_
+#define FNTERRS_H_
 
 #include FT_MODULE_ERRORS_H
 
-#undef __FTERRORS_H__
+#undef FTERRORS_H_
 
 #undef  FT_ERR_PREFIX
 #define FT_ERR_PREFIX  FNT_Err_
@@ -36,7 +36,7 @@
 
 #include FT_ERRORS_H
 
-#endif /* __FNTERRS_H__ */
+#endif /* FNTERRS_H_ */
 
 
 /* END */
diff --git a/src/winfonts/module.mk b/src/winfonts/module.mk
index 8ba6d75..13f9077 100644
--- a/src/winfonts/module.mk
+++ b/src/winfonts/module.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/winfonts/rules.mk b/src/winfonts/rules.mk
index 4535f54..d694d1a 100644
--- a/src/winfonts/rules.mk
+++ b/src/winfonts/rules.mk
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2015 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/src/winfonts/winfnt.c b/src/winfonts/winfnt.c
index 06f1861..36bd314 100644
--- a/src/winfonts/winfnt.c
+++ b/src/winfonts/winfnt.c
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType font driver for Windows FNT/FON files                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*  Copyright 2003 Huw D M Davies for Codeweavers                          */
 /*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
@@ -269,16 +269,19 @@
 
   static FT_Error
   fnt_face_get_dll_font( FNT_Face  face,
-                         FT_Int    face_index )
+                         FT_Int    face_instance_index )
   {
     FT_Error         error;
     FT_Stream        stream = FT_FACE( face )->stream;
     FT_Memory        memory = FT_FACE( face )->memory;
     WinMZ_HeaderRec  mz_header;
+    FT_Long          face_index;
 
 
     face->font = NULL;
 
+    face_index = FT_ABS( face_instance_index ) & 0xFFFF;
+
     /* does it begin with an MZ header? */
     if ( FT_STREAM_SEEK( 0 )                                      ||
          FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) )
@@ -317,6 +320,21 @@
 
         size_shift = FT_GET_USHORT_LE();
 
+        /* Microsoft's specification of the executable-file header format */
+        /* for `New Executable' (NE) doesn't give a limit for the         */
+        /* alignment shift count; however, in 1985, the year of the       */
+        /* specification release, only 32bit values were supported, thus  */
+        /* anything larger than 16 doesn't make sense in general, given   */
+        /* that file offsets are 16bit values, shifted by the alignment   */
+        /* shift count                                                    */
+        if ( size_shift > 16 )
+        {
+          FT_TRACE2(( "invalid alignment shift count for resource data\n" ));
+          error = FT_THROW( Invalid_File_Format );
+          goto Exit;
+        }
+
+
         for (;;)
         {
           FT_UShort  type_id, count;
@@ -359,13 +377,14 @@
 
         face->root.num_faces = font_count;
 
+        if ( face_instance_index < 0 )
+          goto Exit;
+
         if ( face_index >= font_count )
         {
           error = FT_THROW( Invalid_Argument );
           goto Exit;
         }
-        else if ( face_index < 0 )
-          goto Exit;
 
         if ( FT_NEW( face->font ) )
           goto Exit;
@@ -542,7 +561,7 @@
                   error = fnt_font_load( face->font, stream );
                   if ( error )
                   {
-                    FT_TRACE2(( "font #%lu load error %d\n",
+                    FT_TRACE2(( "font #%lu load error 0x%x\n",
                                 dir_entry2.name, error ));
                     goto Fail;
                   }
@@ -689,13 +708,14 @@
   static FT_Error
   FNT_Face_Init( FT_Stream      stream,
                  FT_Face        fntface,        /* FNT_Face */
-                 FT_Int         face_index,
+                 FT_Int         face_instance_index,
                  FT_Int         num_params,
                  FT_Parameter*  params )
   {
     FNT_Face   face   = (FNT_Face)fntface;
     FT_Error   error;
     FT_Memory  memory = FT_FACE_MEMORY( face );
+    FT_Int     face_index;
 
     FT_UNUSED( num_params );
     FT_UNUSED( params );
@@ -703,9 +723,11 @@
 
     FT_TRACE2(( "Windows FNT driver\n" ));
 
+    face_index = FT_ABS( face_instance_index ) & 0xFFFF;
+
     /* try to load font from a DLL */
-    error = fnt_face_get_dll_font( face, face_index );
-    if ( !error && face_index < 0 )
+    error = fnt_face_get_dll_font( face, face_instance_index );
+    if ( !error && face_instance_index < 0 )
       goto Exit;
 
     if ( FT_ERR_EQ( error, Unknown_File_Format ) )
@@ -726,16 +748,25 @@
 
       if ( !error )
       {
+        if ( face_instance_index < 0 )
+          goto Exit;
+
         if ( face_index > 0 )
           error = FT_THROW( Invalid_Argument );
-        else if ( face_index < 0 )
-          goto Exit;
       }
     }
 
     if ( error )
       goto Fail;
 
+    /* sanity check */
+    if ( !face->font->header.pixel_height )
+    {
+      FT_TRACE2(( "invalid pixel height\n" ));
+      error = FT_THROW( Invalid_File_Format );
+      goto Fail;
+    }
+
     /* we now need to fill the root FT_Face fields */
     /* with relevant information                   */
     {
@@ -828,10 +859,6 @@
                              NULL );
         if ( error )
           goto Fail;
-
-        /* Select default charmap */
-        if ( root->num_charmaps )
-          root->charmap = root->charmaps[0];
       }
 
       /* set up remaining flags */
@@ -969,8 +996,6 @@
     FT_ULong    offset;
     FT_Bool     new_format;
 
-    FT_UNUSED( load_flags );
-
 
     if ( !face )
     {
@@ -1024,46 +1049,9 @@
       goto Exit;
     }
 
-    /* jump to glyph data */
-    p = font->fnt_frame + /* font->header.bits_offset */ + offset;
+    bitmap->rows       = font->header.pixel_height;
+    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
 
-    /* allocate and build bitmap */
-    {
-      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
-      FT_UInt    pitch  = ( bitmap->width + 7 ) >> 3;
-      FT_Byte*   column;
-      FT_Byte*   write;
-
-
-      bitmap->pitch      = (int)pitch;
-      bitmap->rows       = font->header.pixel_height;
-      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
-
-      if ( offset + pitch * bitmap->rows > font->header.file_size )
-      {
-        FT_TRACE2(( "invalid bitmap width\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      /* note: since glyphs are stored in columns and not in rows we */
-      /*       can't use ft_glyphslot_set_bitmap                     */
-      if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) )
-        goto Exit;
-
-      column = (FT_Byte*)bitmap->buffer;
-
-      for ( ; pitch > 0; pitch--, column++ )
-      {
-        FT_Byte*  limit = p + bitmap->rows;
-
-
-        for ( write = column; p < limit; p++, write += bitmap->pitch )
-          *write = *p;
-      }
-    }
-
-    slot->internal->flags = FT_GLYPH_OWN_BITMAP;
     slot->bitmap_left     = 0;
     slot->bitmap_top      = font->header.ascent;
     slot->format          = FT_GLYPH_FORMAT_BITMAP;
@@ -1078,6 +1066,48 @@
     ft_synthesize_vertical_metrics( &slot->metrics,
                                     (FT_Pos)( bitmap->rows << 6 ) );
 
+    if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY )
+      goto Exit;
+
+    /* jump to glyph data */
+    p = font->fnt_frame + /* font->header.bits_offset */ + offset;
+
+    /* allocate and build bitmap */
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+      FT_UInt    pitch  = ( bitmap->width + 7 ) >> 3;
+      FT_Byte*   column;
+      FT_Byte*   write;
+
+
+      bitmap->pitch = (int)pitch;
+      if ( !pitch                                                 ||
+           offset + pitch * bitmap->rows > font->header.file_size )
+      {
+        FT_TRACE2(( "invalid bitmap width\n" ));
+        error = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      /* note: since glyphs are stored in columns and not in rows we */
+      /*       can't use ft_glyphslot_set_bitmap                     */
+      if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, pitch ) )
+        goto Exit;
+
+      column = (FT_Byte*)bitmap->buffer;
+
+      for ( ; pitch > 0; pitch--, column++ )
+      {
+        FT_Byte*  limit = p + bitmap->rows;
+
+
+        for ( write = column; p < limit; p++, write += bitmap->pitch )
+          *write = *p;
+      }
+
+      slot->internal->flags = FT_GLYPH_OWN_BITMAP;
+    }
+
   Exit:
     return error;
   }
@@ -1098,7 +1128,7 @@
 
   static const FT_Service_WinFntRec  winfnt_service_rec =
   {
-    winfnt_get_header
+    winfnt_get_header       /* get_header */
   };
 
  /*
@@ -1138,32 +1168,32 @@
       0x10000L,
       0x20000L,
 
-      0,
+      NULL, /* module-specific interface */
 
-      0,                  /* FT_Module_Constructor */
-      0,                  /* FT_Module_Destructor  */
-      winfnt_get_service
+      NULL,                     /* FT_Module_Constructor  module_init   */
+      NULL,                     /* FT_Module_Destructor   module_done   */
+      winfnt_get_service        /* FT_Module_Requester    get_interface */
     },
 
     sizeof ( FNT_FaceRec ),
     sizeof ( FT_SizeRec ),
     sizeof ( FT_GlyphSlotRec ),
 
-    FNT_Face_Init,
-    FNT_Face_Done,
-    0,                    /* FT_Size_InitFunc */
-    0,                    /* FT_Size_DoneFunc */
-    0,                    /* FT_Slot_InitFunc */
-    0,                    /* FT_Slot_DoneFunc */
+    FNT_Face_Init,              /* FT_Face_InitFunc  init_face */
+    FNT_Face_Done,              /* FT_Face_DoneFunc  done_face */
+    NULL,                       /* FT_Size_InitFunc  init_size */
+    NULL,                       /* FT_Size_DoneFunc  done_size */
+    NULL,                       /* FT_Slot_InitFunc  init_slot */
+    NULL,                       /* FT_Slot_DoneFunc  done_slot */
 
-    FNT_Load_Glyph,
+    FNT_Load_Glyph,             /* FT_Slot_LoadFunc  load_glyph */
 
-    0,                    /* FT_Face_GetKerningFunc  */
-    0,                    /* FT_Face_AttachFunc      */
-    0,                    /* FT_Face_GetAdvancesFunc */
+    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
+    NULL,                       /* FT_Face_AttachFunc       attach_file  */
+    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
 
-    FNT_Size_Request,
-    FNT_Size_Select
+    FNT_Size_Request,           /* FT_Size_RequestFunc  request_size */
+    FNT_Size_Select             /* FT_Size_SelectFunc   select_size  */
   };
 
 
diff --git a/src/winfonts/winfnt.h b/src/winfonts/winfnt.h
index a39d26f..4885c9d 100644
--- a/src/winfonts/winfnt.h
+++ b/src/winfonts/winfnt.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType font driver for Windows FNT/FON files                       */
 /*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
 /*                                                                         */
@@ -17,8 +17,8 @@
 /***************************************************************************/
 
 
-#ifndef __WINFNT_H__
-#define __WINFNT_H__
+#ifndef WINFNT_H_
+#define WINFNT_H_
 
 
 #include <ft2build.h>
@@ -165,7 +165,7 @@
 FT_END_HEADER
 
 
-#endif /* __WINFNT_H__ */
+#endif /* WINFNT_H_ */
 
 
 /* END */
diff --git a/vms_make.com b/vms_make.com
index 73522bf..7b8a49b 100644
--- a/vms_make.com
+++ b/vms_make.com
@@ -1,6 +1,6 @@
-$! make Freetype2 under OpenVMS
+$! make FreeType 2 under OpenVMS
 $!
-$! Copyright 2003-2015 by
+$! Copyright 2003-2018 by
 $! David Turner, Robert Wilhelm, and Werner Lemberg.
 $!
 $! This file is part of the FreeType project, and may only be used, modified,
@@ -10,7 +10,7 @@
 $! fully.
 $!
 $!
-$! External libraries (like Freetype, XPM, etc.) are supported via the
+$! External libraries (like FreeType, XPM, etc.) are supported via the
 $! config file VMSLIB.DAT. Please check the sample file, which is part of this
 $! distribution, for the information you need to provide
 $!
@@ -26,12 +26,12 @@
 $! zinser@zinser.no-ip.info (preferred) or
 $! zinser@sysdev.deutsche-boerse.com (work)
 $!
-$! Make procedure history for Freetype2
+$! Make procedure history for FreeType 2
 $!
 $!------------------------------------------------------------------------------
 $! Version history
 $! 0.01 20040401 First version to receive a number
-$! 0.02 20041030 Add error handling, Freetype 2.1.9
+$! 0.02 20041030 Add error handling, FreeType 2.1.9
 $!
 $ on error then goto err_exit
 $ true  = 1
@@ -128,7 +128,7 @@
 $ write sys$output "Error reading config file vmslib.dat"
 $ goto err_exit
 $FT2_ERR:
-$ write sys$output "Could not locate Freetype 2 include files"
+$ write sys$output "Could not locate FreeType 2 include files"
 $ goto err_exit
 $ERR_EXIT:
 $ set message/facil/ident/sever/text
@@ -356,8 +356,8 @@
 CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base])
 
 OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,\
-     fttype1.obj,ftfntfmt.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\
-     ftbitmap.obj,ftlcdfil.obj,ftgasp.obj
+     fttype1.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\
+     ftbitmap.obj,ftgasp.obj
 
 all : $(OBJS)
         library [--.lib]freetype.olb $(OBJS)
@@ -1070,7 +1070,7 @@
 $   type/out=vmslib.dat sys$input
 !
 ! This is a simple driver file with information used by vms_make.com to
-! check if external libraries (like t1lib and freetype) are available on
+! check if external libraries (like t1lib and FreeType) are available on
 ! the system.
 !
 ! Layout of the file:
@@ -1090,13 +1090,13 @@
 !          might look like. They are site specific and the locations of the
 !          library and include files need almost certainly to be changed.
 !
-! Location: All of the libaries can be found at the following addresses
+! Location: All of the libraries can be found at the following addresses
 !
 !   ZLIB:     http://zinser.no-ip.info/vms/sw/zlib.htmlx
 !
 ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB
 $   write sys$output "New driver file vmslib.dat created."
-$   write sys$output "Please customize libary locations for your site"
+$   write sys$output "Please customize library locations for your site"
 $   write sys$output "and afterwards re-execute ''myproc'"
 $   goto err_exit
 $ endif
@@ -1148,7 +1148,7 @@
 $ write optf libloc , lqual
 $ if (f$trnlnm("topt") .nes. "") then write topt libloc , lqual
 $!
-$! Nasty hack to get the freetype includes to work
+$! Nasty hack to get the FreeType includes to work
 $!
 $ ft2def = false
 $ if ((libname .eqs. "FREETYPE") .and. -